packages feed

weekdaze (empty) → 0.0.0.1

raw patch · 235 files changed

+137807/−0 lines, 235 filesdep +Cabaldep +HDBCdep +HDBC-mysqlsetup-changedbinary-added

Dependencies added: Cabal, HDBC, HDBC-mysql, HDBC-odbc, QuickCheck, array, base, byteable, bytestring, containers, convertible, cryptohash, data-default, deepseq, directory, extra, factory, filepath, hxt, mtl, parallel, random, time, toolshed, unix, weekdaze, xhtml

Files

+ .ghci view
@@ -0,0 +1,1 @@+:set -isrc-lib:src-exe:src-test:dist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h -Wall -fno-warn-tabs
+ LICENSE view
@@ -0,0 +1,675 @@+                    GNU GENERAL PUBLIC LICENSE+                       Version 3, 29 June 2007++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>+ 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 <http://www.gnu.org/licenses/>.++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:++    <program>  Copyright (C) <year>  <name of author>+    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+<http://www.gnu.org/licenses/>.++  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+<http://www.gnu.org/philosophy/why-not-lgpl.html>.+
+ README.markdown view
@@ -0,0 +1,58 @@+# **WeekDaze**++[![Build Status](https://travis-ci.org/functionalley/WeekDaze.svg?branch=master)](https://travis-ci.org/functionalley/WeekDaze)+[![Hackage](https://img.shields.io/hackage/v/weekdaze.svg)](https://hackage.haskell.org/package/weekdaze)+[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)+[![Haskell](https://b.repl.ca/v1/language-haskell-yellow.png)](https://haskell.org)++This is "**WeekDaze**", an application which searches for solutions to the [school-timetable](https://en.wikipedia.org/wiki/School_timetable) problem.++It can read problem-specifications either from a relational database or from an **XML**-file.++## Installation++* It can be built and installed using [Cabal](https://www.haskell.org/cabal/users-guide/installing-packages.html).+* Configuration can be read by either from a local [XML](https://en.wikipedia.org/wiki/XML)-file using the Haskell package [hxt](https://hackage.haskell.org/package/hxt),+	or by establishing database-connectivity using one or more of the database-backend Haskell packages "[HDBC-odbc](https://hackage.haskell.org/package/HDBC-odbc)" & "[HDBC-mysql](https://hackage.haskell.org/package/HDBC-mysql)", & this affects how the product should be built.+* In order to connect to an arbitrary type of [RDBMS](https://en.wikipedia.org/wiki/Relational_database_management_system), **HDBC-odbc** should be installed,+	but when connecting specifically to [MySQL](https://www.mysql.com/), one can alternatively install **HDBC-mysql** (which is slower).+* Before building these database-backend Haskell packages on GNU/Linux the following prerequisites must be observed:+	+ **HDBC-odbc**:	requires the development version of the package "[unixODBC](https://www.unixodbc.org/)".+	+ **HDBC-mysql**:	requires either "**libmariadb-devel**" or the development version of the package "**libmysqlclient**".+		CAVEAT: **HDBC-mysql-0.6.6.1** is rather picky about the versions of other Haskell packages.+* Before using ODBC to establish database-connectivity:+	+ An appropriate driver for the type of RDBMS, e.g. [MyODBC-unixODBC](https://en.wikipedia.org/wiki/MySQL_Connector/ODBC) for **MySQL**, must be installed.+	+ A system-wide configuration-file "**odbcinst.ini**" must be created to define the above database-driver,+		& a configuration-file "**.odbc.ini**" must be created to define the available [DSN](https://en.wikipedia.org/wiki/Data_source_name)s.+		These files are described for a various types of DBMS in [odbcinst](https://www.unixodbc.org/odbcinst.html) & for **MySQL** in [MySQL Connector/ODBC](https://dev.mysql.com/doc/connector-odbc/en/) (examples for the latter case are included in this package).+* An initial **MySQL**-database can be constructed using the packaged SQL-files.++## Documentation++The documentation is in "**man/**".++## Examples++The directory "**xml/**" contains example-configurations and the directory "**xhtml/**" contains the corresponding solutions.+The packaged SQL-files contain the same example-configurations.++## License++For information on copying and distributing this package, see the file "**LICENSE**" in this directory.++## Bug-reporting++Bug-reports should be emailed to <weekdaze@functionalley.com>.++## Testing++The test-suite can be run using:++    cabal configure --enable-tests;+    cabal build;+    cabal test --show-details=always;++## Author++This application is written and maintained by Dr. Alistair Ward.+
+ Setup.hs view
@@ -0,0 +1,5 @@+#!/usr/bin/env runhaskell++import qualified Distribution.Simple++main = Distribution.Simple.defaultMain
+ changelog.Debian view
@@ -0,0 +1,6 @@+weekdaze (0.0.0.1-1) experimental; urgency=low++  * New release.++ -- Alistair Ward <weekdaze@functionalley.com>  Thu, 04 Jul 2013 00:00:00 +0000+
+ changelog.markdown view
@@ -0,0 +1,3 @@+# 2013-07-04 Dr. Alistair Ward <weekdaze@functionalley.com>++## 0.0.0.1
@@ -0,0 +1,11 @@+Author:+	Dr. Alistair Ward <weekdaze@functionalley.com>.++Copyright:+	Copyright (C) 2013-2015 Dr. Alistair Ward. All Rights Reserved.++Home-page:+	https://functionalley.com/WeekDaze/weekdaze.html++License:+	GNU GENERAL PUBLIC LICENSE Version 3; see '/usr/share/common-licenses/GPL-3' or '/usr/share/doc/licenses/gpl-3.0.txt' where available, or the local packaged file 'LICENSE'.
+ css/weekdaze.css view
@@ -0,0 +1,422 @@+/*+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.	If not, see <http://www.gnu.org/licenses/>.+*/++body {+	background-color:	white;+	background-image:	url('../images/background.png');+	color:			black;+	font-family:		sans-serif;+	margin:			4px;+}++caption {+	font-weight:		bold;+}++h1 {+	text-align:		center;+}++h2 {+	font-family:		Helvetica;+	text-align:		center;+	text-decoration:	underline;+}++table {+	background-color:	white;	/* Account for lack of 'rgba' */+	background-color:	rgba(255, 255, 255, 0.5);	/* Allow the background to bleed through */+	border-spacing:		1px;+	border-style:		outset;+	border-width:		4px;+	box-shadow:		4px 4px 3px #888888;	/* Account for lack of 'rgba' */+	box-shadow:		4px 4px 3px rgba(0, 0, 0, 0.25);+}++td {+	background-color:	#eee;+	border-style:		inset;+	border-width:		1px;+	padding:		1px;+	vertical-align:		top;	/* position synchronisationId banner */+/*+	height:			120px;+	position:		relative;+*/++}++th {+	background-color:	#888;	/* Account for lack of 'rgba' */+	background-color:	rgba(192, 192, 192, 0.25);	/* Allow the background to bleed through */+	border-style:		inset;+	border-width:		1px;+	padding:		1px;+}++.box {+	background-color:	white;	/* Account for lack of 'rgba' */+	background-color:	rgba(255, 255, 255, 0.25);+	border:			2px solid black;+	border-radius:		16px;+	box-shadow:		6px 6px 4px #888888;	/* Account for lack of 'rgba' */+	box-shadow:		6px 6px 4px rgba(0, 0, 0, 0.5);+	clear:			both;+	margin:			8px 1px;+	padding:		4px;+}++.campus {+	color:			#040;+}++.campus:before {+	content:		open-quote;+}++.campus:after {+	content:		close-quote ":";+	padding-right:		0.5em;+}++.data {+	font-family:		monospace, sans-serif;+	font-weight:		bold;+}++.groupId {+	font-family:		sans-serif;+	font-style:		italic;+	font-weight:		bold;+}++.info {+	color:			#656;	/* Must contrast with both background-image & background of ConsoleOutput */+}++.lesson {+/*+	position:		absolute;+	top:			20px;+*/+}++.level {+}++.locationId {+	font-style:		italic;+}++.locationId:before {+	content:		open-quote;+}++.locationId:after {+	content:		close-quote;+}++.meeting {+}++.meetings {+	background-color:	#bbb;+	background-image:	url('../images/silhouettes.png');+}++.numericData {+	font-family:		monospace, sans-serif;+	font-weight:		bold;+	text-align:		right;+	vertical-align:		inherit;+}++.origin {+	background-color:	#222;+	background-image:	url('../images/origin.png');+	background-repeat:	no-repeat;+	background-position:	center;+	padding:		0;+	border-width:		0;+}++.observerSummary {+	clear:			both;	/* If ProblemParameters.getTimeslotIdBounds is narrow, then the previous floating Observer-summary may dangle beneath, forcing this one to its right */+	float:			left;	/* Given suffient width, horizontally align each observer's summary with their timetable for one week */+	width:			400px;	/* Allow the timetableForWeeks, positioned to the right, to align vertically */+}++.observerViewTerminator {+	clear:	both;		/* Ensure that the observer-summary doesn't overflow the box in which it's contained when the timetable-for-week is abnormally short */+}++.resourceIds {+}++.runtimeInformation {+	color:			black;+}++.showHideButton {+	background-color:	rgba(255, 255, 255, 0.5);	/* Allow the background to bleed through */+	border-width:		3px;+	color:			green;+	float:			right;+	font-size:		large;+	width:			64px;	/* prevents resize if text is replaced */+}++.studentBody {+	font-family:		Arial Narrow, sans-serif;+	font-style:		italic;+}++.studentBody:before {+	content:		open-quote;+}++.studentBody:after {+	content:		close-quote;+}++.studentClass {+}++.subject {+	font-family:		sans-serif;+	font-weight:		bold;+}++.synchronisationId {+	background-color:	white;+	font-family:		sans-serif;+	font-weight:		bold;+	opacity:		0.6;	/* If it lacks sufficient transparency, it won't blend with the underlying colour of the lesson */+	text-align:		center;+/*+	position:		absolute;+	top:			0;+	left:			0;+	right:			0;+*/+}++.teacherId {+	font-style:		italic;+}++.teacherId:before {+	content:		open-quote;+}++.teacherId:after {+	content:		close-quote;+}++.timeslotId {+	color:			#333300;+/*	height:			100px;	*/+}++.timetableForWeek {+	width:			1100px;	/* Potentially inadequate for wider TeacherViewLessons & LocationViewLessons, but it renders faster & looks better. */+	margin:			auto;+	margin-bottom:		1em;+	overflow:		auto;+}++.timetableView {+	overflow:		auto;+}++.topic {+}++.unallocatedTimeslot {+	background-color:	#ccc;+	background-image:	url('../images/stars.png');+	color:			#888;+	font-style:		italic;+	font-size:		large;+	text-align:		center;+	vertical-align:		inherit;+}++.unavailable {+	background-color:	#ddd;+	background-image:	url('../images/diagonalStripes.png');+	color:			#888;+	font-style:		italic;+	font-size:		x-large;+	text-align:		center;+	vertical-align:		inherit;+}++.warning {+	color:			#b00;+}++.weekend {+	color:			#660000;+}++.workDay {+	color:			#333300;+	width:			16%;	/* Appropriate for either five or six working-days */+}++#bestDeterministicWeightedTimetableCriteria > th {+	text-align:		right;+}++#commandLine {+	font-family:		monospace;+}++#consoleOutput {+	border-style:		inset;+	border-width:		2px;+	background-color:	black;+	color:			green;+	overflow:		auto;+}++#evolutionStrategyStatisticsTable {+	margin:			4px;+}++#initialLessonCriterionStatisticsTable {+	margin:			4px;+}++#selectedRaster {+	color:			#800;+}++#studentViewTimetable {+/*	overflow:		auto;	*/+}++#timetableCriteriaWeights > th {+	text-align:		right;+}++#weightedMeanOfTimetableCriteriaByTraversalOrderTable {+	float:			left;+	margin-bottom:		4px;+	margin-left:		4px;+	margin-right:		4px;+}++td.topic_Art {+	background-color:	#660066;+}++td.topic_Arithmetic {+	background-color:	#336600;+}++td.topic_Biology {+	background-color:	lightPink;+	background-image:	url('../images/biohazardSymbol.png');+}++td.topic_Chinese {+	background-color:	#ff4444;+	background-image:	url('../images/flagOfPeoplesRepublicOfChina.png');+}++td.topic_Chemistry {+	background-color:	#76933d;+	background-image:	url('../images/periodicTable.png');+}++td.topic_DomesticScience {+	background-color:	#45280b;+}++td.topic_English {+	background-color:	White;+	background-image:	url('../images/flagOfEngland.png');+}++td.topic_French {+/*	background-color:	#0055a4;	*/+	background-image:	url('../images/flagOfFrance.png');+}++td.topic_Games {+	background-color:	#1f6621;+}++td.topic_Geography {+	background-color:	#76b9b9;+	background-image:	url('../images/worldMap.png');+}++td.topic_German {+/*	background-color:	#ffcc00;	*/+	background-image:	url('../images/flagOfGermany.png');+}++td.topic_History {+	background-color:	#ddff00;+}++td.topic_InformationTechnology {+	background-color:	#99ccff;+}++td.topic_Maths {+	background-color:	#6f2c2c;+}++td.topic_Music {+	background-color:	#3f48a3;+	background-image:	url('../images/clefs.png');+}++td.topic_PhysicalEducation {+	background-color:	#0044ff;+}++td.topic_Physics {+	background-color:	#b6a327;+	background-image:	url('../images/atom.png');+}++td.topic_ReligiousEducation {+	background-color:	#482b65;+	background-image:	url('../images/religiousSymbols.png');+}++td.topic_Swimming {+	background-color:	#3f8a7f;+	background-image:	url('../images/water.png');+}++td.topic_TechnicalDrawing {+	background-color:	#36593b;+}++td.topic_Woodwork {+	background-color:	#a29d7a;+}
+ debian/DEBIAN/control view
@@ -0,0 +1,12 @@+Package:	weekdaze+Version:	0.0.0.1-1+Section:	utils+Priority:	optional+Architecture:	amd64+Depends:	libc6+Installed-size:	17138+Maintainer:	Dr. Alistair Ward <weekdaze@functionalley.com>+Provides:+Homepage:	https://functionalley.com/WeekDaze/weekdaze.html+Description:	Attempts to find a timetable satisfying the configured requirements.+
+ dtd/locationViewTimetable.dtd view
@@ -0,0 +1,46 @@+<?xml version="1.0" encoding="UTF-8"?>+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2013 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-->+<!ELEMENT timetable (observerIdToTimetableAssociation)+>	<!-- The single root of the configuration -->+	<!ELEMENT observerIdToTimetableAssociation (observerId, timetableForWeek)>	<!-- Each observer has their own timetable, covering one week -->+		<!ELEMENT observerId EMPTY >+			<!ATTLIST observerId locationId ID #REQUIRED >	<!-- Defines which timetable for one week, this is -->+		<!ELEMENT timetableForWeek (dayToTimetableAssociation)+>+			<!ELEMENT dayToTimetableAssociation (day, timetableForDay)>+				<!ELEMENT day EMPTY>+					<!ATTLIST day value (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday) #REQUIRED>	<!-- A day within any week; there's no concept of different months or years -->+				<!ELEMENT timetableForDay (booking)+>+					<!ELEMENT booking (lesson)?>	<!-- A rendezvous defined in the timetable, by a "lesson" @ a specific "time" -->+						<!ATTLIST booking timeslotId CDATA #REQUIRED>+						<!ELEMENT lesson (locationViewLessonResourceIds, subject)>	<!-- An arrangement between a "teacher" & a "student-class", to teach a specific "course", @ a "location" -->+							<!ELEMENT locationViewLessonResourceIds (studentClass)>+								<!ATTLIST locationViewLessonResourceIds teacherId CDATA #REQUIRED>+								<!ELEMENT studentClass (studentBody)+>+									<!ELEMENT studentBody (student)+>	<!-- A set of "student"s with identical profiles; i.e. identical availability, skills & requirements -->+										<!ATTLIST studentBody mnemonic CDATA #REQUIRED>+										<!ELEMENT student EMPTY>+											<!ATTLIST student studentId CDATA #REQUIRED>+							<!ELEMENT subject EMPTY>	<!-- A subject offered by a "teacher" & potentially required by "student"s -->+								<!ATTLIST subject+									topic	CDATA	#REQUIRED+									level	CDATA	#REQUIRED+								>+
+ dtd/studentViewTimetable.dtd view
@@ -0,0 +1,47 @@+<?xml version="1.0" encoding="UTF-8"?>+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2013 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-->+<!ELEMENT timetable (observerIdToTimetableAssociation)+>	<!-- The single root of the configuration -->+	<!ELEMENT observerIdToTimetableAssociation (observerId, timetableForWeek)>	<!-- Each observer has their own timetable, covering one week -->+		<!ELEMENT observerId (studentBody)>	<!-- Defines whose timetable for one week, this is -->+			<!ELEMENT studentBody (student)+>	<!-- A set of "student"s with identical profiles; i.e. identical availability, skills & requirements -->+				<!ATTLIST studentBody mnemonic ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters) identifying the student-body -->+				<!ELEMENT student EMPTY>+					<!ATTLIST student studentId ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters) identifying a member of the "studentBody" -->+			<!ELEMENT timetableForWeek (dayToTimetableAssociation)+>+				<!ELEMENT dayToTimetableAssociation (day, timetableForDay)>+					<!ELEMENT day EMPTY>+						<!ATTLIST day value (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday) #REQUIRED>	<!-- A day within any week; there's no concept of different months or years -->+					<!ELEMENT timetableForDay (booking)+> +						<!ELEMENT booking (lesson)?>	<!-- A rendezvous defined in the timetable, by a "lesson" @ a specific "time" -->+							<!ATTLIST booking timeslotId CDATA #REQUIRED>+							<!ELEMENT lesson (studentViewLessonResourceIds, subject)>	<!-- An arrangement between a "teacher" & a "student-class", to teach a specific "course", @ a "location" -->+								<!ELEMENT studentViewLessonResourceIds EMPTY>+									<!ATTLIST studentViewLessonResourceIds+										locationId	CDATA	#REQUIRED+										teacherId	CDATA	#REQUIRED+									>+								<!ELEMENT subject EMPTY>	<!-- A subject offered by a "teacher" & potentially required by "student"s -->+									<!ATTLIST subject+										level	CDATA	#REQUIRED+										topic	CDATA	#REQUIRED+									>+
+ dtd/teacherViewTimetable.dtd view
@@ -0,0 +1,46 @@+<?xml version="1.0" encoding="UTF-8"?>+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2013 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-->+<!ELEMENT timetable (observerIdToTimetableAssociation)+>	<!-- The single root of the configuration -->+	<!ELEMENT observerIdToTimetableAssociation (observerId, timetableForWeek)>	<!-- Each observer has their own timetable, covering one week -->+		<!ELEMENT observerId EMPTY >+			<!ATTLIST observerId teacherId ID #REQUIRED >	<!-- Defines whose timetable for one week, this is -->+		<!ELEMENT timetableForWeek (dayToTimetableAssociation)+>+			<!ELEMENT dayToTimetableAssociation (day, timetableForDay)>+				<!ELEMENT day EMPTY>+					<!ATTLIST day value (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday) #REQUIRED>	<!-- A day within any week; there's no concept of different months or years -->+				<!ELEMENT timetableForDay (booking)+>+					<!ELEMENT booking (lesson)?>	<!-- A rendezvous defined in the timetable, by a "lesson" @ a specific "time" -->+						<!ATTLIST booking timeslotId CDATA #REQUIRED>+						<!ELEMENT lesson (teacherViewLessonResourceIds, subject)>	<!-- An arrangement between a "teacher" & a "student-class", to teach a specific "course", @ a "location" -->+							<!ELEMENT teacherViewLessonResourceIds (studentClass)>+								<!ATTLIST teacherViewLessonResourceIds locationId CDATA #REQUIRED>+								<!ELEMENT studentClass (studentBody)+>+									<!ELEMENT studentBody (student)+>	<!-- A set of "student"s with identical profiles; i.e. identical availability, skills & requirements -->+										<!ATTLIST studentBody mnemonic CDATA #REQUIRED>+										<!ELEMENT student EMPTY>+											<!ATTLIST student studentId CDATA #REQUIRED>+							<!ELEMENT subject EMPTY>	<!-- A subject offered by a "teacher" & potentially required by "student"s -->+								<!ATTLIST subject+									topic	CDATA	#REQUIRED+									level	CDATA	#REQUIRED+								>+
+ dtd/weekdaze.dtd view
@@ -0,0 +1,322 @@+<?xml version="1.0" encoding="UTF-8"?>+<!--+	AUTHOR: Dr. Alistair Ward++	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-->+<!ELEMENT options ((configVersion)?, (executionOptions)?, (outputOptions)?, problemParameters)>	<!-- The single root of the configuration -->+	<!ELEMENT configVersion (versionElement)+>	<!-- The version of this structure -->+		<!ELEMENT versionElement EMPTY>	<!-- The ordered version-numbers, from major to minor -->+			<!ATTLIST versionElement integer CDATA #REQUIRED>	<!-- One integral part of the version-number -->+	<!ELEMENT executionOptions ((evolutionStrategies)?, (traversalOrder | inputStudentViewTimetable)?, (optimiseLessonCriteriaWeights)?, lessonCriteriaWeights, timetableCriteriaWeights)>	<!-- Configures the solution-algorithm -->+		<!ATTLIST executionOptions+			randomSeed				CDATA		#IMPLIED+			permitTemporaryStudentBodyMerger	(False | True)	#IMPLIED+			reduceStudentBodyRegister		(False | True)	#IMPLIED+			removeRedundantCourses			(False | True)	#IMPLIED+			removePointlessGroups			(False | True)	#IMPLIED+			removeUnsubscribedGroups		(False | True)	#IMPLIED+			zeroInappropriateOptions		(False | True)	#IMPLIED+		>+		<!ELEMENT evolutionStrategies (synchronisedCourseMutation, synchronisedCourseByDayMutation, excessRunlengthMutation, homogeneousStudentViewLessonMutation, incompleteCourseMutation, randomLessonMutation, singletonStudentClassMutation, splitSessionMutation, studentBodyCombinationMutation, studentViewTimetableForDayMutation, studentViewTimetableForWeekMutation, synchronousLessonMutation)>	<!-- The mutation of each candidate solution involves partially depleting & then reconstructing the current solution, using a sequence of strategies -->+			<!ATTLIST evolutionStrategies+				randomLessonMutationNTrials			CDATA	#IMPLIED+				randomLessonMutationNTimeslots			CDATA	#IMPLIED+				studentViewTimetableForDayMutationNDays		CDATA	#IMPLIED+				studentViewTimetableForWeekMutationNTrials	CDATA	#IMPLIED+				studentViewTimetableForWeekMutationNTimeslots	CDATA	#IMPLIED+				fecundityDecayRatio				CDATA	#IMPLIED+				minimumPopulationDiversityRatio			CDATA	#IMPLIED+				nInitialScouts					CDATA	#IMPLIED+			>+			<!ELEMENT synchronisedCourseByDayMutation (timetableBreederFecundity)?>+			<!ELEMENT synchronisedCourseMutation (timetableBreederFecundity)?>+			<!ELEMENT excessRunlengthMutation (timetableBreederFecundity)?>+			<!ELEMENT homogeneousStudentViewLessonMutation (timetableBreederFecundity)?>+			<!ELEMENT incompleteCourseMutation (timetableBreederFecundity)?>+			<!ELEMENT randomLessonMutation (timetableBreederFecundity)?>+			<!ELEMENT singletonStudentClassMutation (timetableBreederFecundity)?>+			<!ELEMENT splitSessionMutation (timetableBreederFecundity)?>+			<!ELEMENT studentBodyCombinationMutation (timetableBreederFecundity)?>+			<!ELEMENT studentViewTimetableForDayMutation (timetableBreederFecundity)?>+			<!ELEMENT studentViewTimetableForWeekMutation (timetableBreederFecundity)?>+			<!ELEMENT synchronousLessonMutation (timetableBreederFecundity)?>+				<!ELEMENT timetableBreederFecundity EMPTY>	<!-- The fecundity of the breeding-program, as required after depleting the timetable, by either of two re-construction algorithms -->+					<!ATTLIST timetableBreederFecundity+						deterministicConstructorFecundity	CDATA	#IMPLIED+						randomConstructorFecundity		CDATA	#IMPLIED+					>+		<!ELEMENT traversalOrder (x, y, z)>	<!-- To construct an initial solution, the three-dimensions of the timetable are traversed in a raster-scan, sequentially booking lessons. This raster can be constructed using any of the permutations of "axis"-order & "sense" of travel along each. The default is to evaluate all, & select the best -->+			<!ELEMENT x (timetableAxisTraversal)>	<!-- The "axis" whose coordinates change slowest in the raster -->+			<!ELEMENT y (timetableAxisTraversal)>+			<!ELEMENT z (timetableAxisTraversal)>	<!-- The "axis" whose coordinates change fastest in the raster -->+				<!ELEMENT timetableAxisTraversal EMPTY>	<!-- Defining a straight traverse through the timetable -->+					<!ATTLIST timetableAxisTraversal+						sense	(False | True)			#IMPLIED+						axis	(ObserverId | Day | TimeslotId)	#REQUIRED+					>+		<!ELEMENT inputStudentViewTimetable EMPTY>+			<!ATTLIST inputStudentViewTimetable filePath CDATA #REQUIRED>+		<!ELEMENT lessonCriteriaWeights EMPTY>	<!-- The solution-algorithm initially determines the set of all possible lessons, which may be booked @ a specific time-slot, then selects the best according to a weighted mean of various criteria -->+			<!ATTLIST lessonCriteriaWeights+				areResourcesReused				CDATA	#IMPLIED+				greatestMinimumConsecutiveLessons		CDATA	#IMPLIED+				greatestRemainingCourseLessons			CDATA	#IMPLIED+				greatestSynchronisedCourseSetSize		CDATA	#IMPLIED+				isCoreKnowledgeRequirement			CDATA	#IMPLIED+				isSpecialistInTopic				CDATA	#IMPLIED+				matchCourseClassSizeToLocationCapacity		CDATA	#IMPLIED+				maximiseRelativeFacilityUtilisation		CDATA	#IMPLIED+				maximiseStudentClassSizeOverCourseClassSize	CDATA	#IMPLIED+				maximiseStudentClassSizeOverLocationCapacity	CDATA	#IMPLIED+				minimiseBookingAtAnotherCoursesSpecifiedTime	CDATA	#IMPLIED+				minimiseBookingOfLocationByOtherTeachers	CDATA	#IMPLIED+				minimiseDeviationFromTimeslotRequest		CDATA	#IMPLIED+				minimiseInterCampusMigrationsOfStudents		CDATA	#IMPLIED+				minimiseInterCampusMigrationsOfTeachers		CDATA	#IMPLIED+				minimiseStudentBodyCombinations			CDATA	#IMPLIED+				minimiseTeachersLocusOperandi			CDATA	#IMPLIED+				minimiseWasteOfScarceFacilities			CDATA	#IMPLIED+			> <!-- One can vary each weight within the closed unit-interval [0,1], which @ the lower bound permits the associated criterion to be disregarded -->+		<!ELEMENT timetableCriteriaWeights EMPTY>	<!-- Using the current timetable, the sequence of "evolutionStrategies" are used to breed a population of alternative candidate solutions, from which the best according to a weighted mean over various criteria, are selected -->+			<!ATTLIST timetableCriteriaWeights+				maximiseComplianceWithFreePeriodPreferences			CDATA	#IMPLIED+				maximiseMeanRatioOfStudentClassSizeToLocationCapacity		CDATA	#IMPLIED+				maximiseMeanStudentClassSize					CDATA	#IMPLIED+				maximiseSynchronisationOfSynchronisedCourses			CDATA	#IMPLIED+				maximiseWeightedMeanStudentBodyUtilisationRatio			CDATA	#IMPLIED+				minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	CDATA	#IMPLIED+				minimiseDispersionOfStudentFreePeriodsPerDay			CDATA	#IMPLIED+				minimiseDispersionOfTeacherFreePeriodsPerDay			CDATA	#IMPLIED+				minimiseDispersionOfTeacherWorkload				CDATA	#IMPLIED+				minimiseMeanInterCampusMigrationsOfStudents			CDATA	#IMPLIED+				minimiseMeanInterCampusMigrationsOfTeachers			CDATA	#IMPLIED+				minimiseMeanLocationChangesOfTeachers				CDATA	#IMPLIED+				minimiseMeanLocusOperandiOfTeachers				CDATA	#IMPLIED+				minimiseMeanRatioOfIncompletelyBookedCoreKnowledge		CDATA	#IMPLIED+				minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge		CDATA	#IMPLIED+				minimiseMeanStudentBodyCombinationsPerLesson			CDATA	#IMPLIED+				minimiseRatioOfConsecutiveEqualLessons				CDATA	#IMPLIED+				minimiseRatioOfSeparatedEqualLessonsWithinAnyDay		CDATA	#IMPLIED+			> <!-- One can vary each weight within the closed unit-interval [0,1], which @ the lower bound permits the associated criterion to be disregarded -->+		<!ELEMENT optimiseLessonCriteriaWeights EMPTY>	<!-- Using the current timetable, the sequence of "evolutionStrategies" are used to breed a population of alternative candidate solutions, from which the best according to a weighted mean over various criteria, are selected -->+			<!ATTLIST optimiseLessonCriteriaWeights+				nTrials			CDATA		#IMPLIED+				changeMagnitude		CDATA		#IMPLIED+				reductionFactor		CDATA		#IMPLIED+				useMeanOverRasterScans	(False | True)	#IMPLIED+			>+	<!ELEMENT outputOptions (fileFormats)?>	<!-- Defines the presentation of the solution -->+		<!ATTLIST outputOptions+			nDecimalDigits			CDATA					#IMPLIED+			outputConfigFilePath		CDATA					#IMPLIED+			studentBodyMnemonicSeparator	CDATA					#IMPLIED+			verbosity			(Silent | Normal | Verbose | Deafening)	#IMPLIED+		>+		<!ELEMENT fileFormats (fileFormat)+ >+			<!ELEMENT fileFormat (xhtml | xml)?>	<!-- The format in which to render the results -->+				<!ATTLIST fileFormat filePath CDATA #REQUIRED>	<!-- The location of the required output-files -->+				<!ELEMENT xhtml (style)?>			<!-- Requests that the resulting timetable, should be rendered in xhtml -->+					<!ELEMENT style ((displayViews)?, (mergeDuplicateTimeslots)?, (displayAxisLabels)?, (weekend)?, (generateLessonColour)?)>+						<!ATTLIST style+							cssURL				CDATA		#IMPLIED+							displayRuntimeInformation	(False | True)	#IMPLIED+							displaySupplementaryInformation	(False | True)	#IMPLIED+						>+						<!ELEMENT displayViews (perspective)+>		<!-- The list of perspectives, from which to display the timetable. The three-dimensional matrix which defines a timetable, is inverted so that the axis which identifies the various student-bodies, is replaced by either one defining "locationId"s or one defining "teacherId"s. The remaining two axes, representing the "day" & the "timeslotId", are unchanged -->+							<!ELEMENT perspective EMPTY>+								<!ATTLIST perspective view (LocationView | TeacherView | StudentView) #REQUIRED>	<!-- Defines whether the timetable is indexed by "locationId", "studentBody" or "teacherId"; i.e. for whom is it intended -->+						<!ELEMENT mergeDuplicateTimeslots (timeAxes)>	<!-- Whether adjacent identical time-slots should be merged, which; reduces repetition, draws attention to duplicate lessons, & uses the limited space efficiently -->+						<!ELEMENT displayAxisLabels (timeAxes)>		<!-- Whether to label the axes of the timetable, in the output XHTML -->+							<!ELEMENT timeAxes EMPTY>	<!-- Whether some attribute is switched on for each of two time-axes of a timetable -->+								<!ATTLIST timeAxes+									byDay		(False | True)	#REQUIRED+									byTimeslotId	(False | True)	#REQUIRED+								>+						<!ELEMENT weekend (day)*>			<!-- Those "day"s considered to constitute the weekend, may be treated differently in CSS -->+						<!ELEMENT generateLessonColour EMPTY>+							<!ATTLIST generateLessonColour+								generateLessonColourFrom	(Lesson | Subject | Topic | Level | ResourceIds)	#IMPLIED+								minimumContrastRatio		CDATA							#IMPLIED+							>+				<!ELEMENT xml EMPTY>	<!-- Requests a view of the resulting timetable, encoded in XML -->+					<!ATTLIST xml view (LocationView | TeacherView | StudentView) #IMPLIED>	<!-- The specific view required -->+	<!ELEMENT problemParameters ((problemValidationSwitches)?, (timetableValidationSwitches)?, timeslotIdBounds, locationCatalogue, teacherRegister, studentBodyRegister, (groupCatalogue)?)>	<!-- Defines the problem. In contrast to the previous major sections, this is changed each time the problem-specification changes -->+		<!ELEMENT problemValidationSwitches EMPTY>+			<!ATTLIST problemValidationSwitches+				checkAvailabilityOfAnyGroupMember			(False | True)	#IMPLIED+				checkCapacityOfLocationsForMeetings			(False | True)	#IMPLIED+				checkCoursesForSynchronousSpecifiedTimes		(False | True)	#IMPLIED+				checkDuplicateMeetingLocationIds			(False | True)	#IMPLIED+				checkDuplicateOwnLocationIds				(False | True)	#IMPLIED+				checkForAlternativesToSynchronisedCourses		(False | True)	#IMPLIED+				checkForDuplicateStudentIds				(False | True)	#IMPLIED+				checkForIdleStudents					(False | True)	#IMPLIED+				checkForIdleTeachers					(False | True)	#IMPLIED+				checkForInvalidMeetingTimes				(False | True)	#IMPLIED+				checkForMultipleCoursesPerTeacherPerSynchronisationId	(False | True)	#IMPLIED+				checkForNonExistentFacilities				(False | True)	#IMPLIED+				checkForNonExistentGroupIds				(False | True)	#IMPLIED+				checkForNonExistentMeetingLocationIds			(False | True)	#IMPLIED+				checkForNonExistentOwnLocationIds			(False | True)	#IMPLIED+				checkForOverloadedStudents				(False | True)	#IMPLIED+				checkForSingletonSynchronisedCourses			(False | True)	#IMPLIED+				checkForStudentsRequiringMultipleSynchronisedSubjects	(False | True)	#IMPLIED+				checkForStudentsWithUnrealisableFreePeriodPreference	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithDifferentIdealTimeslots	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithDifferentLessonsPerWeek	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithExcessLessonsPerWeek	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithExcessSpecifiedTimes	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithExcessTimeslotRequests	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithoutSuitableLocations	(False | True)	#IMPLIED+				checkForSynchronisedCoursesWithUnavailableSpecifiedDays	(False | True)	#IMPLIED+				checkForTeachersWithUnrealisableFreePeriodPreference	(False | True)	#IMPLIED+				checkIfStudentBodiesExceedTeachers			(False | True)	#IMPLIED+				checkIfStudentBodySizeExceedsCapacityOfAllLocations	(False | True)	#IMPLIED+				checkIfStudentBodySizeExceedsLocationCapacity		(False | True)	#IMPLIED+				checkIndependenceOfStudentTimeslotsRequestsAndMeetings	(False | True)	#IMPLIED+				checkIndependenceOfTeacherTimeslotsRequestsAndMeetings	(False | True)	#IMPLIED+				checkLocationsAvailabilityToSupportCourses		(False | True)	#IMPLIED+				checkLocationsForSynchronousSpecifiedTimes		(False | True)	#IMPLIED+				checkMeetingLocationsAvailability			(False | True)	#IMPLIED+				checkMinimumConsecutiveLessons				(False | True)	#IMPLIED+				checkNullGroupId					(False | True)	#IMPLIED+				checkNullLocationCatalogue				(False | True)	#IMPLIED+				checkNullStudentBodyRegister				(False | True)	#IMPLIED+				checkNullTeacherRegister				(False | True)	#IMPLIED+				checkOwnLocationsAvailability				(False | True)	#IMPLIED+				checkRequiredLessonsPerWeek				(False | True)	#IMPLIED+				checkSimultaneousAvailabilityOfGroupMembers		(False | True)	#IMPLIED+				checkStudentsAvailabilityForMandatoryMeetings		(False | True)	#IMPLIED+				checkStudentsAvailabilityForSpecifiedTimes		(False | True)	#IMPLIED+				checkStudentsForMultipleLevelsOfSameTopic		(False | True)	#IMPLIED+				checkStudentsForSynchronousMeetings			(False | True)	#IMPLIED+				checkStudentsLowerWorkloadBound				(False | True)	#IMPLIED+				checkStudentsUpperWorkloadBound				(False | True)	#IMPLIED+				checkSubjectExistence					(False | True)	#IMPLIED+				checkSuitableLocationsForKnowledgeRequirements		(False | True)	#IMPLIED+				checkTeachersAvailabilityForMandatoryMeetings		(False | True)	#IMPLIED+				checkTeachersForSynchronousMeetings			(False | True)	#IMPLIED+				checkTeachersUpperWorkloadBound				(False | True)	#IMPLIED+				checkTeachingCapacityBySubject				(False | True)	#IMPLIED+				checkTimeslotIdBounds					(False | True)	#IMPLIED+				checkTimeslotRequests					(False | True)	#IMPLIED+			> <!-- Each of these switches governs a runtime-check on the validity of the problemParameters, & is by default switched on -->+		<!ELEMENT timetableValidationSwitches EMPTY>+			<!ATTLIST timetableValidationSwitches+				checkBookedSubjectsAreRequired	(False | True)	#IMPLIED+				checkBookedSubjectsHaveService	(False | True)	#IMPLIED+				checkExistenceOfLocationIds	(False | True)	#IMPLIED+				checkExistenceOfStudentBodies	(False | True)	#IMPLIED+				checkExistenceOfTeacherIds	(False | True)	#IMPLIED+				checkForBookingMeetingClash	(False | True)	#IMPLIED+				checkForMisplacedLessons	(False | True)	#IMPLIED+				checkForOverbookedSubjects	(False | True)	#IMPLIED+				checkForOverloadedStudentBodies	(False | True)	#IMPLIED+				checkForOverloadedTeachers	(False | True)	#IMPLIED+				checkForResourceConflicts	(False | True)	#IMPLIED+				checkMinimumConsecutiveLessons	(False | True)	#IMPLIED+				checkResourceAvailability	(False | True)	#IMPLIED+				checkSynchronisedCourses	(False | True)	#IMPLIED+				checkTimeslotsPerDay		(False | True)	#IMPLIED+			> <!-- Each of these switches governs a runtime-check on the validity of an imported Student-view Timetable, & is by default switched on -->+		<!ELEMENT timeslotIdBounds (min, max)>	<!-- The constant closed interval bounding the range of integral "timeslotId"s, @ which lessons can be booked, irrespective of the "day" -->+			<!ELEMENT min EMPTY>+				<!ATTLIST min timeslotId CDATA #REQUIRED>+			<!ELEMENT max EMPTY>+				<!ATTLIST max timeslotId CDATA #REQUIRED>+		<!ELEMENT locationCatalogue (location)+>	<!-- A map indexed by "locationId" (unique across all "campus"es), of "locationProfiles" -->+			<!ELEMENT location (locationProfile)>+				<!ATTLIST location locationId ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters, & starting with a letter) identifying the location -->+				<!ELEMENT locationProfile ((facilities)?, (availability)?)>	<!-- The nature of the location -->+					<!ATTLIST locationProfile+						capacity	CDATA	#REQUIRED+						campus		CDATA	#IMPLIED+					>+					<!ELEMENT facilities (facilityName)+>	<!-- Arbitrary strings, each representing some facility which might support the tuition of a "course" -->+		<!ELEMENT teacherRegister (teacher)+>	<!-- A map indexed by "teacherId", of "teacherProfiles" -->+			<!ELEMENT teacher (teacherProfile)>+				<!ATTLIST teacher teacherId ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters, & starting with a letter) identifying the teacher -->+				<!ELEMENT teacherProfile ((service)?, availability, (groupMembership)?)>+					<!ATTLIST teacherProfile+						locationId		IDREF			#IMPLIED+						maximumTeachingRatio	CDATA			#REQUIRED+						specialtyTopic		CDATA			#IMPLIED+						freePeriodPreference	(Pre | Post | Terminal)	#IMPLIED+					>+					<!ELEMENT service (course)+>	<!-- The courses this "teacher" is prepared to teach -->+						<!ELEMENT course (subject, (requiredFacilities)?, (timeslotRequest)?)>	<!-- The nature of the course -->+							<!ATTLIST course+								requiredLessonsPerWeek		CDATA	#REQUIRED+								minimumConsecutiveLessons	CDATA	#IMPLIED+								maximumClassSize		CDATA	#IMPLIED+								synchronisationId		CDATA	#IMPLIED+							>+							<!ELEMENT requiredFacilities (facilityName)+>	<!-- Strings, which must be a subset of the "facilities" offered @ a "location" -->+							<!ELEMENT timeslotRequest (ideally | specifically)>+								<!ELEMENT ideally EMPTY>+									<!ATTLIST ideally timeslotId CDATA #REQUIRED>	<!-- The preferred "timeslotId" within any "day", @ which to book this "course" -->+								<!ELEMENT specifically (time)+>	<!-- The precise "time"s in any week, @ which some of the lessons of this "course" should be booked -->+		<!ELEMENT studentBodyRegister (studentBodyToProfileAssociation)+>	<!-- A map indexed by "studentBody", of "studentProfiles" -->+			<!ELEMENT studentBodyToProfileAssociation (studentBody, studentProfile)>+				<!ELEMENT studentBody (student)+>+					<!ATTLIST studentBody mnemonic ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters, & starting with a letter) identifying the student-body -->+					<!ELEMENT student EMPTY>+						<!ATTLIST student studentId ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters, & starting with a letter) identifying a member of the "studentBody" -->+				<!ELEMENT studentProfile (knowledgeRequirements, availability, (groupMembership)?)>	<!-- The common requirements of the members of the "studentBody" -->+					<!ATTLIST studentProfile+						stream			CDATA			#IMPLIED+						teachingRatio		CDATA			#IMPLIED+						freePeriodPreference	(Pre | Post | Terminal)	#IMPLIED+					>+					<!ELEMENT knowledgeRequirements (core, (optional)?)>	<!-- The subjects that the member-"student"s want to learn. These values must match one of the "subject"s, defined in the "course"s, offered as a part of a teacher's "service" -->+						<!ELEMENT core (subject)+>	<!-- Those "subject"s considered required by this "studentBody" -->+						<!ELEMENT optional (subject)+>	<!-- Those "subject"s considered desirable by this "studentBody" -->+		<!ELEMENT groupCatalogue (group)*>	<!-- A map indexed by "groupId", of "groupProfiles" to which "studentBody"s & "teacher"s may belong -->+			<!ELEMENT group (groupProfile)>	<!-- The nature of the group -->+				<!ATTLIST group groupId ID #REQUIRED>	<!-- The unique string (composed entirely from alphanumeric characters, & starting with a letter) identifying the group -->+				<!ELEMENT groupProfile (meetingTimes)?>+					<!ATTLIST groupProfile+						locationId		IDREF		#IMPLIED+						mandatesAttendance	(False | True)	#IMPLIED+					>+					<!ELEMENT meetingTimes (time)+>	<!-- The times @ which the "group" regularly meets -->++<!-- The following elements each exist in multiple parts of the document -->+<!ELEMENT availability (day)+>	<!-- The "day"s on which a resource is available -->++<!ELEMENT day EMPTY>+	<!ATTLIST day value (Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday) #REQUIRED>	<!-- A day within any week; there's no concept of different months or years -->++<!ELEMENT facilityName EMPTY>+	<!ATTLIST facilityName value CDATA #REQUIRED>	<!-- An arbitrary string identifying a specific facility which might be required for the teaching of a "course" -->++<!ELEMENT groupMembership (member)+>	<!-- The "groupIds" of which a human-resource is a member -->+	<!ELEMENT member EMPTY>+		<!ATTLIST member groupId IDREF #REQUIRED>++<!ELEMENT subject EMPTY>	<!-- A subject offered by a "teacher" & potentially required by "student"s -->+	<!ATTLIST subject+		topic	CDATA	#REQUIRED+		level	CDATA	#REQUIRED+	>++<!ELEMENT time (day)>	<!-- Identifies a single time-slot in the timetable -->+	<!ATTLIST time timeslotId CDATA #REQUIRED>++
+ images/atom.png view

binary file changed (absent → 5759 bytes)

+ images/background.png view

binary file changed (absent → 43516 bytes)

+ images/biohazardSymbol.png view

binary file changed (absent → 1577 bytes)

+ images/clefs.png view

binary file changed (absent → 4124 bytes)

+ images/diagonalStripes.png view

binary file changed (absent → 659 bytes)

+ images/favicon.png view

binary file changed (absent → 3126 bytes)

+ images/flagOfEngland.png view

binary file changed (absent → 417 bytes)

+ images/flagOfFrance.png view

binary file changed (absent → 222 bytes)

+ images/flagOfGermany.png view

binary file changed (absent → 211 bytes)

+ images/flagOfPeoplesRepublicOfChina.png view

binary file changed (absent → 934 bytes)

+ images/origin.png view

binary file changed (absent → 931 bytes)

+ images/periodicTable.png view

binary file changed (absent → 30609 bytes)

+ images/religiousSymbols.png view

binary file changed (absent → 4372 bytes)

+ images/silhouettes.png view

binary file changed (absent → 4980 bytes)

+ images/stars.png view

binary file changed (absent → 3660 bytes)

+ images/water.png view

binary file changed (absent → 403610 bytes)

+ images/weekdazeControlFlow.pdf view

binary file changed (absent → 54192 bytes)

+ images/weekdazeIO.pdf view

binary file changed (absent → 42458 bytes)

+ images/worldMap.png view

binary file changed (absent → 9433 bytes)

+ man/man1/weekdaze.1 view
@@ -0,0 +1,788 @@+.TH weekdaze 1+.SH NAME+\fBweekdaze\fR - Attempts to find a timetable satisfying the types of criteria typically required by a school.+.SH SYNOPSIS+\fBweekdaze\fR [\fIOPTIONS\fR]+.SH DESCRIPTION+.PP \" Top-level view.+A command-line application, which attempts to automatically compose a suitable timetable, from the requirements defined in either a local configuration-file or database.+.br+N.B.: The configuration is described separately in section-5 of the manual pages for this product,+but occasional references to specific configuration-fields from this document, are for distinction, both double-quoted & emboldened.+.IP \(bu+The requirements for just one arbitrary week are configured, on the assumption that those for other weeks are similar.+.IP \(bu+The process is non-interactive; if the final result is inappropriate, then the request must be re-configured to express the missing requirement, & re-started.+.TS+lb	l	.+Pros	Whereas an interactive solution may take several weeks of iterative manual adjustments, before the timetable for a moderately sized school, is acceptable, this solution permits sufficiently precise configuration that it can be left alone to complete the job.+	The configuration encapsulates the description of the whole problem, rather than being defined by free-format notes which must be digested by another user before any attempt is made to alter it. A solution which involves manual intervention may use the user's unwritten understanding of the problem, making hand-over difficult.++Cons	One can't realistically implement a configuration-grammar which is sufficiently general to account for all future requirements; one can merely aim to address the important requirements of the majority of users.+	Deviation from a regular weekly routine, for example around bank-holidays or examinations, can't currently be configured.+	A minor change to the requirements may result in a radically different solution.+	These objections have been addressed by permitting one to define not just the precise configuration, but also the initial state of the solution, using a timetable exported in XML from a previous run. This permits either manual adjustment of the solution or minor changes to the configuration, while retaining an expectation of a similar solution. This is described pictorially in the packaged file \fBimages/weekdazeIO.pdf\fR.+.TE+.PP \" Output+The resulting timetable is rendered in XHTML, as a set of two-dimensional slices through a conceptually three-dimensional Cartesian graph.+Each slice is bounded by axes ranging over the \fIday\fRs of the week,+& the constant, but configurable, number of \fItime-slot\fRs into which the \fIday\fR has been sub-divided, & identifies any \fIlesson\fRs booked.+The third axis (which defines each slice) identifies a \fIresource\fR (either the \fIstudent\fRs, the \fIteacher\fRs, or the \fIlocation\fRs in which classes are held);+depending on the intended audience for the timetable.+A timetable can be inverted to change this axis so that it can be more readily be interpreted by another type of observer, whilst still presenting the same set of \fIbooking\fRs.+.br+The timetable can also be rendered as XML, organised in a form suitable for viewing by any of these types of observer,+to facilitate either transport of the solution-data to another system,+or fed-back into this application as the initial state from which to evolve further.+.PP \" Solution-quality.+Since the solution is progressively evolved, the quality depends on the time available.+Regrettably, the application can't in general, prove in advance, that all the configured criteria can be satisfied;+thought it may be able to prove that some of them can't.+Consequently, it can't guarantee that a completely satisfactory solution for a specific problem can ever be found, however much time is devoted to it;+though it will return the best solution found.+In this respect, it is incumbent on the user to understand the ramifications of their choice of constraints, & to provide sufficient \fIresource\fRs to permit a solution.+.SS Terminology \" Defines the terms used in this specific context.+In the context of this application, the following terminology is employed.+The terms have been coined as the need has arisen, & don't necessarily correspond to the jargon used by other solutions in this problem-domain.+.br+You may prefer to skip ahead & refer back to this dictionary as required.+To prompt one to the existence of some special meaning (since these terms express nuances beyond their meaning outside the context of this application),+such terms have been distinguished by underscoring.+.TP+.B Availability+The whole \fIday\fRs when a \fIresource\fR is available to be booked.+.br+Fractions of \fIday\fRs can't be directly expressed,+though if the \fIresource\fR is human, any unavailable portion of a \fIday\fR can be reserved artificially,+using the \fImeeting\fRs of a single-member \fIgroup\fR (which has no purpose & doesn't require a \fIlocation\fR).+.TP+.B Booking+A rendezvous defined in the timetable, for a specific \fIlesson\fR @ a specific \fItime\fR.+.br+Similar to a \fImeeting\fR, but refers to a \fIlesson\fR, rather than a \fIgroup\fR.+Though the booking-times of a \fIlesson\fR can be specified in the configuration, typically it is allocated @ run-time by weekdaze, which inserts it between the fixed meeting-times of \fIgroup\fRs.+.TP+.B Campus+Defines a set of proximate \fIlocation\fRs, between which intraday migration is trivial.+.br+If the time required to migrate between \fIlocations\fR is significant,+then one may partition them into \fIcampus\fRes to allow the application to minimise the number of such journeys.+.TP+.B Course+A set of \fIlesson\fRs in a common \fIsubject\fR, offered by a single \fIteacher\fR.+.br+Though a \fIsubject\fR would typically require many weeks of tuition, only one week is configured, on the assumption that others have similar scheduling-requirements.+.br+A course springs into existence, when it is offered as part of a \fIteacher\fR's \fIservice\fR,+rather than existing as an independent part of the configuration to which \fIteacher\fRs & \fIstudent-bodies\fR refer.+.TP+.B Day+The working portion (rather than the full 24 hours), of a day of the week.+.br+The \fIday\fR forms one of two temporal axes, from the three Cartesian coordinates used to describe the single-week timetable.+.TP+.B Depletion-strategy+A method used by the application to liberate space in the timetable, by selectively un-booking \fIlesson\fRs.+.br+The \fIlesson\fRs are selected; in order to reduce some undesirable trait;+to re-cast any established \fIroutine\fR;+or arbitrarily, merely to permit exploration of an alternative region in the solution-space.+.TP+.B Evolution-strategy+One of many methods used by the application, in an attempt to evolve the timetable.+Each is composed from a \fIdepletion-strategy\fR & a reconstruction-strategy.+.TP+.B Facility+An attribute of a \fIlocation\fR, which can in some way support a \fIcourse\fR.+.TP+.B Fecundity+The size of the population of candidate-timetables, that the application breeds in any one generation of the evolution of a solution.+.TP+.B Fitness-function+Used either to quantify the:+.br+suitability of each member of a set of alternative \fIlesson\fRs to book in the \fItimetable\fR @ a specific time, using a weighted-mean of \fIlesson-criteria\fR;+.br+value of each member of a set of alternative \fItimetable\fRs, using a weighted-mean of a set of \fItimetable-criteria\fR.+.TP+.B Group+A set of one or more people (\fIteacher\fRs or \fIstudent-bodies\fR) with a common interest or duty.+.br+This is a more flexible structure than the single \fIteacher\fR & \fIstudent-class\fR used to define a \fIlesson\fR.+.TP+.B Knowledge-requirements+The set of one of more \fIsubject\fRs required by a \fIstudent-body\fR.+It is partitioned into those personally considered (other \fIstudent-bodies\fR may categorise them differently) to be either \fIcore\fR or \fIoptional\fR.+.TP+.B Lesson+An arrangement between a single \fIteacher\fR & a \fIstudent-class\fR, to teach a \fIcourse\fR for one \fIperiod\fR @ a specific \fIlocation\fR & \fItime-slot\fR.+.br+A \fIlesson\fR as depicted in the results, always specifies the course's \fIsubject\fR,+but only two of the three types of \fIresource\fR,+the third being implied by the coordinate @ which it is booked on the \fIobserver-id\fR axis of the \fItimetable\fR.+.TP+.B Lesson-criteria+The metrics used by the application when constructing a solution, to quantify & therefore to facilitate selection,+of the best \fIlesson\fR from those which are permissible @ specific coordinates.+.br+The value of each criterion is typically neither dependent on what has already been booked elsewhere, nor does it change as further \fIbooking\fRs are made.+.br+Each criterion has an associated configurable weight, which allows one to change its significance relative to other \fIlesson-criteria\fR.+.br+cf. \fItimetable-criteria\fR which are used to quantify & therefore select the best from a population of candidate-timetables.+.TP+.B Level+The level @ which a \fItopic\fR is taught, or the personal academic capability or year of a \fIstudent\fR.+.br+Continuity of the \fIteacher\fR-\fIstudent\fR relationship, for the tuition of a specific \fIcourse\fR, may need to be guaranteed in the years leading up to examination.+This can be implemented simply by requiring that those \fIteacher\fRs offering such a \fIcourse\fR,+specify a \fIlevel\fR which includes a unique code.+\fIStudent-bodies\fR requesting this \fIsubject\fR can then specify the unique \fIlevel\fR corresponding to their \fIteacher\fR from the previous year.+.TP+.B Location+A generalisation of a class-room, to encompass any space available to support either a \fIbooking\fR or a \fImeeting\fR.+.br+It is described by its \fIavailability\fR, \fIcapacity\fR, & the \fIfacilities\fR it offers to support \fIcourse\fRs.+.TP+.B Meeting+A rendezvous defined in the timetable, between \fIgroup\fR-members @ a specific \fItime\fR.+.br+Similar to a \fIbooking\fR, but refers to a \fIgroup\fR, rather than a \fIlesson\fR.+.br+The meeting-times of a \fBgroup\fR are configured, & are therefore reserved by the application, forcing \fIlesson\fRs to float around them.+.TP+.B Observer+The target audience for a timetable, which may be any type of \fIresource\fR.+.br+The same timetable-data may be re-organised into a form suitable for any of three types of observer,+by enumerating unique \fIresource\fR-identifiers along one axis of the timetable (the remaining two axes are always the \fIday\fR & the \fItimeslot-id\fR),+thus permitting all observers of that type to rapidly access their personal timetable for the week.+.br+N.B. since a \fIlocation\fR is clearly incapable of observing anything,+one may more correctly consider the timetable indexed by \fIlocation-id\fR, to be ideally organised for observation by maintenance-staff.+.TP+.B Period+Similar to a \fItime-slot\fR, but refers more to a duration than to a position on the time-axis.+.TP+.B Population-diversity Ratio+The ratio of distinct members to all the members, in a population of candidate-timetables.+.TP+.B Resource+Either a \fIlocation\fR, a \fIstudent-body\fR or a \fIteacher\fR.+.br+Since each \fIlesson\fR requires one of each type of \fIresource\fR, the most basic function of \fBweekdaze\fR is to avoid scheduling-conflicts between them;+no individual can be booked @ more than one \fIlocation\fR @ any time, & no \fIlocation\fR can host more than either one class or one \fImeeting\fR @ a time.+.br+cf. \fIObserver\fR.+.TP+.B Routine+The relationship established between \fIresource\fRs, when teaching the \fIlesson\fRs of a \fIcourse\fR.+.br+It is considered desirable that such \fIroutine\fRs are preserved, so that for any one \fIsubject\fR,+a \fIstudent-body\fR isn't taught either @ more than one \fIlocation\fR or by more than one \fIteacher\fR.+.TP+.B Service+The set of \fIcourse\fRs offered by a \fIteacher\fR.+.br+N.B.: a \fIteacher\fR who offers no service directly to \fIstudent\fRs, may still exist in the timetable @ the \fImeeting\fRs they attend.+.TP+.B Stream+This is the personal academic capability or year of a \fIstudent-body\fR.+.br+The requirement for a \fIstudent-body\fR to have a \fIstream\fR isn't obvious, since it can be inferred from the \fIlevel\fR of the \fItopic\fRs in their \fIknowledge-requirements\fR,+but it can be used to prevent the various \fIstudent-bodies\fR studying a \fIsubject\fR from being merged into a single \fIstudent-class\fR (should that be undesirable).+.TP+.B Student+An individual, whose requirements are described by the \fIstudent-body\fR of which they're a member.+.TP+.B Student-body+A set of \fIstudent\fRs with identical requirements (\fIavailability\fR, \fIstream\fR, \fIknowledge-requirements\fR, \fIgroup\fR-membership).+.br+These sets are typically manually configured, but additional or larger sets, may optionally be automatically discovered by the application;+it can also relax the requirement that the students belong to the same \fIgroup\fRs, if the \fIgroup\fRs for which memberships differ, never actually meet.+.TP+.B Student-body Combinations+This refers to an undesirable trait in a timetable, where the set of \fIstudent-bodies\fR,+who're temporarily merged into a \fIstudent-class\fR for the tuition of a \fIcourse\fR,+changes throughout the \fIlesson\fRs booked in a week.+.br+E.g. where three \fIstudent-bodies\fR, \fIS1\fR, \fIS2\fR, \fIS3\fR, are enrolled on \fIcourse\fR \fIC1\fR, taught by \fIteacher\fR \fIT1\fR, which requires two \fIlesson\fRs per week;+\fIS1\fR may be merged with \fIS2\fR to form a \fIstudent-class\fR @ time \fIt1\fR,+\fIS2\fR merged with \fIS3\fR @ time \fIt2\fR,+& \fIS3\fR with \fIS1\fR @ time \fIt3\fR.+.br+The undesirable consequence is that teacher \fIT1\fR must synchronise progress through the \fIcourse\fR, between these \fIstudent-class\fRes.+.TS+l	l	cb	s	s+l	l	c	s	s+lb	lb	l	l	l+^	lb	^	^	^+l	l	l	l	l	.+		Time+		============+Teacher	Student	t1	t2	t3+	body+=======	=======	==	==	==+	S1	C1		C1+T1	S2	C1	C1+	S3		C1	C1+.TE+.TP+.B Student-class+A set of \fIstudent-bodies\fR, which are temporarily merged during the tuition of a single \fIcourse\fR.+.TP+.B Student-class Combinations+This refers to an undesirable trait in a timetable, in which \fIlesson\fRs for a set of \fIsynchronised courses\fR have been booked.+Though the \fIcourse\fRs which share a "\fBsynchronisationId\fR", may have been booked without any undesirable \fIstudent-body combinations\fR,+each \fIlesson\fR may be synchronised with different \fIstudent-class\fRes in the other \fIcourse\fRs of the set.+.br+E.g. take two \fIsynchronised courses\fR, \fIC1\fR taught by \fIteacher\fR \fIT1\fR, & \fIC2\fR taught by \fIteacher\fR \fIT2\fR, each of which requires two \fIlesson\fRs per week.+\fIStudent-bodies\fR \fIS1\fR & \fIS2\fR are enrolled on \fIC1\fR, while \fIstudent-bodies\fR \fIS3\fR & \fIS4\fR are enrolled on \fIC2\fR.+Whilst these four \fIstudent-bodies\fR could be merged into two \fIstudent-class\fRes \fI{S1, S2}\fR & \fI{S3, S4}\fR+under these circumstances no undesirable \fIstudent-body combinations\fR can arise, but should their \fIavailability\fR dictate that they must form four singleton \fIstudent-class\fRes,+different pairs of singleton \fIstudent-class\fRes may be synchronised @ various \fItime\fRs throughout the week.+.TS+l	l	cb	s	s	s+l	l	c	s	s	s+lb	lb	l	l	l	l+^	lb	^	^	^	^+l	l	l	l	l	l	.+		Time+		======================+Teacher	Student	t1	t2	t3	t4+	class+=======	=======	==	==	==	==+T1	S1		C1	C1+	S2	C1			C1+T2	S3	C2		C2+	S4		C2		C2+.TE+.sp 1+The consequence of this only becomes apparent, when any one of these \fIstudent-bodies\fR decides to migrate to the other \fIcourse\fR in this set of \fIsynchronised courses\fR;+which, as required, is possible without shuffling the timetable, but results in a \fIstudent-body combination\fR.+.br+E.g. Should \fIS1\fR decide to migrate from \fIC1\fR to \fIC2\fR, a \fIstudent-class\fR is then formed between \fIS1\fR & \fIS4\fR @ \fIt2\fR, but between \fIS1\fR & \fIS3\fR @ \fIt3\fR.+.TP+.B Subject+A combination of a \fItopic\fR & the \fIlevel\fR @ which it is taught.+.br+It is a component of both a \fIstudent\fR's \fIknowledge-requirements\fR & \fIteacher\fR's \fIservice\fR,+& can only be required by the former, when offered by the latter.+.TP+.B Synchronised courses+A set of \fIcourse\fRs, whose respective \fIlesson\fRs must be synchronised.+The member-\fIcourse\fRs:+.br+may have different \fIsubject\fRs,+.br+must define the same "\fBrequiredLessonsPerWeek\fR",+.br+can in aggregate only define either one \fIideal timeslot-id\fR, or specify precise booking-times the union of which is limited in size by "\fBrequiredLessonsPerWeek\fR",+.br+must be offered by \fIteacher\fRs whose \fIavailabilities\fR intersect.+.br+Since the structure of the timetable is largely independent of precisely which of these member-\fIcourse\fRs is selected by a \fIstudent\fR,+migration of a \fIstudent\fR between them (should their initial choice prove hasty), is relatively easy.+The use-cases fall into two categories:+.TS+lb	lb	lb+l	l	l+lb	l	l	.+Use-case	Synchronised Courses	Purpose+========	====================	=======+Iso-\fIlevel\fR	Different \fItopic\fRs @ the same \fIlevel\fR	Permits \fIstudent\fRs to select only one of the \fItopic\fRs offered, but to migrate easily.+Iso-\fItopic\fR	Different \fIlevel\fRs of the same \fItopic\fR	Permits \fIstudent\fRs to migrate between ability-streams.+.TE+.sp 1+Whilst the flexibility exists to synchronise the scheduling of \fIcourse\fRs whose \fItopic\fRs & \fIlevel\fR differ, this concept is hard to justify.+.TP+.B Teacher+A description of an individual's \fIavailability\fR, the proportion of their \fIworking-week\fR devoted to teaching,+the \fIservice\fR they offer to \fIstudent\fRs, & the \fIgroup\fRs of which they're members.+.TP+.B Time-slot+The partitions into which each \fIday\fR is similarly divided, each one of which is available for the booking of a \fIlesson\fR or \fImeeting\fR.+.br+Similar to a \fIperiod\fR, but refers more to a position on the time-axis than to a duration.+.TP+.B Timetable+Conceptually a cuboid, whose three Cartesian axes are indexed by; \fIday\fR, \fItimeslot-id\fR, & \fIobserver-id\fR.+The \fIobserver-id\fR axis can be any \fIresource\fR-type, depending on the target-audience; there's no change to the data, they're merely re-indexed.+.TP+.B Timetable-criteria+The metrics used by the application, to quantify the degree to which a timetable meets the specified problem-parameters.+These allow it to select amongst alternative solutions, while searching for the optimum.+.br+Though the semantics of each criterion are hard-coded, each has an associated configurable weight, which allows one to change its significance relative to other \fItimetable-criteria\fR.+.br+cf. \fIlesson-criteria\fR which are used to quantify & therefore select the best amongst alternative \fIlesson\fRs.+.TP+.B Topic+The component of a \fIsubject\fR which is independent of the \fIlevel\fR @ which it is taught.+.SS Implementation+Though this explanation descends into esoteric details, & you could skip ahead to the next major section (\fBOPTIONS\fR),+some understanding of the wheels & levers behind the curtain is required to fine-tune the \fBexecutionOptions\fR, when attempting to improve an unsatisfactory solution.+.br+The problem is tackled using several algorithms sequentially, some of which can be turned-off if they prove to be consistently ineffective for the type of problem posed.+.TP+.B Initial Deterministic Timetable+Starting with an empty timetable, whose x-axis identifies each \fIday\fR, whose y-axis identifies each \fItimeslot-id\fR, & whose z-axis identifies a type of \fIresource\fR,+the solution starts with the booking of the meetings of \fIgroup\fRs (since the configuration currently requires these to occur @ predefined times).+A solution compatible with the remaining problem-parameters is then constructed progressively, by raster-scanning over the three dimensions of the timetable.+On visiting unbooked coordinates, when a "\fBstudentBody\fR" is \fIavailable\fR to be taught,+the best \fIlesson\fR, according to a fitness-function (implemented as the weighted mean of a set of \fIlesson-criteria\fR), is booked.+The aim of this procedure, is to begin the subsequent random evolution of the timetable from a reasonable starting-point in the solution-space.+.br+Though the weights of the \fIlesson-criteria\fR & \fItimetable-criteria\fR are configurable, the criteria themselves are hard-coded.+.br+This process is deterministic; for a given raster-scan & problem-parameters, it will always produce the same result.+.br \" Raster-scan.+The pattern of the raster-scan dictates the order in which \fItime-slot\fRs are visited & potentially booked with a \fIlesson\fR.+Because the three axes of the timetable represent different concepts,+the order in which they're visited, results in solutions with different characteristics.+Less obviously, the "\fBsense\fR" in which an axis is traversed, also makes a difference;+because if the problem-parameters break symmetry, the resulting timetable isn't merely a mirror-image,+with bookings reflected around either the middle day of the week or the middle \fItime-slot\fR of the day.+One may specify the specific order & "\fBsense\fR" in which the axes of the timetable should be traversed,+but since it can be difficult to guess in advance, which of these will result in the best timetable,+normally one merely requests the default behaviour, which is that all permutations of raster-scan be evaluated,+& the best, according to a fitness-function (implemented as the weighted mean of a set of \fItimetable-criteria\fR), be selected.+.br+The application can also read an initial solution from the file-system, typically after exporting it from a previous run of the application.+.P \" Evolution.+Having created an initial solution, an attempt is made to progressively evolve it, using a variety of \fIevolution-strategies\fR,+each of which involves depleting the timetable, by selectively un-booking \fIlesson\fRs,+& then reconstructing it in various ways to form a population of candidates in which there might be a superior solution.+Each of these strategies represents a \fIunary variation-operator\fR, rather than the \fIbinary variation-operators\fR (AKA \fIrecombination\fR) typically used in \fIgenetic algorithms\fR;+no attempt is made to combine the desirable characteristics of two solutions whose fitness has been measured by a \fIfitness-function\fR to be high, to produce better offspring,+but merely to take a single solution whose fitness has been measured by a \fIfitness-function\fR to be high, & to mutate it in isolation.+Each variation operation is equivalent to a step across the solution-space, & by using steps of different magnitude,+it is hoped that relatively inaccessible regions within the solution-space can be reached, in order to ensure that given sufficient time this algorithm can reach the optimal solution.+.br \" Depletion-strategies.+Various \fIdepletion-strategies\fR are used; most target some undesirable trait, whilst the remainder attempt to improve some desirable metric.+Since some \fIdepletion-strategies\fR don't in isolation liberate sufficient space in the timetable for any beneficial mutation to occur, they can be arbitrarily combined;+though this feature is hard-coded rather than configurable.+Each depletion-strategy may identify many alternative sets of \fIlesson\fRs to unbook, resulting in a population of candidate-timetables,+the size of which is limited by its \fIfecundity\fR (configured independently for each \fIevolution-strategy\fR).+By zeroing this \fIfecundity\fR, individual \fIevolution-strategies\fR can be disabled.+.br \" Reconstruction.+Each depleted timetable is then reconstructed by visiting all undefined \fItime-slot\fRs in a random order,+booking \fIlesson\fRs selected by either the same deterministic algorithm used to form the initial solution, or randomly from those which are viable.+.br \" Generations.+After constructing the population of candidates in any one generation,+the fittest \fIn\fR, according to the weighted mean of the \fItimetable-criteria\fR, are selected; some of which may be less fit than their parent.+Each of these children is then used as the parent of a new generation of candidates, from which the fittest \fI(n - 1)\fR are selected,+resulting in a spreading tree-structure each successive node of which produces fewer branches.+When \fIn\fR decreases to zero, this family-tree withers, & all the last-generation offspring are compared with the original parent to determine whether progress has been made,+& consequently whether to re-seed the process using the best child, or whether to terminate the process.+.br+The various \fIdepletion-strategies\fR are described below.+.TP \" Depletion-strategies.+.B Synchronised Course Mutation+This \fIevolution-strategy\fR tackles only \fIsynchronised courses\fR,+by un-booking all the \fIlesson\fRs for \fIcourse\fRs sharing a "\fBsynchronisationId\fR", in turn.+.br+Because a typical \fIstudent\fR's timetable is almost fully booked,+there are relatively few times remaining which are free to accept a \fIbooking\fR,+& even fewer which can accept the synchronised \fIbooking\fRs required for the members of a set of \fIsynchronised courses\fR.+Consequently, the only solution typically accessible from this initial state, is the original, & the probability of a beneficial change to the timetable, is therefore low.+To improve the probability, a variety of coincidentally synchronised groups of \fIlesson\fRs from non-synchronised \fIcourse\fRs, selected to ensure that all may easily be relocated,+are un-booked first, to provide alternative coordinates @ which to book the awkward synchronised \fIlesson\fRs of \fIsynchronised courses\fR.+.TP+.B Synchronised Course by Day Mutation+This \fIevolution-strategy\fR tackles only \fIsynchronised courses\fR, by selecting each \fIsynchronised course\fR in turn, & then each \fIday\fR in turn, & un-booking all the corresponding \fIlesson\fRs.+.br+As for \fBSynchronised Course Mutation\fR, alternative coordinates for the required \fIlesson\fRs are created,+to improve the probability of finding a superior solution.+.TP+.B Excess Runlength Mutation+This \fIevolution-strategy\fR focuses on the reduction in one particular undesirable trait in a timetable; excessively long unbroken sessions of identical \fIlesson\fRs (& therefore with identical \fIsubject\fRs).+It finds all instances whose duration exceeds the corresponding \fIcourse\fR's value for "\fBminimumConsecutiveLessons\fR".+Then for each session in turn;+reduces its length by un-booking either of the terminal \fIlesson\fRs;+along with an arbitrary \fIbooking\fR, on any other \fIday\fR, & @ a \fItime\fR to which the original \fIlesson\fR might be relocated.+.br+CAVEAT: because "\fBtimetableCriteriaWeights\fR/\fBminimiseRatioOfConsecutiveEqualLessons\fR" is typically lighter than other criterion-weights,+the timetable may be improved by this \fIevolution-strategy\fR, whilst paradoxically increasing the number of long unbroken sessions of identical \fIlesson\fRs.+One could correct this anomaly by increasing the relative weight of this criterion,+but that would merely result in a degradation of the solution in some arguably more important respect;+the final solution is a compromise.+.TP+.B Homogeneous Student-view Lesson Mutation+The \fIbooking\fRs in the timetable, are divided into groups composed from homogeneous \fIlesson\fRs;+actually, whether two \fIlesson\fRs are considered to be identical, depends on the perspective from which they're viewed,+but in this context, it's from the \fIstudent-body\fR's perspective+(i.e. the same \fIteacher\fR, teaching the same \fIsubject\fR, @ the same \fIlocation\fR, but to any \fIstudent-class\fR).+Each set of \fIlesson\fRs is un-booked & the timetable reconstructed, before proceeding to the next set.+.br+Since each set of identical \fIlesson\fRs must be taught by the same \fIteacher\fR in the same \fIlocation\fR,+un-booking all of them, breaks any \fIroutine\fR, allowing the timetable to be reconstructed with an alternative \fIroutine\fR,+& facilitating the transfer of workload between \fIteacher\fRs whose \fIservice\fRs intersect.+.TP+.B Incomplete Course Mutation+This \fIevolution-strategy\fR focuses on the reduction in one particular undesirable trait in a timetable; incompletely booked \fIcourse\fRs.+Each \fIcourse\fR offered by a \fIteacher\fR requires a precisely defined number of \fIlesson\fRs per week.+Each \fIstudent\fR defines the \fIcourse\fRs they want to study.+If the timetable for any one \fIstudent\fR doesn't schedule the required number of \fIlesson\fRs,+then arguably they may as well not attend any of the \fIlesson\fRs for that \fIcourse\fR.+.br+This \fIevolution-strategy\fR mutates the timetable, by un-booking all the \fIlesson\fRs,+for each such incompletely booked \fIcourse\fR in turn, & for each \fIstudent-body\fR in turn.+It un-books them even if;+they're booked @ \fItime\fRs specifically requested for the \fIcourse\fR of which they're a part, to permit alternative \fIlocation\fRs to be used, or for the \fIstudent\fR to associate with a different \fIteacher\fR offering a compatible \fIcourse\fR;+the corresponding \fIcourse\fR defines a non-trivial "\fBminimumConsecutiveLessons\fR", because given that all \fIlesson\fRs for the \fIcourse\fR are un-booked, no inconsistent state remains.+.TP+.B Random Lesson Mutation+Over a specified number of random trials,+a number of randomly selected \fIlesson\fRs are un-booked from the timetable & the timetable reconstructed.+.br+\fILesson\fRs which have been booked @ \fItime\fRs specifically requested for the \fIcourse\fR of which they're a part,+are excluded from the random selection, because the probability of a beneficial change to the timetable is too low to justify the effort.+.TP+.B Singleton Student-class Mutation+This \fIevolution-strategy\fR focuses on promotion of one particular desirable trait in a timetable; the temporary merger of \fIstudent-bodies\fR into \fIstudent-class\fRes.+\fILesson\fRs whose \fIstudent-class\fRes have been composed from a single specific \fIstudent-body\fR,+are un-booked from the timetable, which is then reconstructed before proceeding to un-book singleton \fIstudent-class\fRes for another specific \fIstudent-body\fR.+.br+\fILesson\fRs;+whose \fIcourse\fR is \fIsynchronised\fR;+or whose \fIcourse\fR defines a non-trivial "\fBminimumConsecutiveLessons\fR";+or which have been booked @ \fItime\fRs specifically requested for the \fIcourse\fR of which they're a part,+are excluded from the selection, because the probability of a beneficial change to the timetable is too low to justify the effort.+The former are addressed separately by \fBSynchronised Course Mutation\fR.+.TP+.B Split Session Mutation+This \fIevolution-strategy\fR focuses on the reduction in one particular undesirable trait in a timetable;+split sessions of identical \fIlesson\fRs (& therefore with identical \fIsubject\fRs).+It finds all \fIlesson\fRs which have been booked more than once in any \fIday\fR, but with some non-zero time-span between, then un-books one contiguous session.+.br+The probability of a beneficial change to sessions which either include a \fIbooking\fR @ a \fItime\fR requested by "\fBtimeslotRequest/specifically\fR",+or whose \fIlesson\fRs are for a \fIcourse\fR which is \fIsynchronised\fR, is too low to justify the effort; consequently they're excluded.+.br+Split sessions are typically only introduced by the "\fBrandomConstructor\fR" (see section-5 of the manual pages for this product),+though they can also be introduced manually via the command-line option \fB--inputStudentViewTimetable\fR.+.TP+.B Student-body Combination Mutation+This \fIevolution-strategy\fR focuses on the reduction in one particular undesirable trait in a timetable;+those which contain \fIlesson\fRs for any one \fIcourse\fR, attended by a \fIstudent-class\fR, which @ various booking-\fItime\fRs has been composed from different combinations of \fIstudent-bodies\fR.+So, if \fIstudent-bodies\fR \fBA\fR & \fBB\fR both require the same \fIsubject\fR,+one would probably prefer to consistently teach \fB{A, B}\fR (or failing that, to teach singleton \fIstudent-classes\fR, composed from each \fIstudent-body\fR in isolation),+rather than various different combinations of \fIstudent-body\fR; \fB{A}\fR, \fB{B}\fR, \fB{A, B}\fR.+.br+Proliferation of \fIstudent-body combination\fRs, amongst the \fIlesson\fRs booked for a \fIcourse\fR,+can be discouraged by applying a relatively large weighting to "\fBlessonCriteriaWeights\fR/\fBminimiseStudentBodyCombinations\fR" & "\fBtimetableCriteriaWeights\fR/\fBminimiseMeanStudentBodyCombinationsPerLesson\fR" (see section-5 of the manual pages for this product),+but unless all instances of a specific \fIstudent-body combination\fR for a \fIcourse\fR, are un-booked simultaneously,+a better weighted mean of the \fItimetable-criteria\fR is unlikely to result,+& therefore the resulting timetable probably won't be selected as the basis of the next generation.+.br+This \fIevolution-strategy\fR mutates the timetable, by finding instances where different \fIstudent-class\fRes have been booked for any one \fIlesson\fR,+then for each \fIstudent-class\fR in turn, un-books all the corresponding \fIlesson\fRs.+.TP+.B Student-view Timetable-for-day Mutation+For each \fIstudent-body\fR in turn, then for combinations of the specified number of \fIday\fR, remove all bookings.+If the number of \fIday\fRs is unspecified, then combinations of any number of days will be tried.+.br+This creates the contiguous space required to book \fIcourse\fRs which specify a non-trivial "\fBminimumConsecutiveLessons\fR",+& when the specified number of \fIday\fRs exceeds one, the ability to relocate them to another \fIday\fR.+\fILesson\fRs whose \fIcourse\fR either is \fIsynchronised\fR or specifically requests any times on the current \fIday\fR,+are excluded because the probability of a beneficial change to the timetable is too low to justify the effort.+.TP+.B Student-view Timetable-for-week Mutation+Similar to "\fBRandom Lesson Mutation\fR", except that each \fIstudent-body\fR is mutated independently.+.TP+.B Synchronous Lesson Mutation+The \fIbooking\fRs in the timetable, are divided into synchronous groups of otherwise arbitrary \fIlesson\fRs.+Each set of \fIlesson\fRs is un-booked & the timetable reconstructed, before proceeding to the next set.+This is a rather arbitrary procedure, neither specifically addressing an undesirable trait, nor attempting to promote some desirable metric,+but it is useful when deployed in combination with \fIdepletion-strategies\fR which do address specific problems, which in isolation typically don't liberate sufficient free space to be effective.+.br+\fILesson\fRs which have been booked @ \fItime\fRs specifically requested for the \fIcourse\fR of which they're a part,+and \fIlesson\fRs forming a consecutive sequence whose minimum length has been configured,+are excluded from each group, because the probability of a beneficial change to the timetable is too low to justify the effort.+.SS Solution-quality+The time-complexity of the problem is known to be exponential, which is bad news if you're hoping to find an optimal solution.+The problem's complexity is dependent on the number of \fIlocation\fRs, \fIstudent-bodies\fR, \fIteacher\fRs, & \fItimeslot\fRs-per-day,+but because these quantities are related (e.g. one can't indefinitely increase the number of \fIstudent\fRs without increasing both \fIteacher\fR-hours & the total capacity of the \fIlocation\fRs in which they're taught), it's difficult to quantify the time-complexity more precisely.+.br+Regardless, it's clear that as these quantities increase, it takes longer to assess the viability of a timetable, & consequently to arrive at an acceptable solution.+If the solution takes an unacceptably long time, then perhaps one may reduce it by partitioning the \fIday\fR into fewer longer \fItime-slot\fRs,+or by coercing the \fIstudent\fRs into a more rigid curriculum requiring fewer larger \fIstudent-bodies\fR.+.PP+The quality of the final solution returned within a given time, depends on the ease with which the evolutionary algorithm can move through the solution-space.+It may become grid-locked by;+\fIcourse\fRs which demand a large "\fBminimumConsecutiveLessons\fR", or which reference a "\fBsynchronisationId\fR", or which have a "\fBtimeslotRequest\fR" (each of which are described in section-5 of the manual pages for this product);+\fIteacher\fRs who are fully booked;+or \fIlocation\fRs which are fully utilised.+So if the final timetable isn't an acceptable compromise, then removing unnecessary constraints on \fIcourse\fRs,+or providing more \fIresource\fRs should improve the result.+.SS Diagnostics+Using the command-line option \fB--verbosity=Deafening\fR, the output on \fIstderr\fR, contains the following information:+.TS+lb	lb+l	l+lb	l+.+Report	Explanation+=====	===========+The weighted mean over all heterogeneous timetable-criteria, of the deterministic timetable resulting from each raster-scan; & the (minimum, maximum)	The application has performed a raster-scan over the timetable, booking \fIlesson\fRs selected to optimise the value of \fIlesson-criteria\fR. This is repeated using a variety of different rasters, reporting for each the resulting weighted mean over all \fItimetable-criteria\fR. Finally the raster-patterns which were worst & best are reported.++The weighted timetable-criteria of the best deterministic timetable	The individual \fItimetable-criteria\fR used to compose the weighted mean, in the best raster-scan, are reported in the configured order.++The ((mean, standard deviation), (minimum, maximum)) over the best deterministic timetable, of each weighted lesson-criterion	The values of \fIlesson-criteria\fR, by which \fIlesson\fRs were selected during the best raster-scan are reported. Their standard deviation, & minimum & maximum value, over the best timetable, identifies their influence on the selection of \fIlesson\fRs, & where perhaps individual weights may be fine-tuned. This is the end of the initial deterministic phase, from which random evolution now begins.++The (relative improvement in the weighted mean over all heterogeneous timetable-criteria, the number of generations through which the timetable evolved, the final fecundity, & the weighted timetable-criteria for the selected candidate), for each evolution-strategy/timetable-constructor	Here we report four statistics for each evolution/reconstruction strategy; a quantification of the improvement according to the weighted mean over all the \fItimetable-criteria\fR, resulting from this strategy; the number of generations of evolution, since strategies are terminated when improvements cease; the final \fIfecundity\fR of the breeding-program, since this is reduced by a feedback-loop, when the population-diversity ratio of the candidate-population drops beneath a threshold; the individual weighted \fItimetable-criteria\fR, in configuration-order, from which the mean is composed.++The final weighted timetable-criteria, & the improvement, from the best deterministic timetable	The final value of each weighted \fItimetable-criterion\fR is reported, along with the absolute amount by which it was changed during evolution. The order in which they're reported matches the configured "\fBtimetableCriteriaWeights\fR".+.TE+.sp 1+Faced with an unacceptable solution, first determine precisely what aspect of the resulting timetable is unacceptable.+If this aspect is associated with one of the \fItimetable-criteria\fR, determine whether during the evolutionary process, the value of less important criteria, benefit to the detriment of the criterion of interest.+If so, then one can re-configure the weight of criteria, to compensate.+The sensitivity of the solution, to the various criterion-weights, is different, & also problem-specific,+so start with a small change, perhaps \fB1%\fR, & check whether the result improves.+.SS Trouble-shooting+.TP+\fBfatal error: file read error: "file not found" when accessing ".../dtd/weekdaze.dtd"\fR+The XML configuration-file has referenced a DTD which doesn't exist; amend its \fBDOCTYPE\fR-declaration to correctly reference the packaged file "\fBdtd/weekdaze.dtd\fR".+.SH OPTIONS+.PP+Many of these options have default values defined by similarly named fields in the configuration-file; see section-5 of the manual pages for this product.+.SS Input+The configuration can be read either from an XML-file, or from a SQL-database.+One can connect either to a \fBMySQL\fR-server either using its native interface defined by \fBlibmysqlclient\fR, or to a generic SQL-server using \fBODBC\fR;+the choice may be configured during the build-process.+When connecting to a data-server using \fBODBC\fR, those connection-parameters specified in a \fB.odbc.ini\fR file (Server, Port, User, Password, Database), won't be available from the command-line.+.TP+\fB-i\fR \fIFile-path\fR, \fB--inputConfigFilePath=\fR\fIFile-path\fR+Read the configuration from the specified XML-file, as an alternative to [\fB--dataServerHost\fR, \fB--dataServerPort\fR, ...].+.TP+\fB--dataServerHost=\fR\fIHost-name\fR [\fB"127.0.0.1"\fR].+Define the host on which to look for the data-server holding the configuration, as an alternative to \fB--inputConfigFilePath\fR.+.br+CAVEAT: this option is unavailable from the command-line when connecting via \fBODBC\fR.+.TP+\fB--dataServerPort=\fR\fIInt\fR [\fB3306\fR]+Define the port on which to attempt connection to the referenced data-server.+.br+CAVEAT: this option is unavailable from the command-line when connecting via \fBODBC\fR.+.TP+\fB--dataServerUserId=\fR\fIString\fR+Define the user-id with which to log-onto the referenced data-server;+cf. \fB--databaseUserId\fR.+.br+CAVEAT: this option is unavailable from the command-line when connecting via \fBODBC\fR.+.TP+\fB--dataServerPassword=\fR\fIString\fR+Define the password required for authentication with the referenced data-server; cf. \fB--databasePassword\fR.+.br+CAVEAT: this option is unavailable from the command-line when connecting via \fBODBC\fR.+.TP+\fB--databaseName=\fR\fIString\fR [\fBweekdaze\fR]+Define the database on the referenced data-server.+.br+CAVEAT: this option is unavailable from the command-line when connecting via \fBODBC\fR.+.TP+\fB--databaseUserId=\fR\fIString\fR+Identify a specific user's configuration amongst all those in the referenced database; typically one's email-address, since this is naturally unique;+cf. \fB--dataServerUserId\fR.+.TP+\fB--databasePassword=\fR\fIString\fR+Define the password for the user's configuration in the referenced database; cf. \fB--dataServerPassword\fR.+.TP+\fB--databaseProjectName=\fR\fIString\fR+Define the project, amongst those owned by the referenced database user-id, in the referenced database, from which to read the configuration.+.SS Execution+Each option overrides a similarly named configuration-field in "\fBexecutionOptions\fR", where they're more completely described.+.TP+\fB--fecundityDecayRatio=\fR\fIFloat\fR+.TP+\fB--inputStudentViewTimetable=\fR\fIFile-path\fR+.TP+\fB--minimumPopulationDiversityRatio=\fR\fIFloat\fR+.TP+\fB--nInitialScouts=\fR\fIInt\fR+.TP+\fB--optimiseLessonCriteriaWeights='(\fR\fIInt\fR, \fIFloat\fR, \fIFloat\fR\fB)'\fR [\fB(0\fR, \fB1\fR, \fB0.5)\fR]+.TP+\fB--permitTemporaryStudentBodyMerger\fR[\fB=\fR(\fBFalse\fR|\fBTrue\fR)]+.TP+\fB-r\fR[\fIInt\fR], \fB--randomSeed\fR[\fB=\fR\fIInt\fR]+This option takes an optional integral argument with which to seed the single pseudo-random number-generator used for all random operations.+.br+In the absence of the whole field, the random-number generator will be seeded unpredictably from the operating-system.+In the absence of the integer-argument, \fB0\fR will be inferred.+.TP+\fB--reduceStudentBodyRegister\fR[\fB=\fR(\fBFalse\fR|\fBTrue\fR)]+.TP+\fB--removeRedundantCourses\fR[\fB=\fR(\fBFalse\fR|\fBTrue\fR)]+.SS Generic Program-information \" Request ancillary information.+.PP+These options govern the output of ancillary information.+The application will terminate after performing the requested action.+.TP+\fB-?\fR, \fB--help\fR+Print this help-text.+.TP+.B --printInputOptionsXMLDTD+Generate a rough Document Type Definition, defining the XML-format of the input-options configuration-file.+.br+CAVEAT: the resulting DTD must be manually amended to identify "\fBIMPLIED\fR", "\fBID\fR", & "\fBIDREF\fR" attributes.+.br+See the packaged instance \fBdtd/weekdaze.dtd\fR.+.TP+\fB--printTimetableXMLDTD=\fR(\fBLocationView\fR|\fBStudentView\fR|\fBTeacherView\fR)+Generate a rough Document Type Definition, defining the XML-format of a timetable viewed from the specified perspective.+.br+See the packaged instances; \fBdtd/locationViewTimetable.dtd\fR, \fBdtd/studentViewTimetable.dtd\fR & \fBdtd/teacherViewTimetable.dtd\fR.+.TP+\fB-v\fR, \fB--version\fR+Print version-information.+.SS Output \" Defines how to format the results.+These options govern the presentation of the solution.+.br+Most override a similarly named configuration-field in "\fBoutputOptions\fR" & in these cases no description is provided here;+see section-5 of the manual pages for this product.+.TP+\fB--displayRuntimeLog\fR[\fB=\fR(\fBFalse\fR|\fBTrue\fR)]+This option takes an optional boolean argument which specifies whether the run-time log is rendered in all "\fBfileFormat\fR"s of type "\fBXHTML\fR" (see section-5 of the manual pages for this product).+.br+The default value, in the absence of this option, is \fBFalse\fR,+but in the absence of only the boolean argument, \fBTrue\fR will be inferred.+.TP+\fB--nDecimalDigits=\fR\fIInt\fR+.TP+\fB--outputConfigFilePath=\fR\fIFile-path\fR+.TP+\fB--outputStudentViewTimetable=\fR\fIFile-path\fR+Append a file-path to those defined in "\fBfileFormat\fR" (see section-5 of the manual pages for this product),+to receive the resulting timetable, as seen from the perspective of \fIstudent-bodies\fR & formatted as XML; this can subsequently be referenced using \fB--inputStudentViewTimetable\fR.+.TP+\fB--verbosity=\fR(\fBSilent\fR|\fBNormal\fR|\fBVerbose\fR|\fBDeafening\fR)+.SH EXIT-STATUS+\fB0\fR on success, & non-\fB0\fR if an error occurs.+.SH EXAMPLES+.nf+.B weekdaze --randomSeed --inputConfigFilePath='xml/example_08.xml' --outputStudentViewTimetable='/tmp/studentViewTimetable_08.xml' +RTS -N -RTS >/tmp/timetable_08.xhtml;+.fi+.IP \(bu+Note that the random-seed's default value of \fB0\fR has been accepted.+.IP \(bu+One of the packaged examples has been referenced (using a relative path which you may need to adjust).+.IP \(bu+An XML-version of the solution has been requested, in case it might need to be fed-back as the initial state for a subsequent run.+.IP \(bu+The run-time system has been instructed to use an appropriate number of CPU-cores to exploit the parallelism in the implementation.+.IP \(bu+The result is returned on standard-output, which has been redirected to a file.+.PP+.nf+\fBcd\fR 'sql/MySQL/' \fB&& cat\fR 'weekdazeCreate.sql' 'weekdazeTriggers.sql' | \fBmysql --host=\fR\fIhost\fR \fB--database=\fR'weekdaze' \fB--user=\fR'root' \fB--password;\fR+.fi+.IP \(bu+The *nix-specific command to define the structure of a \fBMySQL\fR-database in which to store configuration.+.IP \(bu+A \fBMySQL\fR data-server must be running on \fIhost\fR (typically \fBlocalhost\fR).+.IP \(bu+A database arbitrarily called "\fBweekdaze\fR" was referenced, & this must exist (though potentially empty) on the data-server.+.IP \(bu+The database-password is interactively read from standard-input; assuming one has been defined.+.PP+.nf+.B weekdaze --databaseUserId='example@bogus.tld' --databaseProjectName='example_01' | less;+.fi+.IP \(bu+The executable was in this instance built with the \fBCabal\fR-flag "\fB-fHDBC-mysql\fR" to connect to the data-server using the native \fBMySQL\fR-interface,+so data-server connection-parameters had to be specified on the command-line, rather than via a \fB.ODBC.ini\fR file.+.br+I could also have explicitly specified \fB--dataServerHost\fR='127.0.0.1' \fB--dataServerPort\fR='3306' \fB--dataServerUserId=\fR'root' \fB--databaseName=\fR'weekdaze',+but these are the defaults (though a less privileged database-user would be preferrable).+.br+The database-password is interactively read from standard-input.+.IP \(bu+Run the specified example from the database.+Since the database's schema has been designed for multi-user use as may be required when running from a web-server,+each example in the database belongs to a user (identified by there email-address to guarantee uniqueness); the corresponding email-address is specified.+.br+Each user in the database own many projects (i.e. example timetable-problems); a specific example is referenced.+.IP \(bu+The result on standard-output is paged.+.SH FILES+.TS+lb	lb+l	l+lb	l	.+File-name	Contents+=========	========+css/weekdaze.css	The default Cascading Style-sheet, used when rendering the \fBXHTML\fR-output, which defines; colours, fonts, images, & the spacing used within tables.+dtd/studentViewTimetable.dtd	The formal description of the XML-format for any initial timetable as seen from the perspective of \fIstudent-bodies\fR.+dtd/weekdaze.dtd	The formal description of the XML-format for the input configuration-file.+images/weekdazeControlFlow.pdf	A picture of the application's control-flow.+images/weekdazeIO.pdf	A picture of the application's I/O.+man/man5/weekdaze.5	Section-5 of the manual pages for this product, describing the configuration-file format.+sql/MySQL/*.sql	SQL-scripts used to define the database-structure, optionally including the example timetable-problems.+.TE+.SH AUTHOR+Written by Dr. Alistair Ward.+.SH BUGS+.SS "REPORTING BUGS"+.nf+Report bugs to "\fBweekdaze@functionalley.com\fR".+.fi+.SS Further Development+.IP \(bu+The ability to describe the \fIavailability\fR of \fIresource\fRs, is limited to whole \fIday\fRs rather than individual \fItime-slot\fRs.+This inhibits precise configuration of \fIteacher\fRs who're contracted to be available for only part of some of the \fIday\fRs in their working-week,+& prevents configuration of \fIlocation\fRs which are available for only part of some \fIday\fRs (perhaps because it's booked by something outside the domain of the current problem).+.IP \(bu+The \fIcourse\fRs taken by a \fIstudent\fR, are configured as either "\fIcore\fR" or "\fIoptional\fR" in the context of that \fIstudent\fR's education,+& don't reflect on their inherent worth.+This classification merely permits the application to attempt to limit any failures to meet a \fIstudent\fR's knowledge-requirements,+to those \fIcourse\fRs personally designated \fIoptional\fR.+\fICourse\fR-selection is assumed to be overseen by some external authority, to ensure that each \fIstudent\fR studies an appropriate set.+.br+One could alternatively qualify a \fIcourse\fR, with the credit a \fIstudent\fR would earn from studying it,+& require that the set of \fIcourse\fRs studied, should meet a minimum credit-threshold,+which would remove the requirement to oversee \fIcourse\fR-selection to ensure sufficient academic rigour.+.IP \(bu+There's currently no mechanism for exporting the results in a CSV-format suitable for import into a Management Information System, as may be used by a school to record other data.+Since the precise CSV-format is unknown, this requirement should probably be met by some external translator between the XML provided & the required CSV.+.IP \(bu+The splitting of a double-\fIlesson\fR over morning break, lunchtime, or a free \fIperiod\fR,+may for some \fIcourse\fRs be preferable to splitting it with a \fIlesson\fR in a different \fIsubject\fR,+but this distinction isn't currently addressed by the available criteria.+.IP \(bu+The application has neither any concept of the time-duration between \fItime-slot\fRs within any \fIday\fR,+nor of the geographic coordinates of any \fIlocation\fR, so it is unable to assess the feasibility of the journey between \fIlocation\fRs.+.IP \(bu+This application currently only caters for timetables spanning one week (the requirements for all other weeks, are assumed to be identical),+but timetables spanning multiple weeks,+are required either to facilitate scheduling of \fIcourse\fRs whose "\fBminimumConsecutiveLessons\fR" exceeds their "\fBrequiredLessonsPerWeek\fR".+The disadvantage in such multi-week timetables, is the difficulty in faultlessly following such a routine,+particularly if the \fIstudent\fRs are young & the timetables for each of the constituent weeks are utterly different,+so the most likely requirement is for a fortnightly timetable, where the alternative weeks varying only slightly.+.IP \(bu+Desirable \fItime-slot\fRs should be evenly allocated amongst similarly specified \fIcourse\fRs,+to avoid those \fIstudent\fRs on one of the \fIcourse\fRs gaining an unfair advantage over those on the other \fIcourse\fR.+.IP \(bu+The timetable for examination-level \fIstudent\fRs is more critical than those for other \fIstudent\fRs, & should be prioritised.+.IP \(bu+\fITeacher\fRs who offer a broad \fIservice\fR, may need to allocate their total teaching-time by department.+.SH COPYRIGHT+Copyright \(co 2013-2015 Dr. Alistair Ward+.PP+This program is free software: you can redistribute it &/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.+.PP+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.+.PP+You should have received a copy of the GNU General Public License along with this program. If not, see <\fBhttps://www.gnu.org/licenses/\fR>.+.SH "SEE ALSO"+.IP \(bu+Home-page: <\fBhttps://functionalley.com/WeekDaze/weekdaze.html\fR>.+.IP \(bu+Source-documentation is generated by \fBHaddock\fR, & is available in the distribution.+.IP \(bu+<\fBhttps://www.haskell.org/haddock/\fR>.+.IP \(bu+\fBman/man5/weekdaze.5\fR.+.IP \(bu+<\fBhttps://www.haskell.org/cabal/\fR>.
+ man/man5/weekdaze.5 view
@@ -0,0 +1,799 @@+.TH weekdaze 5+.SH DESCRIPTION+Both the description & the jargon employed are described in section-1 of the manual pages; "\fBman/man1/weekdaze.1\fR".+To prompt one to the existence of some special meaning, jargon has been distinguished by underscoring.+.SH CONFIGURATION+.PP+The packaged example configuration-files are largely self-describing,+but their structure is more rigorously defined by "\fBdtd/weekdaze.dtd\fR" (which is used in the application by a validating parser).+Whilst this DTD may define the permissible structure, it says nothing about the semantics, which is the domain of this document.+The corollary is that this document may not detail trivial XML-tags required for purely syntactic purposes,+& so it is intended to be read with both the DTD & one of the packaged examples, open for reference.+.br+This application can for greater relational integrity & slightly fewer features, can also read its configuration from a SQL-database.+The database-schema for which is defined in "\fBsql/*.sql\fR" & has been structured so that this application can be run from a website,+in that it caters for many isolated users, each with many independent timetable-problems.+.br+In the following description, default configuration-values, are where relevant defined in brackets following their identifiers.+.br+Some of the configuration can also be over-ridden by command-line options; see \fIsection-1\fR of the man-pages.+.SS Overview+The top level of the file is divided into:+.TP 19+.B configVersion+An XML-element containing the ordered list of integers defining the version of the configuration-structure.+.TP+.B executionOptions+Defines the details of the solution-algorithm.+This part of the configuration is independent of the specific timetable-problem, & consequently typically persists between problems.+.TP+.B outputOptions+Defines the presentation of the solution.+This part of the configuration is independent of the problem, & consequently typically persists between problems.+.TP+.B problemParameters+Defines the problem, & is therefore highly volatile.+.SS executionOptions+This is an XML-element containing the following XML-tags.+.TP+.B randomSeed+This optional XML-attribute takes an integer with which to seed the unique pseudo-random number-generator used for all the application's random operations.+In its absence, the pseudo-random number-generator will be seeded from the operating-system, an unpredictable sequence will result,+& the application may produce different solutions to the same problem, each time it is run.+The evolutionary lineage resulting from each choice of seed may differ,+but since there are conceptually infinite possible seeds & a finite number of solutions to the configured problem, some must ultimately converge.+Changing the seed can sometimes produce a radically different & potentially superior solution.+This feature is required for performance-testing where repeatability is required,+but may also be useful if one wants to generate a similar timetable after a small change to either the configuration or the initial state (see "\fBinputStudentViewTimetable\fR").+.br+Even with the same seed, the pseudo-random sequence depends on the platform on which the application was compiled.+.TP+.B traversalOrder+During the "\fBInitial Deterministic Timetable\fR" (see section-1 of the man-pages),+the three-dimensional structure of the timetable is constructed using a raster-scan,+which visits each coordinate, sequentially booking \fIlesson\fRs.+This raster-scan can be constructed using any of the 48 permutations of \fBaxis\fR-order & \fBsense\fR of travel along each.+Because the axes represent different concepts, their order within the raster, alters the character of the solution.+The sense of travel along each axis also alters the solution,+though unless any of the criteria defined in "\fBproblemParameters\fR" break symmetry, it will merely be a mirror-image.+.br+This optional XML-element permits specification of the raster-scan.+The required order of the three axes is specified as a triple, the first XML-element of which defines the "\fBaxis\fR" (& optionally the "\fBsense\fR") along which change is slowest,+& the last of which represents the axis (& optionally the sense) along which change is most rapid.+If the sense of travel along any axis is unspecified then both will be tried.+.br+Since it can be difficult to guess in advance which permutation will result in the best solution (though the 2 permutations matching "(\fB+ObserverId\fR,\fB+TimeslotId\fR,\fBDay\fR)" seem to perform slightly above average),+the default is to evaluate them all & select the best according to the weighted mean over the \fItimetable-criteria\fR.+The additional time required, is typically small (especially where there's hardware to support parallel execution)+compared to that required by the subsequent improvement of the solution using various \fIevolution-strategies\fR.+.TP+.B inputStudentViewTimetable+As an alternative to defining the "\fBtraversalOrder\fR", one can specify the path to a file from which the initial timetable can be read;+typically created by a previous call to this application (see '\fBxml view="StudentView"\fR', or the command-line option "\fB--outputStudentViewTimetable\fR").+This allows one to adjust the configuration to account for small changes,+or to manually amend the solution in an attempt to compensate for some feature which the configuration doesn't address,+whilst retaining some hope that the final solution will be similar to the original.+It also gives the user enough rope to hang themselves (i.e. destabilise the application),+& though some checks are performed on the validity of the imported \fIstudent-view timetable\fR,+there are probably ways that haven't been envisaged,+& even those that have, can be individually deactivated via the switches in "\fBtimetableValidationSwitches\fR".+.br+Whilst tightening a constraint in "\fBproblemParameters\fR",+will typically require corresponding changes to the imported \fIstudent-view timetable\fR, until it complies with this new requirement,+relaxing a constraint is relatively safe; e.g.:+.TS+lb	lb	lb+l	l	l+li	l	l	.+Resource	Attribute	Safe Change+========	=========	===========+group	"\fBmeetingTimes\fR"	Reduce+location	"\fBcapacity\fR"	Increase+location	"\fBfacilities\fR"	Increase+teacher	"\fBservice\fR"	Expand+teacher	\fIcourse\fR/"\fBsynchronisationId\fR"	Remove+teacher	\fIcourse\fR/"\fBmaximumClassSize\fR"	Increase or remove+teacher	\fIcourse\fR/"\fBminimumConsecutiveLessons\fR"	Reduce+teacher	\fIcourse\fR/"\fBrequiredFacilities\fR"	Reduce+teacher	\fIcourse\fR/"\fBtimeslotRequest\fR"/"\fBideally\fR"	Any+teacher	"\fBfreePeriodPreference\fR"	Any+teacher	"\fBgroupMembership\fR"	Reduce+teacher	"\fBspecialtyTopic\fR"	Any+teacher	"\fBmaximumTeachingRatio\fR"	Increase+student-body	"\fBfreePeriodPreference\fR"	Any+student-body	"\fBgroupMembership\fR"	Reduce+student-body	"\fBknowledgeRequirements\fR"	Migrate a \fIsubject\fR between "\fBcore\fR" & "\fBoptional\fR" sections+student-body	"\fBstudentId\fR"s	Reduce+student-body	"\fBteachingRatio\fR"	Increase, with compensatory increase in "\fBknowledgeRequirements\fR"+	"\fBavailability\fR"	Increase+.TE+.TP+.B evolutionStrategies+The mutation of each candidate timetable involves partial depletion followed by reconstruction.+The reconstruction phase can (for any \fIevolution-strategy\fR) be performed by the application using either of two constructors;+.TS+l	l	.+\fIdeterministicConstructor\fR	which uses the \fIlesson-criteria\fR in an attempt to select the best \fIlesson\fR to place in each \fItime-slot\fR.+\fIrandomConstructor\fR	which merely selects a \fIlesson\fR randomly, from those which are viable.+.TE+.sp 1+The former is far more effective, but the optimum timetable might only be reached by means of some sub-optimal \fIlesson\fR-selections,+which can only be taken by the "\fIrandomConstructor\fR".+.br+One can define the \fIfecundity\fR (i.e. how large a population of candidate solutions to breed) depending on which constructor is used,+for each of the \fIdepletion-strategies\fR (defined in section-1 of the man-pages).+.sp 1+.nf+.B synchronisedCourseByDayMutation+.B synchronisedCourseMutation+.B excessRunlengthMutation+.B homogeneousStudentViewLessonMutation+.B incompleteCourseMutation+.B randomLessonMutation+.B singletonStudentClassMutation+.B splitSessionMutation+.B studentBodyCombinationMutation+.B studentViewTimetableForDayMutation+.B studentViewTimetableForWeekMutation+.B synchronousLessonMutation+.fi+.sp 1+CAVEAT: the default \fIfecundity\fR of \fB0\fR, deactivates the corresponding \fIevolution-strategy\fR.+.sp 1+N.B.: some of these \fIdepletion-strategies\fR will be irrelevant in the context of a given problem; e.g. "\fBsynchronisedCourseMutation\fR" where no \fIsynchronised courses\fR have been defined;+but under these circumstances, the irrelevant \fIdepletion-strategy\fR takes a negligible time,+so there's little to be gained from manually zeroing the \fIfecundity\fR of each of the corresponding constructors.+.sp 1+\fBrandomLessonMutationNTrials\fR [\fB256\fR]+.br+The number of random trials to use in "\fBrandomLessonMutation\fR".+.sp 1+\fBrandomLessonMutationNTimeslots\fR [\fB3\fR]+.br+The number of \fIlesson\fRs to un-book in each random trial during "\fBrandomLessonMutation\fR".+.sp 1+\fBstudentViewTimetableForDayMutationNDays\fR [\fIall\fR]+.br+The number of \fIday\fRs to un-book in "\fBstudentViewTimetableForDayMutation\fR".+If unspecified, then all valid values will be tried.+.sp 1+\fBstudentViewTimetableForWeekMutationNTrials\fR [\fB16\fR]+.br+The number of random trials to use in "\fBstudentViewTimetableForWeekMutation\fR".+.sp 1+\fBstudentViewTimetableForWeekMutationNTimeslots\fR [\fB4\fR]+.br+The number of \fIlesson\fRs to un-book in each random trial during "\fBstudentViewTimetableForWeekMutation\fR".+.sp 1+\fBfecundityDecayRatio\fR [\fB0.5\fR]+.br+The factor (in the closed unit-interval \fB[0,1]\fR) by which the \fIfecundity\fR of the breeding-program for future generations, is multiplied (& therefore exponentially reduced),+when the \fIpopulation-diversity ratio\fR falls beneath "\fBminimumPopulationDiversityRatio\fR".+.sp 1+Each generation of the evolution of the timetable, involves breeding a population of candidate solutions (of size \fIfecundity\fR),+then sparking multiple threads, to evaluate the fitness of each.+This scales well on a multi-core machine, but if too many candidates are generated, inefficiency begins to creep in (even if CPU-cores are available to support them);+either because more superior solutions are found, than are selected as parents for a subsequent generation;+or because some mutations are identical, resulting in duplication of effort.+Consequently, the initial \fIfecundity\fR is reduced by a feedback-loop, which monitors the \fIpopulation-diversity ratio\fR of the candidates,+& should it be observed to fall beneath a critical threshold,+the \fIfecundity\fR of the breeding-program for future generations, is decreased by the specified factor.+.sp 1+\fBminimumPopulationDiversityRatio\fR [\fB0.5\fR]+.br+The \fIpopulation-diversity ratio\fR (in the closed unit-interval \fB[0,1]\fR), beneath which a reduction in the \fIfecundity\fR of the breeding-program for future generations,+by a factor of "\fBfecundityDecayRatio\fR", is triggered.+.sp 1+\fBnInitialScouts\fR [\fB1\fR]+.br+Each generation of the evolution of the timetable, involves breeding a population of candidate solutions,+from which the best (even when less fit than their parent) few are selected.+Each selected scout is used independently to seed the breeding of a sub-generation of candidates from which one fewer scouts are then selected.+The resulting family-tree, sprouts fewer branches with each successive generation, & so eventually withers.+The best from all the scouts (nodes) in this family-tree, is then compared with the fitness of the original parent;+& is either found to be fitter, & consequently used to re-start this process (i.e. this paragraph),+or is found to be less fit, & the evolutionary process is terminated.+.TS+lb	lb	lb	lb	lb+lb	lb	lb+lb	lb+l	l	l	l	l+r	r	r	r	l	.+nInitialScouts	Inferior	Breeding-	Total Scouts	Behaviour+	Generations	sessions+	Tolerated+==============	===========	===============	=================	=========+0	0	?	?	A variable number of scouts is used. Each candidate comparing equal best, & better than their parent, is selected. This results in monotonically increasing fitness (equivalent to a hill-climbing algorithm), & might result in a very wide search, but is typically effective.+1	0	1	1	Only the best child is selected from the single breeding-session & compared with the parent; no inferior candidates can propagate to subsequent generations. This results in monotonically increasing fitness (equivalent to a hill-climbing algorithm), & has the disadvantage that it can become trapped in a local maximum solution; actually such traps can still be escaped if the \fIvariation operation\fRs (i.e. mutations) permit large enough steps across the solution-space.+2	1	3	4	The best two scouts are selected from the breeding-session in the first generation; & from each independently bred second generation, the single best scout is selected. This differs conceptually in that one generation of inferior children is tolerated; though to be successful, @ least one of the four scouts (two children & two grandchildren), must be fitter than the original parent.+3	2	10	15	The best three scouts are selected from the breeding-session in the first generation; & from each independently bred second generation, the best two scouts are selected; & from each independently bred third generation, the single best scout is selected. Two inferior generations are tolerated; though to be successful, @ least one of the fifteen scouts (three children, six grandchildren & six great-grandchildren), must be fitter than the original parent.+n	n-1	X(n)=1+n*X(n-1)	Y(n)=n*[1+Y(n-1)]	Execution-time is approximately proportional to (X(n) / n), which is approximately (n - 1)\fB!\fR. Though the best scout is never worse than that found from fewer initial scouts, the improvement doesn't typically justify the additional effort; except that it makes the evolutionary process less prone to premature termination than when using a smaller number of scouts, where there's a greater chance that none are better than their parent. Such levels result in a wider search of the solution-space, & may be employed in desperation when tackling timetable-problems which have resisted one's initial solution-attempt; one can see an example of this in section-1 of the manual pages for this product.+.TE+.TP+.B lessonCriteriaWeights+When constructing a timetable the solution-algorithm determines the set of all possible \fIlesson\fRs, which may be booked @ a specific \fItime-slot\fR,+then selects the best according to the weighted mean of various criteria.+One can vary each fractional weight within the closed unit-interval \fB[0,1]\fR, which @ the lower bound disables the associated criterion.+.br+These criteria are merely an ad-hoc heuristic, used to construct a viable timetable;+after construction, timetables may be compared for fitness using "\fBtimetableCriteriaWeights\fR".+.br+This optional XML-element contains the fractional weights (each defaulting to \fB0\fR) applied to the respective values of these criteria.+.br+CAVEAT: this is rather esoteric & it is probably best merely to copy the criteria-weights, from the most appropriate of the packaged examples.+One can use "\fBoptimiseLessonCriteriaWeights\fR", to improve the specified weights, but this typically takes more time than it saves.+.TS+lb+l+lb	l	.+Criterion-weight+================+areResourcesReused	A \fIlesson\fR is preferred, if the required \fIresource\fRs (\fIlocation\fRs & \fIteacher\fRs) are shared with other \fIstudent-bodies\fR, by temporarily merging them into a single larger \fIstudent-class\fR.+greatestMinimumConsecutiveLessons	A \fIlesson\fR is preferred, if the \fIcourse\fR's "\fBminimumConsecutiveLessons\fR" is larger, since this makes it harder to book later, into the smaller spaces remaining.+greatestRemainingCourseLessons	A \fIcourse\fR is preferred, if it has greater un-booked \fIlesson\fRs, since a \fIcourse\fR requiring only one \fIlesson\fR can be booked on any \fIday\fR.+greatestSynchronisedCourseSetSize	A \fIcourse\fR is preferred, if it is a member of a larger set of \fIsynchronised courses\fR; it seems prudent to book the most constrained \fIcourse\fR's \fIlesson\fRs, early.+isCoreKnowledgeRequirement	A \fIsubject\fR is preferred, if it is categorised by the \fIstudent\fR, as a "\fBcore\fR" \fIknowledge-requirement\fR.+isSpecialistInTopic	A \fIteacher\fR is preferred, if their "\fBspecialtyTopic\fR" matches the proposed "\fBtopic\fR".+matchCourseClassSizeToLocationCapacity	A \fIlocation\fR is preferred, the closer its "\fBcapacity\fR" matches the \fIcourse\fR's optional "\fBmaximumClassSize\fR"; provided it's sufficient.+maximiseRelativeFacilityUtilisation	A \fIlocation\fR is preferred, the more its "\fIfacilities\fR" are used; cf. "\fBminimiseWasteOfScarceFacilities\fR", which tries to make a distinction based on the type of the wasted \fIfacility\fR.+maximiseStudentClassSizeOverCourseClassSize	A \fIcourse\fR is preferred, the more its "\fBmaximumClassSize\fR" is filled by the proposed \fIstudent-class\fR.+maximiseStudentClassSizeOverLocationCapacity	A \fIlocation\fR is preferred, the more its "\fBcapacity\fR" is filled by the proposed \fIstudent-class\fR.+minimiseBookingAtAnotherCoursesSpecifiedTime	A booking-\fItime\fR is preferred, if there's minimal probability that \fIcourse\fRs for the \fIstudent-body\fR's other \fIknowledge-requirements\fR, will require that \fItime\fR according to "\fBtimeslotRequest\fR/\fBspecifically\fR"; the probability becomes a certainty for those \fIknowledge-requirement\fRs which can only be satisfied by one \fIcourse\fR.+minimiseBookingOfLocationByOtherTeachers	A \fIlocation\fR is preferred, when booked by the fewest other \fIteacher\fRs.+minimiseDeviationFromTimeslotRequest	A \fIcourse\fR is preferred, if it is booked closer to any "\fBtimeslotRequest\fR".+minimiseInterCampusMigrationsOfStudents	A \fIcourse\fR is preferred, if inter-\fBcampus\fR migrations of \fIstudent\fRs are minimised.+minimiseInterCampusMigrationsOfTeachers	A \fIcourse\fR is preferred, if inter-\fBcampus\fR migrations of \fIteacher\fRs are minimised.+minimiseStudentBodyCombinations	A \fIlesson\fR is preferred, when the number of \fIstudent-body combination\fRs is minimised.+minimiseTeachersLocusOperandi	A \fIlocation\fR is preferred, if the size of \fIteacher\fR's locus-operandi is minimised; based merely on the number of distinct \fIlocation\fRs booked, rather than the distance between them.+minimiseWasteOfScarceFacilities	A \fIlesson\fR is preferred, if the \fIlocation\fR's unused "\fIfacilities\fR", are commonly available elsewhere; cf. "\fBmaximiseRelativeFacilityUtilisation\fR", which treats all \fIfacilities\fR equally.+.TE+.TP+.B optimiseLessonCriteriaWeights+This XML-element governs the repeated random mutation of the specified \fIlesson-criteria\fR weights,+to maximise the weighted mean over the values of heterogeneous \fItimetable-criteria\fR, when evaluating the \fIinitial deterministic timetable\fR.+.br+No change is made to \fIlesson-criteria\fR weights which were originally set to zero.+If "\fBtraversalOrder\fR" has been specified, then the optimisation will be performed on the specified subset of rasters.+The resulting weights could be copied to other similar problems, where they may be reasonable initial values.+.br+This optional procedure can only work when it is possible to improve the resulting solution by changing the \fIlesson-criteria\fR weights;+if the solution-space is too small to allow the weights of \fIlesson-criteria\fR to drive the solution to a better place, then this process will merely take a long time.+It's also necessary that the weights of \fItimetable-criteria\fR are well chosen, otherwise the weights of \fIlesson-criteria\fR will evolve towards the wrong target.+The basis for this optimisation-process is rather flimsy.+.TS+lb	lb	lb+l	l	l+lb	l	l	.+Attribute	Default	Explanation+=========	=======	===========+nTrials	0	The number of random trials to use when attempting to improve the specified \fIlesson-criteria weights\fR.+changeMagnitude	1	This positive number governs the size of the random change applied independently to each \fIlesson-criterion weight\fR. The chosen value permits an increase or decrease by a factor of up to \fB1 + x\fR in the weight of a \fIlesson-criterion\fR.+reductionFactor	0.9	The factor in the closed unit-interval, by which "\fBchangeMagnitude\fR" is multiplied after each success.+useMeanOverRasterScans	False	Whether to accept a proposed set of \fIlesson-criteria weights\fR on the basis of the mean (as opposed to the maximum) over the specified raster-scans, of the weighted mean over all heterogeneous timetable-criteria. Use of the mean over the raster-scans reduces the chance that weighted mean over heterogeneous \fItimetable-criteria\fR for the initial deterministic timetable was a freak result, & as such an inappropriate set of \fIlesson-criteria weights\fR with which to attempt to evolve the solution. Use of the maximum over the raster-scans will result in a good initial deterministic timetable, but it may not perform well during the subsequent evolution.+.TE+.TP+\fBpermitTemporaryStudentBodyMerger\fR [\fBTrue\fR]+The configured \fIstudent-bodies\fR may be small, & can therefore be automatically merged into larger \fIstudent-class\fRes,+to more efficiently use the \fIservice\fRs offered by the available \fIteacher\fRs.+Such transient mergers persist only for the tuition of a specific \fIcourse\fR,+& those \fIstudent-bodies\fR may be merged differently or not @ all, during the tuition of another \fIcourse\fR.+.br+Certain incompatible \fIlesson-criteria\fR weights are zeroed depending on the value of this option;+.br+if "\fBTrue\fR", then the size of the \fIstudent-class\fR may grow, so "\fBmaximiseStudentClassSizeOverCourseClassSize\fR" & "\fBmaximiseStudentClassSizeOverLocationCapacity\fR" are invalid;+.br+if "\fBFalse\fR", then "\fBminimiseStudentBodyCombinations\fR" & "\fBareResourcesReused\fR" are irrelevant.+.br \" Student-body Combinations+When the constraints imposed by "\fBproblemParameters\fR" are tight, it may be necessary for the \fIlesson\fRs of a single \fIcourse\fR,+to be composed from different combinations of \fIstudent-bodies\fR; e.g. \fIstudent-body\fR \fBA\fR may combine with \fIstudent-body\fR \fBB\fR,+to form a \fIstudent-class\fR to study a specific \fIsubject\fR on one \fIday\fR, but may also combine with \fIstudent-body\fR \fBC\fR to form a different class,+to study the same \fIsubject\fR on another \fIday\fR.+Whilst clearly undesirable, this scenario may be better than one \fIstudent-body\fR not learning that \fIsubject\fR due to lack of \fIresource\fRs.+See the \fIlesson-criterion\fR "\fBminimiseStudentBodyCombinations\fR".+.br+This boolean switch allows such temporary mergers to occur.+.TP+\fBreduceStudentBodyRegister\fR [\fBTrue\fR]+The efficiency of the application is partially dependent on the number of \fIstudent-bodies\fR.+When the similarity in the requirements of the member-\fIstudent\fRs is driven by some common external process (e.g. a rigid curriculum involving limited \fIsubject\fR-choice),+one would typically model that by manually partitioning them into \fIstudent-bodies\fR during configuration.+If after configuration, the requirements of some \fIstudent-bodies\fR are coincidentally identical,+then this boolean switch enables their automatic discovery, & merges them to increase the efficiency of the application.+.br+These \fIstudent-bodies\fR, once composed, persist for the duration of this problem, & will be booked into the timetable as an atomic unit.+If as a result, the class-size becomes infeasibly large, then this option can be set to "\fBFalse\fR", preserving the original configuration.+.br+If "\fBverbosity\fR" is greater than minimum, then any such automatic mergers will be logged to \fIstandard error\fR.+.TP+\fBremoveRedundantCourses\fR [\fBTrue\fR]+By automatically removing \fIcourse\fRs from any "\fBteacherProfile\fR", which aren't required by any \fIstudent\fR, one can+improve the accuracy of the measurement of certain criteria used to evolve the timetable & expose certain anomalies regarding \fIsynchronised courses\fR.+.br+If "\fBverbosity\fR" is greater than minimum, then any such \fIcourse\fRs will be logged to \fIstandard error\fR.+.TP+\fBremovePointlessGroups\fR [\fBTrue\fR]+Whether to remove \fIgroup\fRs from the "\fBgroupCatalogue\fR", for which zero \fImeeting\fRs have been scheduled.+.br+If "\fBverbosity\fR" is greater than minimum, then any such \fIgroup-id\fR will be logged to \fIstandard error\fR.+.TP+\fBremoveUnsubscribedGroups\fR [\fBTrue\fR]+Whether to remove \fIgroup\fRs from the "\fBgroupCatalogue\fR", to which neither \fIstudent-bodies\fR nor \fIteacher\fRs have subscribed.+.br+If "\fBverbosity\fR" is greater than minimum, then any such \fIgroup-id\fRs will be logged to \fIstandard error\fR.+.TP+.B timetableCriteriaWeights+The various "\fBevolutionStrategies\fR", are from any current timetable used to breed a population of alternative candidate solutions,+from which the best according to a weighted mean over various criteria, can be selected.+One can vary each fractional weight within the closed unit-interval \fB[0,1]\fR, which @ the lower bound disables the associated criterion.+.br+This optional XML-element contains the fractional weights (each defaulting to \fB0\fR) applied to the respective values of these criteria.+.TS+lb+l+lb	l	.+Criterion-weight+================+maximiseComplianceWithFreePeriodPreferences	A timetable is preferred, when it complies with any "\fBfreePeriodPreference\fR" of \fIstudent-bodies\fR & \fIteacher\fRs.+maximiseMeanRatioOfStudentClassSizeToLocationCapacity	A timetable is preferred, when the mean over all \fIbooking\fRs, of the ratio of the size of the \fIstudent-class\fR to the \fIlocation\fR's "\fBcapacity\fR", is greatest.+maximiseMeanStudentClassSize	A timetable is preferred, when the mean size of \fIstudent-class\fRes, is greatest.+maximiseSynchronisationOfSynchronisedCourses	A timetable is preferred, when the \fIlesson\fRs of \fIsynchronised courses\fR are consistently synchronised.+maximiseWeightedMeanStudentBodyUtilisationRatio	A timetable is preferred, when the mean over all \fIstudent-bodies\fR, of the time currently booked to the total time in their working-week, is maximised. It doesn't distinguish between "\fBcore\fR" & "\fBoptional\fR" \fIknowledge-requirements\fR like "\fBminimiseMeanRatioOfIncompletelyBookedCoreKnowledge\fR" & "\fBminimiseMeanRatioOfIncompletelyBookedOptionalKnowledge\fR", but it does value partially booked \fIcourse\fRs.+minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	A timetable is preferred more, the closer \fIlesson\fRs are booked to any \fIideal timeslot-request\fR for their \fIcourse\fR.+minimiseDispersionOfStudentFreePeriodsPerDay	A timetable is preferred, when each \fIstudent-body\fR's free \fIperiod\fRs are spread evenly across their working-week.+minimiseDispersionOfTeacherFreePeriodsPerDay	A timetable is preferred, when each \fIteacher\fR's free \fIperiod\fRs are spread evenly across their working-week.+minimiseDispersionOfTeacherWorkload	A timetable is preferred, when the relative workload between all \fIteacher\fRs, is similar.+minimiseMeanInterCampusMigrationsOfStudents	A timetable is preferred, when the average over all \fIstudent\fRs, of the number of inter-\fBcampus\fR migrations in a week, is minimised.+minimiseMeanInterCampusMigrationsOfTeachers	A timetable is preferred, when the average over all \fIteacher\fRs, of the number of inter-\fBcampus\fR migrations in a week, is minimised.+minimiseMeanLocationChangesOfTeachers	A timetable is preferred, when the average over all \fIteacher\fRs, of the number of changes in their \fIlocation\fR during the week, is minimised; cf. "\fBminimiseMeanLocusOperandiOfTeachers\fR", which merely counts the number of distinct \fIlocation\fRs used.+minimiseMeanLocusOperandiOfTeachers	A timetable is preferred, when the average over all \fIteacher\fRs, of the size of their locus-operandi, is minimised; based merely on the number of \fIlocation\fRs, rather than the distance or the number of changes, between them.+minimiseMeanRatioOfIncompletelyBookedCoreKnowledge	A timetable is preferred, when the average over all \fIstudent-bodies\fR, of the ratio of incompletely booked "\fBcore\fR" \fIknowledge-requirements\fR, to all requirements, is minimised. All incomplete \fIcourse\fRs are valued equally, regardless of the extent; cf. "\fBmaximiseWeightedMeanStudentBodyUtilisationRatio\fR".+minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	A timetable is preferred, when the average over all \fIstudent-bodies\fR, of the ratio of incompletely booked "\fBoptional\fR" \fIknowledge-requirements\fR, to all requirements, is minimised. All incomplete \fIcourse\fRs are valued equally, regardless of the extent; cf. "\fBmaximiseWeightedMeanStudentBodyUtilisationRatio\fR".+minimiseMeanStudentBodyCombinationsPerLesson	A timetable is preferred, when the average number of combinations of \fIstudent-body\fR per \fIlesson\fR-definition, is minimised; ideally a \fIstudent-body\fR always studies a \fIsubject\fR, in a class composed from the same other \fIstudent-bodies\fR.+minimiseRatioOfConsecutiveEqualLessons	A timetable is preferred, when blocks of consecutive identical \fIlesson\fRs are booked, whose length least exceeds the \fIcourse\fR's "\fBminimumConsecutiveLessons\fR".+minimiseRatioOfSeparatedEqualLessonsWithinAnyDay	A timetable is preferred, when the \fIlesson\fRs of any \fIcourse\fR, are on any \fIday\fR, booked in one contiguous session.+.TE+.sp 1c+.br+The evolution-algorithm uses the weighted mean of these criteria, to select from candidate timetables, in a search for the optimum.+This raises the question of whether it's valid to compare the observed value of criteria which represent utterly different concepts;+how can a criterion which has the dimensions of time, meaningfully be included in a weighted mean with another criterion which has dimensions of length ?+To make these criteria comparable, they're all represented as dimensionless quantities, mapped into the closed unit-interval \fB[0,1]\fR;+e.g. by dividing by their maximum theoretical value.+This should reduce the question of what weight to apply to each, to the simple question of their relative significance to the user, in the context of the current problem;+the most important could be set to \fB1\fR, & the others proportionately less.+.br+Regrettably this seldom results in the desired outcome, because within a typical population of candidate solutions,+the observed value of some criteria may range across the entire unit-interval, while the observed value of others may be constrained to a minuscule portion.+Consequently, within the domain of this population of candidates, relatively large gains are possible for some criteria,+typically @ the expense of others, irrespective of the user-defined significance of the corresponding concepts.+The same parasitic effect may also result between criteria, even when the values typically found in the candidate population, range across spans of similar length,+but do so in different profiles, creating zones of sensitivity to the underlying concept they measure.+Whilst one may compensate for the former effect, by adjusting the weight applied to specific criteria,+that regrettably decouples the weight, from the user-defined significance of the concept being measured;+compensating for the latter effect would require a more complex mechanism that a single weight, & so far this hasn't been addressed.+Some criteria may result in contrary views on the fitness of a timetable;+e.g. "\fBminimiseRatioOfConsecutiveEqualLessons\fR" downgrades a timetable when the number of consecutive equal \fIlesson\fRs exceeds the \fIcourse\fR's "\fBminimumConsecutiveLessons\fR",+whereas "\fBminimiseMeanLocationChangesOfTeachers\fR" prefers the lack of a change to a \fIteacher\fR's \fIlocation\fR & "\fBminimiseMeanInterCampusMigrationOfStudents\fR" prefers the lack of any requirement to migrate to another \fBcampus\fR.+.br+Consequently, it is probably best to start by merely copying the criteria-weights, from the most appropriate of the packaged examples.+If some aspect of the resulting timetable isn't acceptable, set "\fBverbosity\fR" to "\fBDeafening\fR",+to discover which criteria benefited from the evolution, & ask whether you can afford to sacrifice some of the concepts they measure.+.TP+\fBzeroInappropriateOptions\fR [\fBTrue\fR]+If this boolean flag is \fBTrue\fR, then the weights of various \fIlesson-criteria\fR & \fItimetable-criteria\fR, & the \fIfecundities\fR of various \fIevolution-strategies\fR,+which are either unsuitable for or inappropriate to, the specified problem-parameters, will automatically be zeroed.+.SS outputOptions+This is an XML-element containing the following XML-tags.+.TP+.B fileFormats+An XML-element, containing a repeatable XML-element "\fBfileFormat\fR",+each of which is qualified by an XML-attribute named "\fBfilePath\fR" (a value of "\fB-\fR" will be interpreted as \fIstandard output\fR), & contains an XML-element named either;+"\fBXHTML\fR", which contains an optional XML-element "\fBstyle\fR";+or "\fBxml\fR", which contains an optional XML-attribute "\fBview\fR".+.br+Mmm, it might be easier to comprehend if you look @ the DTD & one of the examples.+.br+"\fBstyle\fR" in turn contains the following XML-tags, which relate purely to the XHTML-output (rather than to any xml-output).+.TS+l	l	.+\fBdisplayViews\fR [\fB[LocationView,StudentView,TeacherView]\fR]	An XML-element containing a list of XML-elements each called "\fBperspective\fR", each of which contains a single XML-attribute "\fBview\fR" (see below), which defines whether to display the timetable from that perspective. The three-dimensional matrix which defines a timetable, is inverted so that the axis which identifies the various \fIstudent-bodies\fR, is replaced by either one defining \fIlocation-id\fRs or one defining \fIteacher-id\fRs. The remaining two axes, representing the \fIday\fR of the week & the \fItime-slot\fR within each \fIday\fR, are displayed in all views. The same data are contained in each view, it's merely re-indexed.+\fBcssURL\fR	References the cascading style-sheet defining the required style. It can either be a fully qualified URL or a path into the local file-system. This XML-attribute is optional; in its absence, the packaged CSS-file will be referenced, which though adequate to render the packaged examples, will need to be tailored to appropriately depict (via a dedicated background colour or image) new \fBtopic\fRs as they're added to the curriculum.+\fBmergeDuplicateTimeslots\fR	Contains an XML-element called "\fBtimeAxes\fR", which defines boolean XML-attributes tagged by "\fBbyDay\fR" & "\fBbyTimeslotId\fR", defining whether adjacent identical \fItime-slot\fRs are merged. This reduces repetition, draws attention to duplicate \fIlesson\fRs, & uses the limited space efficiently. This XML-element is optional; the default is "\fBTrue\fR" for both XML-attributes.+\fBdisplayAxisLabels\fR	Contains an XML-element called "\fBtimeAxes\fR", which defines boolean XML-attributes tagged by "\fBbyDay\fR" & "\fBbyTimeslotId\fR", defining whether to label the axes of the output timetable. This XML-element is optional; the default is "\fBTrue\fR" for both XML-attributes.+\fBdisplayRuntimeLog\fR [\fBFalse\fR]	This boolean XML-attribute defines whether to display the runtime-log.+\fBdisplaySupplementaryInformation\fR [\fBTrue\fR]	This boolean XML-attribute defines whether additionally to display statistics, & summarise deviations between the solution & the configured requirements.+\fBweekend\fR [\fB["Saturday", "Sunday"]\fR]	An XML-element containing those \fIday\fRs which constitute the weekend, & which are rendered differently.+\fBgenerateLessonColourFrom\fR	An optional XML-attribute, which specifies a data-source (one of "\fBLesson\fR", "\fBSubject\fR", "\fBTopic\fR", "\fBLevel\fR" or "\fBResourceIds\fR"), from which to automatically generate an HTML-colour for the \fIlesson\fR when ultimately displayed. In the absence of any specification, the colour may be defined by the CSS-file specified via "\fBcssURL\fR".+\fBminimumContrastRatio\fR [\fB1/16\fR]	An optional XML-attribute, which defines the minimum acceptable contrast-ratio between the foreground lesson-colour generated according to "\fBgenerateLessonColourFrom\fR" and the complementary background-colour.+.TE+.sp 1+"\fBview\fR" has a value of; "\fBLocationView\fR", "\fBStudentView\fR", or "\fBTeacherView\fR"; depending on which view of the resulting timetable to export.+The precise format of the XML, is formally described by the corresponding packaged file; "\fBdtd/locationViewTimetable.dtd\fR", "\fBdtd/studentViewTimetable.dtd\fR", or "\fBdtd/teacherViewTimetable.dtd\fR".+.TP+.B outputConfigFilePath+An optional path to a file, into which the unprocessed configuration, still formatted as XML, should be written (overwriting any existing contents);+this can be useful to confirm that the specified input configuration has been interpreted correctly.+An accidentally miss-spelled XML-tag can only slip through the application's validation, if the \fBDOCTYPE\fR-declaration (which references "\fBdtd/weekdaze.dtd\fR") is removed from the top of the configuration-file.+.br+CAVEAT: the configuration written, deliberately doesn't include any command-line options (even though they may override the configuration);+a feature which is exploited to avoid writing the argument of the command-line option "\fB--outputConfigFilePath\fR",+which would otherwise create a self-overwriting configuration-file.+.TP+\fBnDecimalDigits\fR [\fB3\fR]+Defines the integral precision to which auxiliary floating-point data (see "\fBverbosity\fR") are logged;+it has no effect on the precision of the calculations performed by the application.+.TP+\fBstudentBodyMnemonicSeparator\fR [\fB" / "\fR]+Defines a string to be used as a separator when automatically joining the "\fBmnemonic\fR"s of \fIstudent-bodies\fR with identical "\fBstudentProfile\fR"s; this is only relevant when "\fBreduceStudentBodyRegister\fR" is "\fBTrue\fR".+The specified string must conform to the XML-standard for \fIcharacter-data\fR; i.e. it can't contain either '\fB&\fR' or '\fB<\fR'.+.TP+\fBverbosity\fR [\fBNormal\fR]+A string which defines the quantity of ancillary information which is logged to \fIstandard error\fR.+.TS+lb	lb+l	l+lb	l	.+Level	Output+=====	======+Silent	The lack of output might leave the user wondering whether anything is actually happening; it is, though it can take a long time.+Normal	The default-level. Delivers a progress-report on the reading, parsing & validation of the XML-configuration & any "\fBinputStudentViewTimetable\fR". Prints a "\fB.\fR" as each \fIevolution-strategy\fR is completed.+Verbose	Provides more detail when reading xml. Reports statistics (to a precision governed by "\fBnDecimalDigits\fR") on the values of criteria as the solution evolves.+Deafening	Enhances the statistics reported by "\fBVerbose\fR".+.TE+.sp 1+The latter two levels are unlikely to be intelligible to most users,+but allow one to adjust criteria to drive the solution in the desired direction.+.SS problemParameters+This is an XML-element containing the following XML-tags.+.TP+.B problemValidationSwitches+A set of boolean switches governing various runtime-checks on the remainder of the problem-parameters.+Should any of these obstruct the specification of unusual but intention requirements, they can individually be set to "\fBFalse\fR";+the results cannot be guaranteed, but it may provide the required silver bullet.+.br+Each XML-attribute is optional; "\fBTrue\fR" will be inferred from any omission.+The identifiers of these, prefix any error-message generated from the failure of the corresponding check.+.TS+lb	l	.+checkAvailabilityOfAnyGroupMember	Check that @ least one member, can attend each \fImeeting\fR of a \fIgroup\fR.+checkCapacityOfLocationsForMeetings	Check that any \fIlocation\fR, specified for the \fImeeting\fRs of a \fIgroup\fR, has adequate "\fBcapacity\fR".+checkCoursesForSynchronousSpecifiedTimes	Check that no \fIcourse\fRs, required to satisfy a \fIstudent\fR's \fIknowledge-requirement\fRs, specify the same \fIbooking-time\fR.+checkDuplicateMeetingLocationIds	Check that when more than one \fIgroup\fR requires the same \fIlocation\fR, that their \fImeeting-time\fRs are mutually exclusive.+checkDuplicateOwnLocationIds	Check that when more than one \fIteacher\fR claims a single \fIlocation\fR as their own, that their \fIworking-week\fRs are mutually exclusive.+checkForAlternativesToSynchronisedCourses	Ensure that \fIstudent\fRs can migrate easily between \fIsynchronised courses\fR, by prohibiting any \fIteacher\fR from offering an alternative \fIcourse\fR outside the set of \fIsynchronised courses\fR, but with an identical \fIsubject\fR to one of the member-\fIcourse\fRs.+checkForDuplicateStudentIds	Check that no "\fBstudentId\fR" has been defined in more than one \fIstudent-body\fR.+checkForIdleStudents	Check for \fIstudent-bodies\fR who require zero \fIsubject\fRs, but have allocated one or more \fItime-slot\fRs for teaching.+checkForIdleTeachers	Check for \fIteacher\fRs who offer zero \fIcourse\fRs, but have allocated one or more \fItime-slot\fRs for teaching.+checkForInvalidMeetingTimes	Check that all the \fItimeslot-id\fRs, used to define the \fImeeting-time\fRs of \fIgroup\fRs, are within permissible bounds.+checkForMultipleCoursesPerTeacherPerSynchronisationId	Check that no \fIteacher\fR offers more than one \fIcourse\fR with the same "\fBsynchronisationId\fR".+checkForNonExistentFacilities	Check for the existence in @ least one "\fBlocationProfile\fR", of all the "\fBrequiredFacilities\fR" for each \fIcourse\fR.+checkForNonExistentGroupIds	Check the existence of all "\fBgroupId\fR"s, referenced by \fIstudent-bodies\fR or \fIteacher\fRs.+checkForNonExistentMeetingLocationIds	Check the existence of all "\fBlocationId\fR"s, required for the \fImeeting\fRs of \fIgroup\fRs.+checkForNonExistentOwnLocationIds	Check the existence of all personal "\fBlocationId\fR"s, claimed by \fIteacher\fRs.+checkForOverloadedStudents	Check for \fIstudent-bodies\fR who have allocated zero \fItime-slot\fRs for teaching, but have requested one or more \fIsubject\fRs.+checkForSingletonSynchronisedCourses	Check for \fIteacher\fRs offering a \fIcourse\fR which is a singleton set of \fIsynchronised courses\fR.+checkForStudentsRequiringMultipleSynchronisedSubjects	Check for any \fIstudent-body\fR requiring more than one \fIsubject\fR from any one set of \fIsynchronised courses\fR.+checkForStudentsWithUnrealisableFreePeriodPreference	Check for any \fIstudent\fR whose "\fBfreePeriodPreference\fR", can never be realised because of the \fImeeting-time\fRs of \fIgroup\fRs of which they're members.+checkForSynchronisedCoursesWithDifferentIdealTimeslots	Check that \fIsynchronised courses\fR don't define "\fBtimeslotRequest\fR"s with different \fIideal timeslot-id\fRs.+checkForSynchronisedCoursesWithDifferentLessonsPerWeek	Check that \fIsynchronised courses\fR don't define different "\fBrequiredLessonsPerWeek\fR".+checkForSynchronisedCoursesWithExcessLessonsPerWeek	Check that \fIsynchronised courses\fR don't define a greater "\fBrequiredLessonsPerWeek\fR", than the number of \fItime-slot\fRs when all the interested \fIstudent-bodies\fR & required \fIteacher\fRs are simultaneously \fIavailable\fR.+checkForSynchronisedCoursesWithExcessSpecifiedTimes	Check that \fIsynchronised courses\fR don't have fewer "\fBrequiredLessonsPerWeek\fR" than the number of \fIbooking-time\fRs specified by the union of their "\fBtimeslotRequest\fR"s.+checkForSynchronisedCoursesWithExcessTimeslotRequests	Check that \fIsynchronised courses\fR don't specify via "\fBtimeslotRequest\fR"s, both \fIideal timeslot-id\fRs & precise \fIbooking-time\fRs; these are intended to be alternatives.+checkForSynchronisedCoursesWithoutSuitableLocations	Check for \fIsynchronised courses\fR which lack sufficient \fIlocation\fRs offering the "\fBrequiredFacilities\fR", which are simultaneously \fIavailable\fR to the \fIteacher\fRs & all interested \fIstudent-bodies\fR.+checkForSynchronisedCoursesWithUnavailableSpecifiedDays	Check for \fIsynchronised courses\fR which specify \fItime\fRs, on \fIday\fRs when not all the interested \fIstudent-bodies\fR & required \fIteacher\fRs, are \fIavailable\fR.+checkForTeachersWithUnrealisableFreePeriodPreference	Check for any \fIteacher\fR whose "\fBfreePeriodPreference\fR", can never be realised because of the \fImeeting-time\fRs of \fIgroup\fRs of which they're members.+checkIfStudentBodiesExceedTeachers	Check that there are sufficient \fIteacher\fRs, for the number of \fIstudent-bodies\fR, \fIavailable\fR on each \fIday\fR.+checkIfStudentBodySizeExceedsCapacityOfAllLocations	Check whether each \fIstudent-body\fR can be accommodated within the largest \fIavailable\fR \fIlocation\fR.+checkIfStudentBodySizeExceedsLocationCapacity	Check whether all \fIstudent-bodies\fR can be accommodated within the \fIlocation\fRs, \fIavailable\fR on each \fIday\fR.+checkIndependenceOfStudentTimeslotsRequestsAndMeetings	Check that \fIstudent-bodies\fR are members of \fIgroup\fRs which specify meeting-times (even those which don't mandate attendance), which match any of the specified booking-times of \fIcourse\fRs they must attend.+checkIndependenceOfTeacherTimeslotsRequestsAndMeetings	Check that \fIteachers\fR are members of \fIgroup\fRs which specify meeting-times (even those which don't mandate attendance), which match any of the specified booking-times of \fIcourse\fRs they must attend.+checkLocationsAvailabilityToSupportCourses	Check that there are sufficient \fIlocation\fRs, simultaneously available to at least one \fIstudent-body\fR & at least one \fIteacher\fR, to support the total number of \fItime-slot\fRs required for the \fIcourse\fRs offered by all \fIteacher\fRs.+checkLocationsForSynchronousSpecifiedTimes	Check there are enough \fIlocation\fRs in which to book \fIlesson\fRs of \fIcourse\fRs offered by different \fIteacher\fRs, which specify the same booking-time.+checkMeetingLocationsAvailability	Check that any \fIlocation\fR required for a \fIgroup\fR, is \fIavailable\fR @ all \fImeeting-time\fRs.+checkMinimumConsecutiveLessons	Check that a \fIcourse\fR's "\fBminimumConsecutiveLessons\fR" doesn't exceed the number of \fItime-slot\fRs per \fIday\fR.+checkNullGroupId	Check for null identifiers in the "\fBgroupCatalogue\fR".+checkNullLocationCatalogue	Check whether the "\fBlocationCatalogue\fR" is empty.+checkNullStudentBodyRegister	Check whether the "\fBstudentBodyRegister\fR" is empty.+checkNullTeacherRegister	Check whether the "\fBteacherRegister\fR" is empty.+checkOwnLocationsAvailability	Check for \fIteacher\fRs who've got their own \fIlocation\fR, that it's simultaneously \fIavailable\fR on @ least one \fIday\fR.+checkRequiredLessonsPerWeek	Check that no \fIcourse\fR is offered, which requires more \fIlesson\fRs per week, than the \fIteacher\fR works.+checkSimultaneousAvailabilityOfGroupMembers	Check that all the members of each \fIgroup\fR which both meets & mandates attendance, are simultaneously \fIavailable\fR.+checkStudentsAvailabilityForMandatoryMeetings	Check that \fIstudent\fRs are \fIavailable\fR for the \fImeeting-time\fRs of the \fIgroup\fRs of which they're members.+checkStudentsAvailabilityForSpecifiedTimes	Check that no \fIcourse\fR, required to satisfy a \fIstudent\fR's \fIknowledge-requirement\fRs, specifies a \fItime\fR, on a \fIday\fR when they're un\fIavailable\fR.+checkStudentsForMultipleLevelsOfSameTopic	Check that the \fIknowledge-requirement\fRs of each \fIstudent-body\fR, don't specify more than one \fBlevel\fR in any \fBtopic\fR.+checkStudentsForSynchronousMeetings	Check that \fIstudent\fRs aren't members of \fIgroup\fRs with synchronous \fImeeting-time\fRs.+checkStudentsLowerWorkloadBound	Check that \fIstudent\fRs request sufficient \fIsubject\fRs to fill their working-week to the required extent.+checkStudentsUpperWorkloadBound	Check that \fIstudent\fRs don't request more \fIsubject\fRs than can be booked in their working-week.+checkSubjectExistence	Check that all \fIsubject\fRs requested by \fIstudent\fRs, are included in the \fIservice\fRs offered by \fIteacher\fRs.+checkSuitableLocationsForKnowledgeRequirements	Check that there are suitable \fIlocation\fRs for each \fIknowledge-requirement\fR of each \fIstudent-body\fR.+checkTeachersAvailabilityForMandatoryMeetings	Check that \fIteacher\fRs are \fIavailable\fR for the \fImeeting-time\fRs of the \fIgroup\fRs of which they're members.+checkTeachersForSynchronousMeetings	Check that \fIteacher\fRs aren't members of \fIgroup\fRs with synchronous \fImeeting-time\fRs.+checkTeachersUpperWorkloadBound	Check that \fIteacher\fRs don't commit to more \fImeeting\fRs than they've time to attend.+checkTeachingCapacityBySubject	Check that there's sufficient teaching-capacity, to satisfy the demand by \fIstudent\fRs for each \fIsubject\fR. CAVEAT: This check is very lax. To maximise the efficiency with which \fIteacher\fRs are used, it is typically assumed that any \fIstudent-body\fR which can be temporarily merged into a \fIstudent-class\fR, (see "\fBpermitTemporaryStudentBodyMerger\fR"); no subsequent account is taken of whether both \fIteacher\fRs & \fIlocation\fRs, can cope with the size of the resulting \fIstudent-class\fR. Additionally, an error is raised only when the demand for a \fIsubject\fR exceeds the total supply, without any account of whether some of the \fIteacher\fRs, are simultaneously required to support the other \fIcourse\fRs in their \fIservice\fR.+checkTimeslotIdBounds	Check the range of \fItimeslot-id\fRs defined, is sufficient.+checkTimeslotRequests	Check that all "\fBtimeslotRequest\fR"s reference either a valid \fItimeslot-id\fR or valid \fItime\fRs.+.TE+.TP+.B timetableValidationSwitches+A set of boolean switches governing various checks used to validate an imported \fIstudent-view timetable\fR.+Should any of these obstruct the specification of unusual but intention initial state, they can individually be set to "\fBFalse\fR";+though under these circumstances the stability of the application cannot be guaranteed.+.br+Each one is optional; "\fBTrue\fR" will be inferred from any omission.+The identifiers of these, prefix any error-message generated from the failure of the corresponding check.+.TS+lb	l	.+checkBookedSubjectsAreRequired	Check that all \fIsubject\fRs for which there's a \fIbooking\fR, are required by the \fIstudent-body\fR.+checkBookedSubjectsHaveService	Check that all \fIsubject\fRs for which there's a booking, have been offered as a \fIcourse\fR, by the referenced \fIteacher\fR.+checkSynchronisedCourses	Check that all the \fIteacher\fRs of a set of \fIsynchronised courses\fR, have booked synchronous \fIlesson\fRs.+checkExistenceOfLocationIds	Check that all "\fBlocationId\fR"s referenced in an imported \fIstudentViewTimetable\fR, exist in the "\fBlocationCatalogue\fR".+checkExistenceOfStudentBodies	Check that all \fIstudent-bodies\fR referenced in an imported \fIstudentViewTimetable\fR, exist in the "\fBstudentBodyRegister\fR".+checkExistenceOfTeacherIds	Check that all "\fBteacherId\fR"s referenced in an imported \fIstudentViewTimetable\fR, exist in the "\fBteacherRegister\fR".+checkForBookingMeetingClash	Check for \fIlesson\fRs booked @ the same \fItime\fR as a \fImeeting\fR, with a common \fIresource\fR-requirement.+checkForMisplacedLessons	Check for \fIlesson\fRs booked @ \fIlocation\fRs lacking either adequate \fIcapacity\fR or the \fIfacilities\fR for their \fIcourse\fR.+checkForOverbookedSubjects	Check for \fIstudent-bodies\fR for whom more \fIlesson\fRs have been booked, in a specific \fIsubject\fR, than the \fIcourse\fR's "\fBrequiredLessonsPerWeek\fR".+checkForOverloadedStudentBodies	Check for \fIstudent-bodies\fR for whom more \fIlesson\fRs have been booked, than allocated for tuition in one week.+checkForOverloadedTeachers	Check for \fIteacher\fRs for whom more \fIlesson\fRs have been booked, than allocated for tuition in one week.+checkForResourceConflicts	Check for \fItime\fRs when \fIresource\fRs have been allocated in more than one \fIlocation\fR.+checkMinimumConsecutiveLessons	Check for \fIlesson\fRs which have been booked in run-lengths shorter than their \fIcourse\fR's "\fBminimumConsecutiveLessons\fR".+checkResourceAvailability	Check that \fIresource\fRs have been booked only on \fIday\fRs when they're going to be \fIavailable\fR.+checkTimeslotsPerDay	Check that all \fIday\fRs have the correct number of \fItime-slot\fRs.+.TE+.TP+.B timeslotIdBounds+Defines using two XML-elements, the closed interval bounding the range of integral \fItimeslot-id\fRs, @ which \fIlesson\fRs can be booked in each \fIday\fR.+.br \" Timeslot-id.+Because this range is defined not merely by its length, but by minimum & maximum bounds, one can arrange to start from one's preferred origin.+.br \" Lunch-time.+The solution-algorithm has neither awareness of the time-span between adjacent \fItime-slot\fRs, nor does it assume that these gaps are of equal duration.+There are some undesirable consequences of this design-choice; e.g. one may not want to book swimming immediately after lunch;+or a double \fIlesson\fR spanning lunch-time; but the gap between two \fItime-slot\fRs, in which lunch occurs, is undefined.+Elsewhere in the configuration-file; one can arrange either to avoid this problem completely,+by defining "lunch" as a \fIgroup\fR, of which all people are members,+& the \fImeeting\fRs of which are then scheduled in \fItime-slot\fRs, rather than invisibly between them;+or one can bias the algorithm towards more desirable solutions,+by requesting either the ideal \fItimeslot-id\fR within any \fIday\fR, @ which to book a \fIlesson\fR in a \fIcourse\fR,+or by specifying the precise \fItime\fRs within any week, @ which some of the \fIlesson\fRs of a specific \fIcourse\fR should be booked.+.br \" Dependencies.+CAVEAT: the configuration for both "\fBgroupProfile\fR" & "\fBteacherProfile\fR", can reference specific \fItimeslot-id\fRs,+& may need to be corrected after any alteration to the bounds.+.TP+.B locationCatalogue+A non-null map indexed by unique alphanumeric "\fBlocationId\fR" (potentially its room-number), of "\fBlocationProfile\fR"s, in which is defined;+its \fIavailability\fR;+its \fIcapacity\fR to cater for \fIstudent\fRs;+the \fIfacilities\fR it offers to support various \fIcourse\fRs.+.TP+.B teacherRegister+A non-null map indexed by unique alphanumeric "\fBteacherId\fR" (potentially their name (with spaces removed) or employee-id), of "\fBteacherProfile\fR"s, in which is defined;+their \fIavailability\fR;+the proportion of their \fIworking-week\fR devoted to teaching;+the \fIservice\fR they offer;+references to the \fIgroup\fRs of which they're members.+.TP+.B studentBodyRegister+A non-null map indexed by "\fBstudentBody\fR" (composed from a unique alphanumeric "\fBmnemonic\fR" & a list of mutually exclusive "\fBstudentId\fR"s), of "\fBstudentProfile\fR"s, in which is defined;+their \fIavailability\fR;+their "\fBstream\fR" (which can also denote their academic year);+their \fIknowledge-requirement\fRs;+references to the \fIgroup\fRs of which they're members.+.br+The \fIstudent\fRs are grouped into \fIstudent-bodies\fR, each member of which has an identical "\fBstudentProfile\fR".+This increases the application's efficiency,+& may, when the similarity in the requirements of members of each \fIstudent-body\fR is driven by some common external process (perhaps that they're members of the same "\fBstream\fR" in the same academic year), reduce the maintenance of the configuration.+If the similarity is merely coincidental, they can be placed in separate \fIstudent-bodies\fR,+& the application will, given the option "\fBreduceStudentBodyRegister=True\fR", discover ad-hoc \fIstudent-bodies\fR, to improve efficiency.+.TP+\fBgroupCatalogue\fR [\fB{}\fR]+A map indexed by unique alphanumeric "\fBgroupId\fR", which may be referenced by any number of "\fBstudentProfile\fR"s & "\fBteacherProfile\fR"s, of "\fBgroupProfile\fR"s.+Each "\fBgroupProfile\fR" defines a set of regular \fImeeting-time\fRs, which reserve coordinates in the timetable,+blocking the subsequent booking by any member of the \fIgroup\fR, of a simultaneous \fIlesson\fR; see below.+E.g. lunch, staff-meetings, or morning assembly.+.SS locationProfile+An XML-element containing the following XML-tags.+.TP+.B capacity+Quantifies the ability to cater for \fIstudent\fRs, & which may correspond merely to the number of desks.+.TP+\fBfacilities\fR [\fB{}\fR]+An XML-element containing strings, each representing some facility which might support the tuition of a \fIcourse\fR.+.br+The format of these strings is constrained only by the requirement that they're coordinated with the "\fBrequiredFacilities\fR" of a \fIcourse\fR.+.TP+\fBcampus\fR [\fB""\fR]+A string used to group proximate \fIlocation\fRs, between which intraday migration is trivial.+If the institution for which the timetable is required,+has some \fIlocation\fRs @ its disposal which are sufficiently remote from its centre to require considerable transit time,+then one may choose to partition them into separately named \fBcampus\fRes.+.br+\fILocation\fRs must still have a unique \fIlocation-id\fR irrespective of the \fBcampus\fR into which they've been partitioned.+.br+CAVEAT: the configuration doesn't quantify the distance (or time) between \fBcampus\fRes,+so no attempt can be made by the application, to minimise the total daily distance travelled (or the journey-time),+rather the total \fBcampus\fRes visited per \fIday\fR is minimised.+.TP+\fBavailability\fR [\fB["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]\fR]+An XML-element containing those \fIday\fRs when the \fIlocation\fR is available for use.+.br+CAVEAT: there's currently no concept of a \fIlocation\fR being available for fractions of a \fIday\fR.+.SS teacherProfile+An XML-element containing the following XML-tags.+.TP+\fBservice\fR [\fB{}\fR]+An XML-element containing the \fIcourse\fRs they can teach, each composed from of the following XML-tags.+.TS+lb	l	.+subject	Defines the \fBtopic\fR-string & the \fBlevel\fR @ which it is being taught. A \fIcourse\fR's \fBlevel\fR is merely an arbitrary string. It's free-format, but may represent both the academic year & the learning-capability expected of \fIstudent\fRs before they express interest. The value must match those defined in the "\fBknowledgeRequirements\fR" of \fIstudent\fRs.+requiredLessonsPerWeek	Defines the regular integral number of \fIlesson\fRs required per week. CAVEAT: there is no facility to vary this from week to week; should it do so, a different timetable must be generated. Typically an integral multiple of "\fBminimumConsecutiveLessons\fR".+requiredFacilities	An XML-element defining a set of strings, which must be a subset of the "\fBfacilities\fR" offered @ any \fIlocation\fR @ which the \fIcourse\fR is ultimately booked.+timeslotRequest	Optionally defines either the ideal \fItimeslot-id\fR within any \fIday\fR, @ which to book a \fIlesson\fR in this \fIcourse\fR (\fBideally\fR \fItimeslot-id\fR), or specifies the \fItime\fRs each week, @ which some of the \fIlesson\fRs of this \fIcourse\fR should be booked (\fBspecifically [\fR \fItime\fR, \fItime\fR ... \fB]\fR. CAVEAT: all \fIstudent-bodies\fR enrolled on this \fIcourse\fR, must form a single \fIstudent-class\fR @ the specified \fItime\fR, so either a suitably large \fIlocation\fR must be \fIavailable\fR, or another \fIteacher\fR must offer the same \fIsubject\fR). If there are no special requirements then omit this XML-element, i.e. accept the default.+minimumConsecutiveLessons	Optionally defines the minimum integral number of consecutive \fIperiod\fRs which must be booked for this \fIcourse\fR; defaulting to \fB1\fR. This constrains the booking of \fIlesson\fRs in \fBtopic\fRs which either can't be conducted in a shorter time-span, or for which either long preparation or long clean-up makes short sessions infeasible. The specified value represents an ideal, but if "\fBrequiredLessonsPerWeek\fR" isn't an integral multiple of this value, then on @ least one occasion, "\fBminimumConsecutiveLessons\fR" must be exceeded.+maximumClassSize	Optionally defines the maximum integral number of \fIstudent\fRs with whom the \fIteacher\fR can cope, for the tuition of this \fIcourse\fR. In the absence of this XML-attribute, the "\fBcapacity\fR" of the \fIlocation\fR in which the class is held, is the only limiting factor on \fIclass\fR-size.+synchronisationId	Optionally identifies by means of a shared string, a set of \fIcourse\fRs offered by different \fIteacher\fRs, whose \fIlesson\fRs must be synchronised. In the absence of this XML-attribute, the \fIlesson\fRs for this \fIcourse\fR need not be synchronised with those of any other \fIcourse\fR. \fIStudent\fRs may select only one member from such sets, but may migrate to a different member without disrupting the structure of the timetable.+.TE+.TP+.B locationId+References a \fIlocation\fR which is considered to be theirs.+.br+Any \fIlocation\fR referenced must be separately defined in the "\fBlocationCatalogue\fR".+.br+This XML-attribute is optional, because the \fIteacher\fR may not have any such \fIlocation\fR.+.TP+.B availability+An XML-element, containing those \fIday\fRs when the \fIteacher\fR is contracted to be available.+.br+CAVEAT: there's currently no concept of a \fIteacher\fR being available for fractions of a \fIday\fR.+.TP+.B maximumTeachingRatio+Defines the maximum floating-point ratio in the closed unit-interval \fB[0,1]\fR, of \fIavailable\fR time, which can be allocated to teaching.+The remaining time, can by inference, be allocated to either \fImeeting\fRs or administration.+.TP+\fBgroupMembership\fR [\fB{}\fR]+An XML-element referencing those "\fBgroupId\fR"s of which the \fIteacher\fR is a member.+.TP+.B specialtyTopic+Defines the \fBtopic\fR-string with which the \fIteacher\fR has greatest familiarity.+.br+This XML-attribute is optional, because the \fIteacher\fR may not have any specialty topic.+.br+Any \fBtopic\fR referenced must be amongst the \fIsubject\fRs offered in their "\fBservice\fR".+.TP+.B freePeriodPreference+Optionally defines a preference, for the position within each \fIday\fR when the \fIteacher\fR is \fIavailable\fR,+of unallocated \fItime-slot\fRs, i.e. those which are neither booked with a \fIlesson\fR nor reserved for a \fImeeting\fR.+.br+The position of free \fItime-slot\fRs in a \fIteacher\fR's timetable, is dependent on those in \fIstudent\fRs' timetables;+e.g. if the latter are required to attend morning assembly, then those \fIteacher\fRs who don't, will either have a staff-\fImeeting\fR @ that time, or a free \fItime-slot\fR.+.br+Valid values are; /(\fBPre\fR|\fBTerminal\fR|\fBPost\fR)/, where:+.TS+lb+l+lb	l	.+Preference+==========+Pre	A preference for unallocated \fItime-slot\fRs to precede the first \fIlesson\fR or \fImeeting\fR of the \fIday\fR.+Terminal	A preference for unallocated \fItime-slot\fRs either to precede the first or to follow the last, \fIlesson\fR or \fImeeting\fR of the \fIday\fR.+Post	A preference for unallocated \fItime-slot\fRs to follow the last, \fIlesson\fR or \fImeeting\fR, of the \fIday\fR.+.TE+.SS studentProfile+An XML-element containing the following XML-tags.+.TP+\fBstream\fR [\fB""\fR]+A \fIstudent\fR's \fIstream\fR is merely a string. It's free-format, & may also represent their academic year.+This concept is probably redundant, since the \fIsubject\fRs (defined by both \fBtopic\fR & \fBlevel\fR) required by each \fIstudent\fR, implicitly define a more precise \fBtopic\fR-specific capability.+If the \fIstream\fR of \fIstudent-bodies\fR with intersecting \fIsubject\fR-requirements, match, then they may be temporarily merged into \fIclass\fRes, for the tuition of each of those \fIsubject\fRs.+If one wants to allow; an able \fIstudent\fR to learn a \fIsubject\fR with \fIstudent\fRs from a higher year;+or \fIstudent\fRs of the same year, but different academic ability, to be able to play sports together;+it is necessary to render this concept void, by for example accepting the default value (a null string), for all such \fIstudent\fRs.+Voiding this concept, won't then explicitly prevent undesirable temporary mergers between \fIstudent\fRs in different years, when playing a sport,+but this scenario never arises if they require sport-related \fIsubject\fRs of an appropriate \fBlevel\fR to their physical development.+.TP+\fBknowledgeRequirements\fR+Partitioned into two XML-elements, defining the "\fBcore\fR" & "\fBoptional\fR" \fIsubject\fRs that the member-\fIstudent\fRs want to learn.+Each \fIsubject\fR is defined by the "\fBtopic\fR"-string & the "\fBlevel\fR"-string @ which it should be taught.+These values must match one of the "\fBsubject\fR"s, defined in the \fIcourse\fRs, offered as a part of a \fIteacher\fR's "\fBservice\fR".+.TP+\fBavailability\fR+An XML-element containing those \fIday\fRs when each member of the \fIstudentBody\fR, is available.+Typically they'd have no choice, but some \fIstudent\fRs may have special needs.+.br+CAVEAT: there's currently no concept of a \fIstudent\fR being available for fractions of a \fIday\fR.+.TP+\fBteachingRatio\fR [\fB1\fR]+Defines the floating-point ratio in the semi-closed unit-interval \fB(0,1]\fR, of \fIavailable\fR time, which can be allocated to tuition.+The remaining time, can by inference, be allocated to either \fImeeting\fRs or free-study.+A \fIstudent\fR's work-load associated with; "\fBcore\fR" \fIknowledge-requirements\fR shouldn't overflow, & all \fIknowledge-requirements\fR shouldn't underflow; this ratio.+.br+CAVEAT: if the required ratio can't be represented precisely as a decimal,+then one probably ought to configure with sufficient precision to limit the rounding-error to less than one lesson per week,+& then bear in mind that rounding-up will give the \fIstudent\fR one fewer free-period per week.+.TP+\fBgroupMembership\fR [\fB{}\fR]+An XML-element, referencing those "\fBgroupId\fR"s of which each \fIstudent\fR is a member.+.TP+\fBfreePeriodPreference\fR+Optionally defines a preference, for the position within each \fIday\fR when the \fIstudent-body\fR is \fIavailable\fR, of unallocated \fItime-slot\fRs,+i.e. those which are neither booked with a \fIlesson\fR nor reserved for a \fImeeting\fR.+\fIStudent\fRs would not normally be allowed to arrive late or depart early, so this feature is of little practical value.+The values are the same as for \fIteacher\fRs; see above.+.SS groupProfile+An XML-element containing the following XML-tags.+.TP+\fBmeetingTimes\fR [\fB{}\fR]+An XML-element containing the \fItime\fRs when the \fIgroup\fR regularly meets.+.br+CAVEAT: there is no facility to model a \fIgroup\fR which meets irregularly.+.TP+.B locationId+A string which references a \fIlocation\fR @ which to meet; see "\fBlocationCatalogue\fR".+.br+This XML-attribute is optional, because there may be no requirement to meet physically; perhaps because it's a teleconference.+.TP+\fBmandatesAttendance\fR [\fBFalse\fR]+A boolean switch which defines whether \fIgroup\fR-members are required to attend all \fImeeting\fRs.+.br+E.g. one could enrol all \fIteacher\fRs in a \fIgroup\fR for morning-assembly, but if some are part-time, then attendance can't be mandatory.+.br+CAVEAT: there is no facility to define a \fIgroup\fR, for which only some \fImeeting\fRs are mandatory.+.SH FILES+.TS+lb	lb	lb	lb	lb	lb+l	lb	lb	l	l	lb	lb	lb	lb	lb	lb	lb	lb	lb	lb+l	l	l	l	l	l	1	1	1	1	1	1	1	1	l +lb	r	r	lb	lb	l	1	1	1	1	1	1	1	1	l	.+File-name	Time-slots	Student	XHTML-output	XML-output	Configuration-features+(xml/*.xml)	per day	bodies	(xhtml/*.xhtml)	(xml/*.xml)	generateLessonColourFrom	campus	facilityName	freePeriodPreference	groupId	maximumClassSize	minimumConsecutiveLessons	specialtyTopic	synchronisationId	timeslotRequest+=========	==========	=======	============	==========	========================	======	============	====================	=======	================	=========================	==============	=================	===============+example_01	1	3	timetable_01	studentViewTimetable_01	Y+example_02	2	2	timetable_02	studentViewTimetable_02	Y		Y			Y		Y+example_03	3	2	timetable_03	studentViewTimetable_03		Y	Y			Y	Y	Y+example_05	5	11	timetable_05	studentViewTimetable_05		Y	Y		Y	Y	Y	Y		Y+example_05_1	5	3	timetable_05_1	studentViewTimetable_05_1			Y		Y		Y	Y	Y	Y+example_08	8	11	timetable_08	studentViewTimetable_08		Y	Y		Y	Y	Y	Y	Y	Y+example_13	13	11	timetable_13	studentViewTimetable_13		Y	Y	Y	Y	Y	Y	Y	Y	Y+example_21	21	11	timetable_21	studentViewTimetable_21	Y		Y	Y	Y	Y	Y	Y	Y	Y+template		0+.TE+.sp 1+CAVEAT: should any of these files be relocated, then its "\fBDOCTYPE\fR"-declaration, will need to be corrected to reference \fBweekdaze.dtd\fR.+.TS+lb	lb+l	l+l	l	.+\fBFile-name\fR (dtd/*.dtd)	Contents+=====================	========+locationViewTimetable	The formal description of the XML-format for the resulting timetable as seen from the perspective of \fIlocation\fRs.+studentViewTimetable	The formal description of the XML-format for the resulting timetable as seen from the perspective of \fIstudent-bodies\fR.+teacherViewTimetable	The formal description of the XML-format for the resulting timetable as seen from the perspective of \fIteacher\fRs.+weekdaze	The formal description of the XML-format for the input configuration-file.+.TE+.sp 1+.TS+lb	lb+l	l+l	l	.+\fBFile-name\fR (sql/*.sql)	Contents+=====================	========+weekdazeCreate	Defines the database-schema; all the tables & all the rows.+weekdazeTriggers	Defines extra rules required to preserve relational integrity as data is inserted.+weekdazeExamples	Defines a set of example timetable-problems (the same as those defined in XML).+.TE+.SH AUTHOR+Written by Dr. Alistair Ward.+.SH COPYRIGHT+Copyright \(co 2013-2015 Dr. Alistair Ward+.PP+This program is free software: you can redistribute it &/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.+.PP+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.+.PP+You should have received a copy of the GNU General Public License along with this program. If not, see <\fBhttps://www.gnu.org/licenses/\fR>.+.SH "SEE ALSO"+.IP \(bu+\fBman/man1/weekdaze.1\fR: section-1 of the manual pages for this product.+.IP \(bu+<\fBhttps://www.w3schools.com/xml/\fR>.+.IP \(bu+<\fBhttps://www.w3schools.com/xml/xml_dtd.asp\fR>.+
+ sql/MySQL/odbc.ini view
@@ -0,0 +1,13 @@+;Template for the ODBC connection-parameters for a MySQL database. This would typically be installed in the user's home-directory, with a '.'-prefix.++[weekdaze]+DESCRIPTION	= WeekDaze+DRIVER		= MySQL+SERVER		= localhost+PORT		= 3306+UID		= <user-name>+PWD		= <password>+DATABASE	= <database>+TRACE		= Yes+TRACEFILE	= stderr+
+ sql/MySQL/odbcinst.ini view
@@ -0,0 +1,6 @@+;Sample MySQL ODBC-driver specification. On GNU/Linux, this might be installed by root in e.g. '/etc/unixODBC/'.++[MySQL]+Description	= MySQL driver for Linux+Driver		= /usr/lib64/libodbc.so+FileUsage	= 1
+ sql/MySQL/weekdazeCreate.sql view
@@ -0,0 +1,446 @@+-- Copyright (C) 2014-2015 Dr. Alistair Ward+--+-- This file is part of WeekDaze.+--+-- WeekDaze 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.+--+-- WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.++SET foreign_key_checks=1;	-- A Server System Variable; see 'SHOW VARIABLES;'.++-- Drop all the tables we're about to create, but in reverse order.+DROP TABLE IF EXISTS `tbl_knowledgeRequirement`, `tbl_requiredFacility`, `tbl_specificTimeRequest`, `tbl_specialtyTopic`, `tbl_service`, `tbl_teacherGroupMembership`, `tbl_teacherRegister`, `tbl_studentGroupMembership`, `tbl_studentBodyMembership`, `tbl_studentBodyRegister`, `tbl_stream`, `tbl_meetingTime`, `tbl_groupCatalogue`, `tbl_facility`, `tbl_facilityType`, `tbl_locationCatalogue`, `tbl_timetableCriteriaWeights`, `tbl_lessonCriteriaWeights`, `tbl_optimiseLessonCriteriaWeights`, `tbl_evolutionStrategies`, `tbl_outputOptions`, `tbl_style`, `tbl_traversalOrder`, `tbl_executionOptions`, `tbl_timetableValidationSwitches`, `tbl_problemValidationSwitches`, `tbl_timeslotIdBounds`, `tbl_options`, `tbl_configVersion`, `tbl_project`, `tbl_user`;++CREATE TABLE `tbl_user` (+	`userId`		INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY			COMMENT 'Unique row-identifier.',+	`name`			VARCHAR(64)	NOT NULL					COMMENT 'The real name of the user. This is free-format & not necessarily unique, because of which it\'s for documentary purposes only.',+	`emailAddress`		VARCHAR(255)	NOT NULL					COMMENT 'Only used to guarantee uniqueness amongst users.',+	`salt`			BINARY(64)			DEFAULT NULL			COMMENT 'Prepended to the password before applying a cryptographic hash. Only NULL when "saltedPasswordHash" is.',+	`saltedPasswordHash`	BINARY(64)			DEFAULT NULL			COMMENT 'Cryptographic hash of the salt prepended to the password. Field-length is adequate for SHA-512 stored in raw (not hex-encoded) binary. Password-checking will be disabled if set to NULL.',+	`executable`		BOOL		NOT NULL	DEFAULT TRUE			COMMENT 'Allows the site-administrator to prevent an account from running any projects.',+	`mutable`		BOOL		NOT NULL	DEFAULT TRUE			COMMENT 'Permits a site-administrator to prevent any changes to an account.',+	`created`		TIMESTAMP	NOT NULL	DEFAULT CURRENT_TIMESTAMP	COMMENT 'When this account was created.',+	`lastLogin`		TIMESTAMP	NULL		DEFAULT NULL			COMMENT 'The last time this user was authenticated.',+	CONSTRAINT `user.unique` UNIQUE KEY (`emailAddress`)					COMMENT 'Real email-addresses are unique by nature, though the existence of an MX-record is not checked here.'+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the users of the application. N.B.: raw BINARY data can be inserted in hex, or queried using "SELECT hex(`salt`),hex(`saltedPasswordHash`)".';++CREATE TABLE `tbl_project` (+	`userId`	INT UNSIGNED	NOT NULL					COMMENT 'Each user has an independent set of projects.',+	`projectName`	VARCHAR(32)	NOT NULL					COMMENT 'A free-format personal mnemonic to qualify the "projectId.',+	`projectId`	INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY			COMMENT 'Unique row-identifier.',+	`created`	TIMESTAMP	NOT NULL	DEFAULT CURRENT_TIMESTAMP	COMMENT 'When this project was created.',+	CONSTRAINT `project.unique` UNIQUE KEY (`userId`, `projectName`)		COMMENT 'Within the domain of a "userId", each "projectName" is distinct.',+	CONSTRAINT `project.userId` FOREIGN KEY (`userId`) REFERENCES `tbl_user` (`userId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Each user can maintain several independent projects.';++CREATE TABLE `tbl_configVersion` (+	`configVersion`	VARCHAR(16)	PRIMARY KEY	COMMENT 'A possible version of the database-schema, in dotted-decimal.'+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the set of valid configuration-versions to which a project can conform; see "tbl_options".';++CREATE TABLE `tbl_options` (+	`projectId`	INT UNSIGNED	PRIMARY KEY	COMMENT 'Each project defines its own options.',+	`configVersion`	VARCHAR(16)	NOT NULL	COMMENT 'The version of the database-schema to which this project conforms.',+	CONSTRAINT `options.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE,+	CONSTRAINT `options.configVersion` FOREIGN KEY (`configVersion`) REFERENCES `tbl_configVersion` (`configVersion`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1 COMMENT='Defines the version of the database-schema to which each project conforms.';++CREATE TABLE `tbl_timeslotIdBounds` (+	`projectId`	INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project defines its own time-slot bounds.',+	`min`		TINYINT		NOT NULL	DEFAULT 0	COMMENT 'The lower inclusive bound for the time-slots in each day.',+	`max`		TINYINT		NOT NULL			COMMENT 'The upper inclusive bound for the time-slots in each day. There\'s no significance to the specific integer used, only the range of values.',+	CONSTRAINT `timeslotIdBounds.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the range of timeslot-identifiers.';++-- Some of these switches have been disabled, since they're already implemented by native referential integrity checks.+CREATE TABLE `tbl_problemValidationSwitches` (+	`projectId`							INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project defines its own switches.',+	`checkAvailabilityOfAnyGroupMember`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that @ least one member, can attend each meeting of a group.',+	`checkCapacityOfLocationsForMeetings`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that any location, specified for the meetings of each group, has adequate capacity.',+	`checkCoursesForSynchronousSpecifiedTimes`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that no courses, required to satisfy the knowledge-requirements of a student, specify the same booking-time.',+	`checkDuplicateMeetingLocationIds`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that when more than one group requires a location, that their meeting-times are mutually exclusive.',+--	`checkDuplicateOwnLocationIds`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that when more than one teacher claims a single location as their own, their working-weeks are mutually exclusive.',+	`checkForAlternativesToSynchronisedCourses`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Ensure that students can migrate easily between synchronised courses, by prohibiting any teacher from offering an alternative course outside the synchronised set, but with an identical subject to one of the member-courses.',+--	`checkForDuplicateStudentIds`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that no student-identifier belongs to more than one student-body.',+	`checkForIdleStudents`						BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for students who require zero subjects, but have allocated one or more time-slots for teaching.',+	`checkForIdleTeachers`						BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for teachers who offer zero courses required by students, but have allocated one or more time-slots for teaching.',+--	`checkForInvalidMeetingTimes`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all the timeslot-Ids, used to define the meeting-times of groups, are within permissible bounds.',+	`checkForMultipleCoursesPerTeacherPerSynchronisationId`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that no teacher offers more than one course with the same "synchronisationId".',+	`checkForNonExistentFacilities`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether all facilities, referenced by those courses offered by teachers, exist in @ least one location.',+--	`checkForNonExistentGroupIds`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether all "groupId"s, referenced by human-resources, exist independently.',+--	`checkForNonExistentMeetingLocationIds`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether all "locationId"s, required for the meetings of groups, exist.',+--	`checkForNonExistentOwnLocationIds`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether all "locationId"s, referenced by teachers, exist independently.',+	`checkForOverloadedStudents`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for students who have allocated zero time-slots for teaching, but have requested one or more subjects.',+	`checkForSingletonSynchronisedCourses`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for teachers whose courses are members of singleton sets of cynchronised courses.',+	`checkForStudentsRequiringMultipleSynchronisedSubjects`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for any student-body requiring multiple subjects only offered within one set of synchronised courses.',+	`checkForStudentsWithUnrealisableFreePeriodPreference`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for any student-body whose preference for the position of free time-slots, within those days when they are available, can never be realised because of the meeting-times of groups of which they are members.',+	`checkForSynchronisedCoursesWithDifferentIdealTimeslots`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that synchronised courses don\'t define different "idealTimeslotRequest"s.',+	`checkForSynchronisedCoursesWithDifferentLessonsPerWeek`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that synchronised courses don\'t define different "requiredLessonsPerWeek".',+	`checkForSynchronisedCoursesWithExcessLessonsPerWeek`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for synchronised courses which require more lessons per week, than the number of time-slots for which all the interested student-bodies & required teachers, are simultaneously available.',+	`checkForSynchronisedCoursesWithExcessSpecifiedTimes`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for synchronised courses which have fewer lessons per week than specified booking-times.',+	`checkForSynchronisedCoursesWithExcessTimeslotRequests`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for synchronised courses which both define "idealTimeslotRequest" & have an entry in "tbl_specificTimeRequest".',+	`checkForSynchronisedCoursesWithoutSuitableLocations`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for synchronised courses which lack sufficient locations offering the required facilities, which are simultaneously available to the teachers & all interested students.',+	`checkForSynchronisedCoursesWithUnavailableSpecifiedDays`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for synchronised courses which specify times, on days when not all the interested student-bodies & required teachers, are available.',+	`checkForTeachersWithUnrealisableFreePeriodPreference`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for any teacher whose preference for the position of free time-slots, within those days when they are available, can never be realised because of the meeting-times of groups of which they are members.',+	`checkIfStudentBodiesExceedTeachers`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether there are sufficient teachers for the number of student-bodies, on each day.',+	`checkIfStudentBodySizeExceedsCapacityOfAllLocations`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether each student-body can be accommodated by the largest available location.',+	`checkIfStudentBodySizeExceedsLocationCapacity`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether all student-bodies can be accommodated within the available locations, on each day.',+	`checkIndependenceOfStudentTimeslotsRequestsAndMeetings`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that none of the courses a teacher offers, specifies a booking-time, which matches any of the meeting-times of the groups of which they are members.',+	`checkIndependenceOfTeacherTimeslotsRequestsAndMeetings`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that none of the subjects a student requires, are offered by courses which all specify a booking-time, which matches any of the meeting-times of the groups of which they are members.',+	`checkLocationsAvailabilityToSupportCourses`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that there are sufficient locations, simultaneously available with at least one student-body & at least one teacher, to support the total number of time-slots required for the courses offered by all teachers.',+	`checkLocationsForSynchronousSpecifiedTimes`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check there are enough locations, in which to book lessons, @ those times specified by different teachers.',+	`checkMeetingLocationsAvailability`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that any location required for a group, is available @ all meeting-times.',+--	`checkMinimumConsecutiveLessons`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that the "minimumConsecutiveLessons" of a course, doesn\'t exceed the number of time-slots per day.',+--	`checkNullGroupId`						BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for null identifiers in the group-catalogue.',+	`checkNullLocationCatalogue`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether "tbl_locationCatalogue" is empty for a specified "projectId".',+	`checkNullStudentBodyRegister`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether "tbl_studentBodyRegister" is empty for a specified "projectId".',+	`checkNullTeacherRegister`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check whether "tbl_teacherRegister" is empty for a specified "projectId".',+	`checkOwnLocationsAvailability`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that if teachers specify their own location, that there\'s some common availability.',+	`checkRequiredLessonsPerWeek`					BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that no course is offered, where "requiredLessonsPerWeek" exceeds those the teacher works.',+	`checkSimultaneousAvailabilityOfGroupMembers`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all the members of each group, are simultaneously available.',+	`checkStudentsAvailabilityForMandatoryMeetings`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that students are available for the meeting-times of the groups of which they are members.',+	`checkStudentsAvailabilityForSpecifiedTimes`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that no course, required to satisfy the knowledge-requirements of a student, specifies any time, on a day when they are unavailable.',+--	`checkStudentsForMultipleLevelsOfSameTopic`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that the knowledge-requirements of each student-body, don\'t specify more than one level in any topic. This might occur legitimately where studying one subject for two different exams e.g. Scottish Higher & A-level.',+	`checkStudentsForSynchronousMeetings`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that students aren\'t members of groups with synchronous meeting-times.',+	`checkStudentsLowerWorkloadBound`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that students book sufficient courses.',+	`checkStudentsUpperWorkloadBound`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that students don\'t book excess courses.',+--	`checkSubjectExistence`						BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for the existence of the requested subjects.',+	`checkSuitableLocationsForKnowledgeRequirements`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that there are suitable locations for each knowledge-requirement of each student-body.',+	`checkTeachersAvailabilityForMandatoryMeetings`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that teachers are available for the meeting-times of the groups of which they are members.',+	`checkTeachersForSynchronousMeetings`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that teachers aren\'t members of groups with synchronous meeting-times.',+	`checkTeachersUpperWorkloadBound`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that teachers aren\'t members of too many groups.',+	`checkTeachingCapacityBySubject`				BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that there\'s sufficient teaching-capacity, to satisfy the demand by students for each subject.',+--	`checkTimeslotIdBounds`						BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check the range of timeslot-ids defined, is sufficient.',+--	`checkTimeslotRequests`						BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all timeslot-requests reference a valid timeslot-id.',+	CONSTRAINT `problemValidationSwitches.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Switches which control which checks are to be performed by the application, on the problem-parameters.';++CREATE TABLE `tbl_timetableValidationSwitches` (+	`projectId`				INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project defines its own switches.',+	`checkBookedSubjectsAreRequired`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all subjects for which there\'s a booking, are required by the student-body.',+	`checkBookedSubjectsHaveService`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all subjects for which there\'s a booking, have been offered as a course, by the referenced teacher.',+	`checkSynchronisedCourses`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all the teachers of a set of synchronised courses, have booked synchronous lessons.',+	`checkExistenceOfLocationIds`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all locationIds referenced in an imported student-view timetable, exist in "tbl_locationCatalogue".',+	`checkExistenceOfStudentBodies`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all student-bodies referenced in an imported student-view timetable, exist in "tbl_studentBodyRegister".',+	`checkExistenceOfTeacherIds`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all teacherIds referenced in an imported student-view timetable, exist in "tbl_teacherRegister".',+	`checkForBookingMeetingClash`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for lessons booked @ the same time as a meeting, with a common resource-requirement.',+	`checkForMisplacedLessons`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for lessons booked @ locations lacking either adequate capacity or facilities for their course.',+	`checkForOverbookedSubjects`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for student-bodies for whom more lessons have been booked, in a specific subject, that required by the course of which they are a part.',+	`checkForOverloadedStudentBodies`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for student-bodies for whom more lessons have been booked, than allocated for tuition in one week.',+	`checkForOverloadedTeachers`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for teachers for whom more lessons have been booked, than allocated for tuition in one week.',+	`checkForResourceConflicts`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for times @ which resources have been allocated in more than one location.',+	`checkMinimumConsecutiveLessons`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check for lessons which have been booked in runlengths shorter than required by the course of which they are a part.',+	`checkResourceAvailability`		BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that resources have been booked only on days when they are available.',+	`checkTimeslotsPerDay`			BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Check that all days have the correct number of time-slots.',+	CONSTRAINT `timetableValidationSwitches.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Switches which control which checks are to be performed by the application, on any imported student-view timetable.';++CREATE TABLE `tbl_executionOptions` (+	`projectId`				INT UNSIGNED	PRIMARY KEY	COMMENT 'Each project defines its own execution-options.',+	`randomSeed`				INT		DEFAULT NULL	COMMENT 'Optionally seed the pseudo-random number-generator to obtain a deterministic sequence.',+	`permitTemporaryStudentBodyMerger`	BOOL		DEFAULT TRUE	COMMENT 'Whether to permit a temporary merger between student-bodies, to permit a teacher & location to be shared for the duration of a course.',+	`reduceStudentBodyRegister`		BOOL		DEFAULT TRUE	COMMENT 'Whether to permanently merge student-bodies with identical profiles, thus reducing the number of independently schedulable entities.',+	`removeRedundantCourses`		BOOL		DEFAULT TRUE	COMMENT 'Whether to remove any courses offered, which aren\'t required by any student.',+	`removePointlessGroups`			BOOL		DEFAULT TRUE	COMMENT 'Whether to remove groups from the group-catalogue, for which zero meetings have been scheduled',+	`removeUnsubscribedGroups`		BOOL		DEFAULT TRUE	COMMENT 'Whether to remove groups from the group-catalogue, to which neither student-bodies nor teachers have subscribed.',+	`zeroInappropriateOptions`		BOOL		DEFAULT TRUE	COMMENT 'Whether to zero the weight of each lesson-criterion & timetable-criterion, & the fecundity of each evolution-strategy, which is either inappropriate for, or irrelevant to, the specified problem-parameters.',+	CONSTRAINT `executionOptions.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the parameters which tune the solution-mechanism.';++CREATE TABLE `tbl_traversalOrder` (+	`id`		INT UNSIGNED				AUTO_INCREMENT	PRIMARY KEY	COMMENT 'Unique row-identifier.',+	`projectId`	INT UNSIGNED				NOT NULL			COMMENT 'Each project defines its own traversal-order.',+	`sense`		ENUM('+','-')				NULL		DEFAULT NULL	COMMENT 'Optionally defines the direction of travel along an "axis". If unspecified then both senses will be tried',+	`axis`		ENUM('ObserverId','Day','TimeslotId')	NOT NULL			COMMENT 'Names an axis of the conceptually 3-D data-structure of the timetable.',+	CONSTRAINT `traversalOrder.unique` UNIQUE KEY (`projectId`, `axis`)			COMMENT 'Within the domain of a "projectId", the axes are distinct.',+	CONSTRAINT `traversalOrder.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines a raster-scan through the coordinates of a timetable, using an ordered triple of orthogonal timetable-axes.';++CREATE TABLE `tbl_style` (+	`projectId`				INT UNSIGNED									PRIMARY KEY									COMMENT 'Each project defines its own style.',+	`cssURL`				VARCHAR(128)									NOT NULL	DEFAULT 'https://functionalley.com/WeekDaze/css/weekdaze.css'	COMMENT 'Optional URL for a Cascading Style-Sheet.',+	`mergeDuplicateTimeslotsByDay`		BOOL										NOT NULL	DEFAULT TRUE							COMMENT 'Option to merge duplicate lessons between adjacent days.',+	`mergeDuplicateTimeslotsByTimeslot`	BOOL										NOT NULL	DEFAULT TRUE							COMMENT 'Option to merge duplicate lessons between adjacent time-slots.',+	`displayAxisLabelsByDay`		BOOL										NOT NULL	DEFAULT TRUE							COMMENT 'Option to display labels on the day-axis',+	`displayAxisLabelsByTimeslot`		BOOL										NOT NULL	DEFAULT TRUE							COMMENT 'Option to display labels on the time-slot axis',+	`displayRuntimeInformation`		BOOL										NOT NULL	DEFAULT TRUE							COMMENT 'Option to display both warning-messages & the runtime-log.',+	`displaySupplementaryInformation`	BOOL										NOT NULL	DEFAULT TRUE							COMMENT 'Option to augment the output with supplementary information.',+	`weekend`				SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')	NOT NULL	DEFAULT 'Saturday,Sunday'					COMMENT 'The days of which the weekend is composed. This doesn\'t affect the nature of the solution, only the presentation.',+	`generateLessonColourFrom`		ENUM('Lesson','Subject','Topic','Level','ResourceIds')						DEFAULT NULL							COMMENT 'Optionally specify the data-source from which to automatically generate the HTML-colour of a lesson; otherwise this will be delegated to the CSS-file specified via "cssURL"',+	`minimumContrastRatio`			DOUBLE UNSIGNED									NULL		DEFAULT NULL							COMMENT 'The minimum acceptable contrast-ratio between the foreground lesson-colour (generated according to "generateLessonColourFrom") & its complementary background-colour. A default is used when null.',++	CONSTRAINT `style.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Options which govern the style of the result generated by the application.';++CREATE TABLE `tbl_outputOptions` (+	`projectId`			INT UNSIGNED					PRIMARY KEY				COMMENT 'Each project defines its own output-options.',+	`nDecimalDigits`		TINYINT UNSIGNED				NOT NULL	DEFAULT 3		COMMENT 'The precision to which fractional auxiliary data is displayed.',+	`studentBodyMnemonicSeparator`	VARCHAR(4)							DEFAULT NULL		COMMENT 'The separator used when merging the "mnemonic"s of student-bodies.',+	`verbosity`			ENUM('Silent','Normal','Verbose','Deafening')	NOT NULL	DEFAULT 'Normal'	COMMENT 'Set the threshold for ancillary information-output.',+	CONSTRAINT `outputOptions.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Options which govern the format of the result generated by the application.';++CREATE TABLE `tbl_evolutionStrategies` (+	`projectId`						INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project independently defines the parameters governing its evolution-strategies.',+	`synchronisedCourseMutationDeterministicCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking the lessons of synchronised courses, before deterministic reconstruction.',+	`synchronisedCourseMutationRandomCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking the lessons of synchronised courses, before random reconstruction.',+	`synchronisedCourseByDayMutationDeterministicCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking synchronous groups of lessons for synchronised courses, before deterministic reconstruction.',+	`synchronisedCourseByDayMutationRandomCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking synchronous groups of lessons for synchronised courses, before random reconstruction.',+	`excessRunlengthMutationDeterministicCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking the terminal lessons of excessive runlengths, before deterministic reconstruction.',+	`excessRunlengthMutationRandomCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking the terminal lessons of excessive runlengths, before random reconstruction.',+	`homogeneousStudentViewLessonMutationDeterministicCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking groups of homogeneous student-view lessons, before deterministic reconstruction.',+	`homogeneousStudentViewLessonMutationRandomCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking groups of homogeneous student-view lessons, before random reconstruction.',+	`incompleteCourseMutationDeterministicCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking all the lessons for incomplete courses, in the timetable for each student, before deterministic reconstruction.',+	`incompleteCourseMutationRandomCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking all the lessons for incomplete courses, in the timetable for each student, before random reconstruction.',+	`randomLessonMutationDeterministicCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking randomly selected lessons from the timetable, before deterministic reconstruction.',+	`randomLessonMutationRandomCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking randomly selected lessons from the timetable, before random reconstruction.',+	`singletonStudentClassMutationDeterministicCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking lessons whose student-classes have been composed from a single student-body, before deterministic reconstruction.',+	`singletonStudentClassMutationRandomCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking lessons whose student-classes have been composed from a single student-body, before random reconstruction.',+	`splitSessionMutationDeterministicCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking runlengths of lessons which occur in split sessions within a day, before deterministic reconstruction.',+	`splitSessionMutationRandomCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking runlengths of lessons which occur in split sessions within a day, before random reconstruction.',+	`studentBodyCombinationMutationDeterministicCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking lessons for a course, whose student-classes have been composed from more than one combination of student-bodies, before deterministic reconstruction.',+	`studentBodyCombinationMutationRandomCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking lessons for a course, whose student-classes have been composed from more than one combination of student-bodies, before random reconstruction.',+	`studentViewTimetableForDayMutationDeterministicCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking the specified number of whole days, from each student-view timetable-for-week in isolation, before deterministically reconstructing.',+	`studentViewTimetableForDayMutationRandomCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking the specified number of whole days, from each student-view timetable-for-week in isolation, before randomly reconstructing.',+	`studentViewTimetableForWeekMutationDeterministicCTor`	INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking a small number of randomly selected lessons, from each student-view timetable-for-week in isolation, before deterministic reconstruction.',+	`studentViewTimetableForWeekMutationRandomCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking a small number of randomly selected lessons, from each student-view timetable-for-week in isolation, before random reconstruction.',+	`synchronousLessonMutationDeterministicCTor`		INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking groups of synchronous of heterogeneous lessons, before deterministic reconstruction.',+	`synchronousLessonMutationRandomCTor`			INT UNSIGNED	NOT NULL	DEFAULT 0	COMMENT 'Whether to attempt to evolve the timetable, by unbooking groups of synchronous of heterogeneous lessons, before random reconstruction.',+	`randomLessonMutationNTrials`				INT UNSIGNED			DEFAULT NULL	COMMENT 'The number of random trials in "randomLessonMutation". A default is used when null.',+	`randomLessonMutationNTimeslots`			TINYINT UNSIGNED		DEFAULT NULL	COMMENT 'The number of random time-slots to unbook in each trials during "randomLessonMutation". A default is used when null.',+	`studentViewTimetableForDayMutationNDays`		TINYINT UNSIGNED		DEFAULT NULL	COMMENT 'The number of days to unbook in "studentViewTimetableForDayMutation". When set to null, all valid values will be tried.',+	`studentViewTimetableForWeekMutationNTrials`		TINYINT UNSIGNED		DEFAULT NULL	COMMENT 'The number of random trials in "studentViewTimetableForWeekMutation". A default is used when null.',+	`studentViewTimetableForWeekMutationNTimeslots`		TINYINT UNSIGNED		DEFAULT NULL	COMMENT 'The number of random time-slots to unbook in each trials during "studentViewTimetableForWeekMutation". A default is used when null.',+	`fecundityDecayRatio`					DOUBLE UNSIGNED			DEFAULT NULL	COMMENT 'The factor (in the closed unit-interval) by which the fecundity of the breeding-program for future generations, is multiplied (& therefore reduced), when the population-diversity ratio falls beneath "minimumPopulationDiversityRatio". A default value is used when null.',+	`minimumPopulationDiversityRatio`			DOUBLE UNSIGNED			DEFAULT NULL	COMMENT 'The population-diversity ratio (in the closed unit-interval), beneath which a reduction in the fecundity of the breeding-program for future generations, by a factor of "fecundityDecayRatio", is triggered. A default value is used when null.',+	`nInitialScouts`					TINYINT UNSIGNED		DEFAULT NULL	COMMENT 'The initial number of candidates to select from each generation in the evolution of the timetable. A variable number is used when null.',+	CONSTRAINT `evolutionStrategies.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the fecundity of each evolution-stategy, i.e. how large a candidate population to breed when using it.';++CREATE TABLE `tbl_optimiseLessonCriteriaWeights` (+	`projectId`			INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project defines the optimisation of its own lesson-criteria weights.',+	`nTrials`			INT UNSIGNED	NULL				COMMENT 'The number of random trials used when attempting to optimise the lesson-criteria weights. A default value is used when null.',+	`changeMagnitude`		DOUBLE UNSIGNED	NULL				COMMENT 'The magnitude of the random change applied to the individual lesson-criteria, while attempting to find a better set. A default value is used when null.',+	`reductionFactor`		DOUBLE UNSIGNED	NULL				COMMENT 'The factor (in the closed unit-interval) used to reduce the change-magnitude after each success. A default value is used when null.',+	`useMeanOverRasterScans`	BOOL		NOT NULL	DEFAULT TRUE	COMMENT 'Whether to accept a proposed set of lesson-criteria weights on the basis of the mean (as opposed to the maximum) over the specified raster-scans, of the weighted mean over all heterogeneous timetable-criteria.',+	CONSTRAINT `optimiseLessonCriteriaWeights.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the automatic optimisation of lesson-criteria weights.';++CREATE TABLE `tbl_lessonCriteriaWeights` (+	`projectId`					INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project defines its own independent set of weights.',+	`areResourcesReused`				DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A lesson is preferred, if the required resources (locations & teachers) are shared with other student-bodies, by merging them into a single larger student-class.',+	`greatestMinimumConsecutiveLessons`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A lesson is preferred, if the course to which it belongs, has a greater "minimumConsecutiveLessons"; since this makes it harder to book later, into the smaller spaces remaining.',+	`greatestRemainingCourseLessons`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A course is preferred, if it has greater unbooked lessons, since a course requiring only one lesson can be booked on any day.',+	`greatestSynchronisedCourseSetSize`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A course is preferred, if it\'s a member of a larger set of synchronised courses; it seems prudent to book lessons for the most constrained course early.',+	`isCoreKnowledgeRequirement`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A subject is preferred, if it\'s categorised by the student, as a "core" knowledge-requirement.',+	`isSpecialistInTopic`				DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A teacher is preferred, if their "specialtyTopic" is the proposed "topic".',+	`matchCourseClassSizeToLocationCapacity`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A location is preferred, when its "capacity" matches the optional maximum class-size for the course.',+	`maximiseRelativeFacilityUtilisation`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A location is preferred, the more its facilities are used; cf. "minimiseWasteOfScarceFacilities", which tries to make a distinction based on the type of the wasted facility.',+	`maximiseStudentClassSizeOverCourseClassSize`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A course is preferred, the more any maximum class-size is filled by the proposed student-class.',+	`maximiseStudentClassSizeOverLocationCapacity`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A location is preferred, the more its "capacity" is filled by the proposed student-class.',+	`minimiseBookingAtAnotherCoursesSpecifiedTime`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A booking-time is preferred, if there\'s minimal probability that courses for the other knowledge-requirements of the student-body, will require that time according to specific time requests; the probability becomes a certainty for those knowledge-requirements which can only be satisfied by one course, allowing corresponding lessons to be filtered from the candidates, before this evaluation.',+	`minimiseBookingOfLocationByOtherTeachers`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A location is preferred, when booked by the fewest other teachers.',+	`minimiseDeviationFromTimeslotRequest`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A course is preferred, if it\'s booked closer to any timeslot-request.',+	`minimiseInterCampusMigrationsOfStudents`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A course is preferred, if inter-campus migrations of students are minimised.',+	`minimiseInterCampusMigrationsOfTeachers`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A course is preferred, if inter-campus migrations of teachers are minimised.',+	`minimiseStudentBodyCombinations`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A lesson is preferred, when the number of student-body combinations is minimised.',+	`minimiseTeachersLocusOperandi`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A location is preferred, if the size of locus-operandi for the teacher, is minimised; based merely on the number of distinct locations booked, rather than the distance between them.',+	`minimiseWasteOfScarceFacilities`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A lesson is preferred, if the unused facilities @ the location, are commonly available elsewhere.',+	CONSTRAINT `lessonCriteriaWeights.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the weights, in the closed unit-interval, of all lesson-criteria. CAVEAT: the default of zero, renders the corresponding criterion irrelevant.';++CREATE TABLE `tbl_timetableCriteriaWeights` (+	`projectId`							INT UNSIGNED	PRIMARY KEY			COMMENT 'Each project defines its own independent set of weights.',+	`maximiseComplianceWithFreePeriodPreferences`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when it complies with any "freePeriodPreference", of student-bodies & teachers.',+	`maximiseMeanRatioOfStudentClassSizeToLocationCapacity`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the mean over all bookings, of the ratio of the size of the student-class to the "capacity" of the location, is greatest.',+	`maximiseMeanStudentClassSize`					DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the mean over the size of student-classes, relative to the total number of students, is greatest.',+	`maximiseSynchronisationOfSynchronisedCourses`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the lessons of synchronised courses are consistently synchronised.',+	`maximiseWeightedMeanStudentBodyUtilisationRatio`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the mean over all student-bodies, of their utilisation-ratio, is maximised. It doesn\'t distinguish between "core" & "optional" subjects like "minimiseMeanRatioOfIncompletelyBookedCoreKnowledge" & "minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge", but it does value partially booked courses.',+	`minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when lessons are booked close to any "idealTimeslotRequest" for their course.',+	`minimiseDispersionOfStudentFreePeriodsPerDay`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when free periods of students are spread evenly across their working-week.',+	`minimiseDispersionOfTeacherFreePeriodsPerDay`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when free periods for the teacher are spread evenly across their working-week.',+	`minimiseDispersionOfTeacherWorkload`				DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the relative workload between all teachers, is similar.',+	`minimiseMeanInterCampusMigrationsOfStudents`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average over all students, of the number of inter-campus migrations in a week, is minimised.',+	`minimiseMeanInterCampusMigrationsOfTeachers`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average over all teachers, of the number of inter-campus migrations in a week, is minimised.',+	`minimiseMeanLocationChangesOfTeachers`				DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average over all teachers, of the number of changes in their location in a week, is minimised.',+	`minimiseMeanLocusOperandiOfTeachers`				DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average over all teachers, of the size of their locus-operandi, is minimised; based merely on the number of locations, rather than the distance or the number of changes, between them.',+	`minimiseMeanRatioOfIncompletelyBookedCoreKnowledge`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average over all student-bodies, of the ratio of incompletely booked core knowledge-requirements, to all requirements, is minimised. All incomplete courses are valued equally, regardless of the extent.',+	`minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge`	DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average over all student-bodies, of the ratio of incompletely booked optional knowledge-requirements, to all requirements, is minimised. All incomplete courses are valued equally, regardless of the extent.',+	`minimiseMeanStudentBodyCombinationsPerLesson`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the average number of combinations of student-class per lesson-definition, is minimised; ideally a student-body always studies a subject, in a class composed from the same other student-bodies.',+	`minimiseRatioOfConsecutiveEqualLessons`			DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when blocks of consecutive identical lessons are booked, whose length most closely corresponds, to that requested for the course to which they belong.',+	`minimiseRatioOfSeparatedEqualLessonsWithinAnyDay`		DOUBLE UNSIGNED	NOT NULL	DEFAULT 0.0	COMMENT 'A timetable is preferred, when the lessons of any course, are on any day, booked in one contiguous block.',+	CONSTRAINT `timetableCriteriaWeights.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Defines the weights, in the closed unit-interval, of all timetable-criteria. CAVEAT: the default of zero, renders the corresponding criterion irrelevant.';++CREATE TABLE `tbl_locationCatalogue` (+	`locationCatalogueId`	INT UNSIGNED									AUTO_INCREMENT	PRIMARY KEY								COMMENT 'Unique row-identifier.',+	`projectId`		INT UNSIGNED									NOT NULL										COMMENT 'Each project defines its own catalogue of locations.',+	`locationId`		VARCHAR(32)									NOT NULL										COMMENT 'The name of this location. CAVEAT: should start with an alphabetic character & should not contain spaces.',+	`availability`		SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')	NOT NULL	DEFAULT 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'	COMMENT 'The location may have a periodic availability. Defaults to all days.',+	`capacity`		SMALLINT UNSIGNED								NOT NULL										COMMENT 'Quantifies the ability to cater for students; typically the number of desks.',+	`campus`		VARCHAR(32)											DEFAULT NULL								COMMENT 'Locations are grouped by mutual proximity, into zones, between which intra-day migration is non-trivial.',+	CONSTRAINT `locationCatalogue.unique` UNIQUE KEY (`projectId`, `locationId`)															COMMENT 'Within the domain of a projectId, all "locationId"s are distinct.',+	CONSTRAINT `locationCatalogue.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the name, "capacity" & the days on which it\'s available for use, of each location.';++CREATE TABLE `tbl_facilityType` (+	`facilityTypeId`	INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY		COMMENT 'Unique row-identifier.',+	`projectId`		INT UNSIGNED	NOT NULL				COMMENT 'Each project defines its own set of facility-types.',+	`facilityName`		VARCHAR(32)	NOT NULL				COMMENT 'A free-format identifier for a type of facility which any location in this project, may advertise.',+	CONSTRAINT `facilityType.unique` UNIQUE KEY (`projectId`, `facilityName`)	COMMENT 'Within the domain of a "projectId", all "facilityName"s are distinct.',+	CONSTRAINT `facilityType.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='The set of facility-types which any location may advertise.';++CREATE TABLE `tbl_facility` (+	`id`			INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY			COMMENT 'Unique row-identifier.',+	`locationCatalogueId`	INT UNSIGNED	NOT NULL					COMMENT 'Each "projectId"/"locationId", defines its own independent set of facilities.',+	`facilityTypeId`	INT UNSIGNED	NOT NULL					COMMENT 'References a type of facility which this location provides.',+	CONSTRAINT `facility.unique` UNIQUE KEY (`locationCatalogueId`, `facilityTypeId`)	COMMENT 'Within the domain of a "locationCatalogueId", all "facilityTypeId"s are distinct.',+	CONSTRAINT `facility.locationCatalogueId` FOREIGN KEY (`locationCatalogueId`) REFERENCES `tbl_locationCatalogue` (`locationCatalogueId`) ON DELETE CASCADE,+	CONSTRAINT `facility.facilityTypeId` FOREIGN KEY (`facilityTypeId`) REFERENCES `tbl_facilityType` (`facilityTypeId`) ON DELETE CASCADE	-- "facility.beforeInsert" prevents one referencing a different 'projectId' from that implied by 'locationCatalogueId'.+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Advertises the set of facilities provided by each location.';++CREATE TABLE `tbl_groupCatalogue` (+	`groupCatalogueId`	INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY	COMMENT 'Unique row-identifier.',+	`projectId`		INT UNSIGNED	NOT NULL			COMMENT 'Each project defines its own catalogue of groups.',+	`groupId`		VARCHAR(32)	NOT NULL			COMMENT 'The name (typically the purpose or remit) of this group. CAVEAT: should start with an alphabetic character & should not contain spaces.',+	`locationId`		VARCHAR(32)			DEFAULT NULL	COMMENT 'Each group optionally references a location (in the same project) @ which to meet.',+	`mandatesAttendance`	BOOL				DEFAULT FALSE	COMMENT 'Whether each group-member is required to attend all meetings.',+	CONSTRAINT `groupCatalogue.unique` UNIQUE KEY (`projectId`, `groupId`)	COMMENT 'Within the domain of a "projectId", all "groupId"s are distinct.',+	INDEX `groupCatalogue(groupId)` (`groupId`)				COMMENT 'Required by foreign-key constraint "teacherGroupMembership.groupId" & "studentGroupMembership.groupId"',+	CONSTRAINT `groupCatalogue.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE,+	CONSTRAINT `groupCatalogue.(projectId,locationId)` FOREIGN KEY (`projectId`, `locationId`) REFERENCES `tbl_locationCatalogue` (`projectId`, `locationId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the groups to which student-bodies & teachers can subscribe';++CREATE TABLE `tbl_meetingTime` (+	`id`			INT UNSIGNED									AUTO_INCREMENT	PRIMARY KEY	COMMENT 'Unique row-identifier.',+	`groupCatalogueId`	INT UNSIGNED									NOT NULL			COMMENT 'Each "projectId"/"groupId" defines its own times.',+	`day`			ENUM('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')	NOT NULL			COMMENT 'The day of the week @ which to meet.',+	`timeslotId`		TINYINT										NOT NULL			COMMENT 'The time-slot within the specified day, @ which to meet.',+	CONSTRAINT `meetingTime.unique` UNIQUE KEY (`groupCatalogueId`, `day`, `timeslotId`)							COMMENT 'Within the domain of a "projectId"/"groupId", all times are distinct.',+	CONSTRAINT `meetingTime.groupCatalogueId` FOREIGN KEY (`groupCatalogueId`) REFERENCES `tbl_groupCatalogue` (`groupCatalogueId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='The times @ which groups meets.';++CREATE TABLE `tbl_stream` (+	`streamId`	INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY		COMMENT 'Unique row-identifier.',+	`projectId`	INT UNSIGNED	NOT NULL				COMMENT 'Each project defines its own set of streams.',+	`streamName`	VARCHAR(32)	NOT NULL				COMMENT 'A free-format identifier for a stream to which any student-body in this project may be assigned.',+	CONSTRAINT `stream.unique` UNIQUE KEY (`projectId`, `streamName`)	COMMENT 'Within the domain of a "projectId", all "streamName"s are distinct.',+	INDEX `stream.(projectId,streamId)` (`projectId`, `streamId`)		COMMENT 'Required by foreign-key constraint "studentBodyRegister.(projectId,streamId)"',+	CONSTRAINT `stream.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='The streams to which student-bodies may be assigned.';++CREATE TABLE `tbl_studentBodyRegister` (+	`studentBodyRegisterId`	INT UNSIGNED									AUTO_INCREMENT	PRIMARY KEY								COMMENT 'Unique row-identifier.',+	`projectId`		INT UNSIGNED									NOT NULL										COMMENT 'Each project defines its own register of student-bodies.',+	`mnemonic`		VARCHAR(32)									NOT NULL										COMMENT 'The name of the student-body. CAVEAT: should start with an alphabetic character & should not contain spaces.',+	`availability`		SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')	NOT NULL	DEFAULT 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'	COMMENT 'The common working week of the member-students.',+	`streamId`		INT UNSIGNED											DEFAULT NULL								COMMENT 'Optionally references the stream to which this student-body has been assigned.',+	`teachingRatio`		DOUBLE UNSIGNED									NOT NULL	DEFAULT 1.0								COMMENT 'The ratio in the semi-closed unit-interval (0,1], of the time when each member-student is available, which is allocated to tuition.',+	`freePeriodPreference`	ENUM('Pre','Post','Terminal')									DEFAULT NULL								COMMENT 'Any mutual preference for the position within each day, of unallocated time-slots.',+	CONSTRAINT `studentBodyRegister.unique` UNIQUE KEY (`projectId`, `mnemonic`)															COMMENT 'Within the domain of a "projectId", all student-body "mnemonic"s are distinct',+	CONSTRAINT `studentBodyRegister.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE,+	CONSTRAINT `studentBodyRegister.(projectId,streamId)` FOREIGN KEY (`projectId`, `streamId`) REFERENCES `tbl_stream` (`projectId`, `streamId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the "mnemonic" & the parameters of each student-body (i.e. groups of students whose requirements are identical).';++CREATE TABLE `tbl_studentBodyMembership` (+	`id`			INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY				COMMENT 'Unique row-identifier.',+	`studentBodyRegisterId`	INT UNSIGNED	NOT NULL						COMMENT 'Each "projectId"/"mnemonic" defines their own member-students.',+	`studentId`		VARCHAR(32)	NOT NULL						COMMENT 'The name of a member of this student-body. CAVEAT: should start with an alphabetic character & should not contain spaces.',+	CONSTRAINT `studentBodyMembership.unique` UNIQUE KEY (`studentBodyRegisterId`, `studentId`)	COMMENT 'Within the domain of a "projectId"/"mnemonic", all "studentId"s are distinct.',+	CONSTRAINT `studentBodyMembership.studentBodyRegisterId` FOREIGN KEY (`studentBodyRegisterId`) REFERENCES `tbl_studentBodyRegister` (`studentBodyRegisterId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines sets of students with identical requirements.';++CREATE TABLE `tbl_studentGroupMembership` (+	`id`			INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY				COMMENT 'Unique row-identifier.',+	`studentBodyRegisterId`	INT UNSIGNED	NOT NULL						COMMENT 'Each "projectId"/"mnemonic" defines the groups of which they are members.',+	`groupId`		VARCHAR(32)	NOT NULL						COMMENT 'The name of the group of which this student-body is a member.',+	CONSTRAINT `studentGroupMembership.unique` UNIQUE KEY (`studentBodyRegisterId`, `groupId`)	COMMENT 'Within the domain of a "projectId"/"mnemonic", all "groupId"s are distinct.',+	CONSTRAINT `studentGroupMembership.studentBodyRegisterId` FOREIGN KEY (`studentBodyRegisterId`) REFERENCES `tbl_studentBodyRegister` (`studentBodyRegisterId`) ON DELETE CASCADE,+	CONSTRAINT `studentGroupMembership.groupId` FOREIGN KEY (`groupId`) REFERENCES `tbl_groupCatalogue` (`groupId`) ON DELETE CASCADE	-- "studentGroupMembership.beforeInsert" prevents one referencing a different 'projectId' from that implied by 'studentBodyRegisterId'.+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='The groups of which student-bodies are members.';++CREATE TABLE `tbl_teacherRegister` (+	`teacherRegisterId`	INT UNSIGNED									AUTO_INCREMENT	PRIMARY KEY								COMMENT 'Unique row-identifier.',+	`projectId`		INT UNSIGNED									NOT NULL										COMMENT 'Each project defines its own register of teachers.',+	`teacherId`		VARCHAR(32)									NOT NULL										COMMENT 'The name of the teacher. CAVEAT: should start with an alphabetic character & should not contain spaces.',+	`availability`		SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')	NOT NULL	DEFAULT 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'	COMMENT 'The working week for this teacher.',+	`locationId`		VARCHAR(32)											DEFAULT NULL								COMMENT 'A teacher may have a fixed abode; e.g. a form-room.',+	`maximumTeachingRatio`	DOUBLE UNSIGNED									NOT NULL										COMMENT 'The maximum ratio of the working week for a teacher (rather than the whole week), which is devoted to teaching.',+	`freePeriodPreference`	ENUM('Pre','Post','Terminal')									DEFAULT NULL								COMMENT 'A teacher may have a preference for the position within each day, of unallocated time-slots.',+	CONSTRAINT `teacherRegister.unique` UNIQUE KEY (`projectId`, `teacherId`)															COMMENT 'Within the domain of a "projectId", all "teacherId"s are distinct.',+	CONSTRAINT `teacherRegister.projectId` FOREIGN KEY (`projectId`) REFERENCES `tbl_project` (`projectId`) ON DELETE CASCADE,+	CONSTRAINT `teacherRegister.(projectId,locationId)` FOREIGN KEY (`projectId`, `locationId`) REFERENCES `tbl_locationCatalogue` (`projectId`, `locationId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the name & attributes of each teacher.';++CREATE TABLE `tbl_teacherGroupMembership` (+	`id`			INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY			COMMENT 'Unique row-identifier.',+	`teacherRegisterId`	INT UNSIGNED	NOT NULL					COMMENT 'Each "projectId"/"teacherId" defines the groups of which they are members.',+	`groupId`		VARCHAR(32)	NOT NULL					COMMENT 'The name of the group of which this teacher is a member.',+	CONSTRAINT `teacherGroupMembership.unique` UNIQUE KEY (`teacherRegisterId`, `groupId`)	COMMENT 'Within the domain of a "projectId"/"teacherId", all "groupId"s are distinct.',+	CONSTRAINT `teacherGroupMembership.teacherRegisterId` FOREIGN KEY (`teacherRegisterId`) REFERENCES `tbl_teacherRegister` (`teacherRegisterId`) ON DELETE CASCADE,+	CONSTRAINT `teacherGroupMembership.groupId` FOREIGN KEY (`groupId`) REFERENCES `tbl_groupCatalogue` (`groupId`) ON DELETE CASCADE	-- "teacherGroupMembership.beforeInsert" prevents one referencing a different 'projectId' from that implied by 'teacherRegisterId'.+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='The groups of which teachers are members.';++CREATE TABLE `tbl_service` (+	`id`				INT UNSIGNED		AUTO_INCREMENT	PRIMARY KEY	COMMENT 'Unique row-identifier.',+	`teacherRegisterId`		INT UNSIGNED		NOT NULL			COMMENT 'Each "projectId"/"teacherId" defines their own service.',+	`topic`				VARCHAR(32)		NOT NULL			COMMENT 'The topic of study.',+	`level`				VARCHAR(32)		NOT NULL			COMMENT 'The level @ which the "topic" is to be taught, typically the academic year (though it\'s actually free-format).',+	`requiredLessonsPerWeek`	TINYINT UNSIGNED	NOT NULL			COMMENT 'The subject is assumed to take a minimum time-duration to teach, & for ease of scheduling, we assume that this is divided into a constant number of lessons per week.',+	`minimumConsecutiveLessons`	TINYINT UNSIGNED	NOT NULL	DEFAULT 1	COMMENT 'Some topics may require too great a preparation-time for an isolated lesson to be practical.',+	`maximumClassSize`		SMALLINT UNSIGNED			DEFAULT NULL	COMMENT 'The optional upper bound on the number of students for whom the teacher can cater.',+	`synchronisationId`		VARCHAR(32)				DEFAULT NULL	COMMENT 'The optional identifier, shared by courses whose bookings must be synchronised.',+	`idealTimeslotRequest`		TINYINT					DEFAULT NULL	COMMENT 'The optional "timeslotId" @ which lessons in this course will ideally be booked.',+	CONSTRAINT `service.unique` UNIQUE KEY (`teacherRegisterId`, `topic`, `level`)		COMMENT 'Within the domain of a "projectId"/"teacherId" all subjects are distinct. Also required by foreign-key constraint "requiredFacility.(teacherRegisterId,topic,level)".',+	CONSTRAINT `service.teacherRegisterId` FOREIGN KEY (`teacherRegisterId`) REFERENCES `tbl_teacherRegister` (`teacherRegisterId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the set of courses offered by each teacher.';++CREATE TABLE `tbl_specialtyTopic` (+	`teacherRegisterId`	INT UNSIGNED	PRIMARY KEY	COMMENT 'Each "teacherRegisterId" can optionally define a single specialty topic.',+	`topic`			VARCHAR(32)	NOT NULL	COMMENT 'The topic in which the teacher spcialises.',+	CONSTRAINT `specialtyTopic.(teacherRegisterId,topic)` FOREIGN KEY (`teacherRegisterId`, `topic`) REFERENCES `tbl_service` (`teacherRegisterId`, `topic`) ON DELETE CASCADE+) ENGINE=InnoDB	DEFAULT CHARSET=latin1	COMMENT='Identifies any single specialty topic amongst those offered in a teacher\'s service.';++-- Replacing the triple (`teacherRegisterId`, `day`, `timeslotId`) by `id`, results in 3 dependent drop-downs on web-i/f being replaced by a single long dropdown which is hard to navigate.+CREATE TABLE `tbl_specificTimeRequest` (+	`id`			INT UNSIGNED									AUTO_INCREMENT	PRIMARY KEY	COMMENT 'Unique row-identifier.',+	`teacherRegisterId`	INT UNSIGNED									NOT NULL			COMMENT 'Each "projectId"/"teacherId" defines any specific times @ which they want to book a lesson in a course.',+	`topic`			VARCHAR(32)									NOT NULL			COMMENT 'The topic of study.',+	`level`			VARCHAR(32)									NOT NULL			COMMENT 'The level of the "topic" which is being taught.',+	`day`			ENUM('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')	NOT NULL			COMMENT 'The day of the week on which to request a booking.',+	`timeslotId`		TINYINT										NOT NULL			COMMENT 'The time-slot within the specified day, @ which to request a booking.',+	CONSTRAINT `specificTimeRequest.unique` UNIQUE KEY (`teacherRegisterId`, `day`, `timeslotId`)						COMMENT 'Within the domain of a "projectId"/"teacherId", all specified times are distinct (irrespective of the subject booked).',+	CONSTRAINT `specificTimeRequest.(teacherRegisterId,topic,level)` FOREIGN KEY (`teacherRegisterId`, `topic`, `level`) REFERENCES `tbl_service` (`teacherRegisterId`, `topic`, `level`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Any specific times @ which lessons in a course must be booked.';++-- Replacing the triple (`teacherRegisterId`, `day`, `timeslotId`) by `id`, results in 3 dependent drop-downs on the web-i/f being replaced by a single long dropdown which is hard to navigate.+CREATE TABLE `tbl_requiredFacility` (+	`id`			INT UNSIGNED	AUTO_INCREMENT	PRIMARY KEY						COMMENT 'Unique row-identifier.',+	`teacherRegisterId`	INT UNSIGNED	NOT NULL								COMMENT 'Each "projectId"/"teacherId" defines the facilities required to teach a course.',+	`topic`			VARCHAR(32)	NOT NULL								COMMENT 'The topic of study.',+	`level`			VARCHAR(32)	NOT NULL								COMMENT 'The level @ which this "topic" is being taught.',+	`facilityTypeId`	INT UNSIGNED	NOT NULL								COMMENT 'References a type of facility which is required of the selected location, in order to teach this course there.',+	CONSTRAINT `requiredFacility.unique` UNIQUE KEY (`teacherRegisterId`, `topic`, `level`, `facilityTypeId`)	COMMENT 'Within the domain of a ("teacherRegisterId","topic","level"), all facility-types are distinct; i.e. all rows are different.',+	CONSTRAINT `requiredFacility.(teacherRegisterId,topic,level)` FOREIGN KEY (`teacherRegisterId`, `topic`, `level`) REFERENCES `tbl_service` (`teacherRegisterId`, `topic`, `level`) ON DELETE CASCADE,+	CONSTRAINT `requiredFacility.facilityTypeId` FOREIGN KEY (`facilityTypeId`) REFERENCES `tbl_facilityType` (`facilityTypeId`) ON DELETE CASCADE	-- "requiredFacility.beforeInsert" prevents one referencing a different 'projectId' from that implied by 'teacherRegisterId'.+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='Defines the set of facilities required to teach a subject.';++CREATE TABLE `tbl_knowledgeRequirement` (+	`id`			INT UNSIGNED		AUTO_INCREMENT	PRIMARY KEY		COMMENT 'Unique row-identifier.',+	`studentBodyRegisterId`	INT UNSIGNED		NOT NULL				COMMENT 'Each "projectId"/"mnemonic" defines their own knowledge-requirements.',+	`priority`		ENUM('core','optional')	NOT NULL	DEFAULT 'core'		COMMENT 'Whether the knowledge is required or merely desired.',+	`topic`			VARCHAR(32)		NOT NULL				COMMENT 'The topic to be studied.',+	`level`			VARCHAR(32)		NOT NULL				COMMENT 'The level @ which the "topic" is to be studied.',+	CONSTRAINT `knowledgeRequirement.unique` UNIQUE KEY (`studentBodyRegisterId`, `topic`)	COMMENT 'Within the domain of a "projectId"/"mnemonic", all "topics" are distinct (a student can\'t study a "topic" @ more than one "level").',+	CONSTRAINT `knowledgeRequirement.studentBodyRegisterId` FOREIGN KEY (`studentBodyRegisterId`) REFERENCES `tbl_studentBodyRegister` (`studentBodyRegisterId`) ON DELETE CASCADE+) ENGINE=InnoDB	AUTO_INCREMENT=1	DEFAULT CHARSET=latin1	COMMENT='The subjects required by each student.';+
+ sql/MySQL/weekdazeExamples.sql view
@@ -0,0 +1,3518 @@+-- Copyright (C) 2015 Dr. Alistair Ward+--+-- This file is part of WeekDaze.+--+-- WeekDaze 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.+--+-- WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.++/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;+/*!40101 SET NAMES utf8 */;+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;+/*!40103 SET TIME_ZONE='+00:00' */;+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;++/*+	CAVEAT: after reading the definition of a project from this database, weekdaze may export it as XML,+	so the data contained in some database-columns ("groupId", "locationId", "mnemonic", "studentId", "teacherId") which are defined in the DTD as XML "ID"-attributes,+	must start with an alphabetic character, & may not contain spaces.+*/++LOCK TABLES `tbl_user` WRITE;+INSERT INTO `tbl_user` (+	`userId`,+	`name`,+	`emailAddress`,+	`executable`,+	`mutable`,+	`created`+) VALUES (+	1,	'example',	'example@bogus.tld',	1,	0,	'2015-01-01 00:00:00'	-- The owner for the example-projects.+);+UNLOCK TABLES;++LOCK TABLES `tbl_project` WRITE;+INSERT INTO `tbl_project` (+	`userId`,+	`projectName`,+	`projectId`+) VALUES (+	1,	'example_01',	1+), (+	1,	'example_02',	2+), (+	1,	'example_03',	3+), (+	1,	'example_05',	4+), (+	1,	'example_08',	5+), (+	1,	'example_13',	6+);+UNLOCK TABLES;++LOCK TABLES `tbl_configVersion` WRITE;+INSERT INTO `tbl_configVersion` (`configVersion`) VALUES ('1.0');+UNLOCK TABLES;++LOCK TABLES `tbl_options` WRITE;+INSERT INTO `tbl_options` (+	`projectId`,+	`configVersion`+) VALUES (+	1,	'1.0'+), (+	2,	'1.0'+), (+	3,	'1.0'+), (+	4,	'1.0'+), (+	5,	'1.0'+), (+	6,	'1.0'+);+UNLOCK TABLES;++LOCK TABLES `tbl_timeslotIdBounds` WRITE;+INSERT INTO `tbl_timeslotIdBounds` (+	`projectId`,+	`max`+) VALUES (+	1,	0+), (+	2,	1+), (+	3,	2+), (+	4,	4+), (+	5,	7+), (+	6,	12+);+UNLOCK TABLES;++LOCK TABLES `tbl_problemValidationSwitches` WRITE;+INSERT INTO `tbl_problemValidationSwitches` (+	`projectId`,+	`checkIfStudentBodiesExceedTeachers`,+	`checkIfStudentBodySizeExceedsLocationCapacity`+) VALUES (+	1,	FALSE,	FALSE+), (+	2,	FALSE,	FALSE+), (+	3,	FALSE,	FALSE+), (+	4,	FALSE,	FALSE+), (+	5,	FALSE,	FALSE+), (+	6,	FALSE,	FALSE+);+UNLOCK TABLES;++LOCK TABLES `tbl_executionOptions` WRITE;+INSERT INTO `tbl_executionOptions` (+	`projectId`,+	`randomSeed`+) VALUES (+	1,	0+), (+	2,	0+), (+	3,	0+), (+	4,	0+), (+	5,	0+), (+	6,	0+);+UNLOCK TABLES;++LOCK TABLES `tbl_style` WRITE;+INSERT INTO `tbl_style` (+	`projectId`,+	`generateLessonColourFrom`,+	`minimumContrastRatio`+) VALUES (+	1,	"Topic",	0.05+), (+	2,	"Topic",	0.05+), (+	3,	NULL,		NULL+), (+	4,	NULL,		NULL+), (+	5,	NULL,		NULL+), (+	6,	NULL,		NULL+);+UNLOCK TABLES;++LOCK TABLES `tbl_outputOptions` WRITE;+INSERT INTO `tbl_outputOptions` (+	`projectId`+) VALUES (+	1+), (+	2+), (+	3+), (+	4+), (+	5+), (+	6+);+UNLOCK TABLES;++LOCK TABLES `tbl_evolutionStrategies` WRITE;+INSERT INTO `tbl_evolutionStrategies` (+	`projectId`,+	`synchronisedCourseMutationDeterministicCTor`,+	`synchronisedCourseMutationRandomCTor`,+	`synchronisedCourseByDayMutationDeterministicCTor`,+	`synchronisedCourseByDayMutationRandomCTor`,+	`excessRunlengthMutationDeterministicCTor`,+	`excessRunlengthMutationRandomCTor`,+	`homogeneousStudentViewLessonMutationDeterministicCTor`,+	`homogeneousStudentViewLessonMutationRandomCTor`,+	`incompleteCourseMutationDeterministicCTor`,+	`incompleteCourseMutationRandomCTor`,+	`randomLessonMutationDeterministicCTor`,+	`randomLessonMutationRandomCTor`,+	`singletonStudentClassMutationDeterministicCTor`,+	`singletonStudentClassMutationRandomCTor`,+	`splitSessionMutationDeterministicCTor`,+	`splitSessionMutationRandomCTor`,+	`studentBodyCombinationMutationDeterministicCTor`,+	`studentBodyCombinationMutationRandomCTor`,+	`studentViewTimetableForDayMutationDeterministicCTor`,+	`studentViewTimetableForDayMutationRandomCTor`,+	`studentViewTimetableForWeekMutationDeterministicCTor`,+	`studentViewTimetableForWeekMutationRandomCTor`,+	`synchronousLessonMutationDeterministicCTor`,+	`synchronousLessonMutationRandomCTor`,+/*+	`randomLessonMutationNTrials`,+	`randomLessonMutationNTimeslots`,+	`studentViewTimetableForDayMutationNDays`,+	`studentViewTimetableForWeekMutationNTrials`,+	`studentViewTimetableForWeekMutationNTimeslots`,+*/+	`nInitialScouts`+) VALUES (+	1,	0,	0,	0,	0,	32,	64,	32,	64,	32,	64,	32,	64,	32,	64,	0,	64,	32,	64,	32,	64,	32,	64,	32,	64,	NULL+), (+	2,	0,	0,	0,	0,	128,	256,	128,	256,	128,	256,	128,	256,	128,	256,	0,	256,	128,	256,	128,	256,	128,	256,	128,	256,	NULL+), (+	3,	0,	0,	0,	0,	128,	256,	128,	256,	128,	256,	128,	256,	128,	256,	0,	256,	128,	256,	256,	256,	128,	256,	128,	256,	2+), (+	4,	128,	256,	128,	256,	128,	256,	128,	256,	128,	256,	128,	256,	128,	256,	0,	256,	128,	256,	256,	256,	128,	256,	128,	256,	2+), (+	5,	512,	1024,	512,	1024,	512,	1024,	512,	1024,	512,	1024,	1024,	2048,	512,	1024,	0,	1024,	512,	1024,	1024,	1024,	512,	1024,	512,	1024,	2+), (+	6,	512,	1024,	512,	1024,	512,	1024,	512,	1024,	512,	1024,	2048,	4096,	512,	1024,	0,	1024,	512,	1024,	1024,	1024,	512,	1024,	512,	1024,	2+);+UNLOCK TABLES;++LOCK TABLES `tbl_lessonCriteriaWeights` WRITE;+INSERT INTO `tbl_lessonCriteriaWeights` (+	`projectId`,+	`areResourcesReused`,+	`greatestMinimumConsecutiveLessons`,+	`greatestRemainingCourseLessons`,+	`greatestSynchronisedCourseSetSize`,+	`isCoreKnowledgeRequirement`,+	`isSpecialistInTopic`,+	`matchCourseClassSizeToLocationCapacity`,+	`maximiseRelativeFacilityUtilisation`,+	`minimiseBookingAtAnotherCoursesSpecifiedTime`,+	`minimiseBookingOfLocationByOtherTeachers`,+	`minimiseDeviationFromTimeslotRequest`,+	`minimiseInterCampusMigrationsOfStudents`,+	`minimiseInterCampusMigrationsOfTeachers`,+	`minimiseStudentBodyCombinations`,+	`minimiseTeachersLocusOperandi`,+	`minimiseWasteOfScarceFacilities`+) VALUES (+	1,	0.5227,	0,	0.1588,	0,	0.0373,	0.0547,	0.072,	0.0675,	0,	0.0707,	0,	0,	0,	0.0843,	0.0503,	1+), (+	2,	0.5227,	0,	0.1588,	0,	0.0373,	0.0547,	0.072,	0.0675,	0,	0.0707,	0,	0,	0,	0.0843,	0.0503,	1+), (+	3,	0.1074,	0.0183,	0.0339,	0,	0.0136,	0.0134,	0.0293,	0.0078,	0,	0.0196,	0,	0.0625,	0.0698,	0.0354,	0.0065,	1+), (+	4,	0.0031,	0.0353,	0.0062,	0,	0.0035,	0.0028,	0.0065,	0.0049,	1,	0.0054,	0.0056,	0.035,	0.0383,	0.0701,	0.0078,	0.0383+), (+	5,	0.01,	0.0753,	0.0084,	0.2653,	0.0229,	0.0018,	0.0112,	0.0079,	0.1947,	0.0034,	0.028,	0.0682,	0.0396,	0.2577,	0.007,	1+), (+	6,	0.0048,	0.0915,	0.0141,	0.1467,	0.012,	0.0052,	0.0053,	0.0057,	1,	0.0073,	0.0187,	0.1178,	0.0632,	0.0342,	0.0059,	0.0761+);+UNLOCK TABLES;++LOCK TABLES `tbl_timetableCriteriaWeights` WRITE;+INSERT INTO `tbl_timetableCriteriaWeights` (+	`projectId`,+	`maximiseComplianceWithFreePeriodPreferences`,+	`maximiseMeanRatioOfStudentClassSizeToLocationCapacity`,+	`maximiseMeanStudentClassSize`,+	`maximiseSynchronisationOfSynchronisedCourses`,+	`maximiseWeightedMeanStudentBodyUtilisationRatio`,+	`minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest`,+	`minimiseDispersionOfStudentFreePeriodsPerDay`,+	`minimiseDispersionOfTeacherFreePeriodsPerDay`,+	`minimiseDispersionOfTeacherWorkload`,+	`minimiseMeanInterCampusMigrationsOfStudents`,+	`minimiseMeanInterCampusMigrationsOfTeachers`,+	`minimiseMeanLocationChangesOfTeachers`,+	`minimiseMeanLocusOperandiOfTeachers`,+	`minimiseMeanRatioOfIncompletelyBookedCoreKnowledge`,+	`minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge`,+	`minimiseMeanStudentBodyCombinationsPerLesson`,+	`minimiseRatioOfConsecutiveEqualLessons`,+	`minimiseRatioOfSeparatedEqualLessonsWithinAnyDay`+) VALUES (+	1,	0,		0.0625,		0.25,	0,	0.5,	0.125,		0.03125,	0.03125,	0.03125,	0,	0,	0.0625,	0.0625,	0.5,	0.25,	0.75,	0.125,	0+), (+	2,	0,		0.0625,		0.5,	0,	0.5,	0.125,		0.03125,	0.03125,	0.03125,	0,	0,	0.0625,	0.0625,	0.5,	0.25,	0.75,	0.125,	0+), (+	3,	0.0625,		0.0625,		0.5,	0,	0.5,	0.125,		0.03125,	0.03125,	0.03125,	0.5,	0.5,	0.0625,	0.0625,	0.5,	0.25,	0.75,	0.125,	0.25+), (+	4,	0.0625,		0.03125,	0.25,	0.5,	0.5,	0.0625,		0.015625,	0.015625,	0.03125,	0.5,	0.5,	0.0625,	0.0625,	0.5,	0.25,	0.75,	0.125,	0.25+), (+	5,	0.03125,	0.0625,		0.5,	0.5,	0.5,	0.0625,		0.03125,	0.03125,	0.03125,	0.25,	0.5,	0.0625,	0.0625,	0.5,	0.25,	0.75,	0.25,	0.25+), (+	6,	0.015625,	0.0625,		0.5,	0.5,	0.5,	0.125,		0.0078125,	0.015625,	0.03125,	0.5,	0.5,	0.0625,	0.0625,	0.5,	0.25,	0.75,	0.25,	0.25+);+UNLOCK TABLES;++LOCK TABLES `tbl_locationCatalogue` WRITE;+INSERT INTO `tbl_locationCatalogue` (+	`locationCatalogueId`,+	`projectId`,+	`locationId`,+	`availability`,+	`capacity`,+	`campus`+) VALUES (+	1,	1,	'Location_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	8,	NULL+), (+	2,	1,	'Location_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	8,	NULL+), (+	3,	2,	'Classroom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	4,	NULL+), (+	4,	2,	'Classroom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	8,	NULL+), (+	5,	2,	'Kitchen_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	6,	2,	'MusicRoom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	4,	NULL+), (+	7,	2,	'PhysicsLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	8,	3,	'ChemistryLab_1',	'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	9,	3,	'Classroom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	4,	NULL+), (+	10,	3,	'Classroom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	6,	NULL+), (+	11,	3,	'Gym',			'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	"Sports-complex"+), (+	12,	3,	'Kitchen_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	13,	3,	'MusicRoom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	4,	NULL+), (+	14,	3,	'PhysicsLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	15,	4,	'AssemblyHall',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	40,	NULL+), (+	16,	4,	'BiologyLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	17,	4,	'BiologyLab_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			8,	NULL+), (+	18,	4,	'ChemistryLab_1',	'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	19,	4,	'Classroom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	20,	4,	'Classroom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	16,	NULL+), (+	21,	4,	'Classroom_3',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	22,	4,	'Classroom_4',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	16,	NULL+), (+	23,	4,	'GamesField',		'Tuesday,Wednesday',						40,	"Sports-complex"+), (+	24,	4,	'Gym',			'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	"Sports-complex"+), (+	25,	4,	'Kitchen_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	26,	4,	'Kitchen_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			8,	NULL+), (+	27,	4,	'MusicRoom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	4,	NULL+), (+	28,	4,	'MusicRoom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	8,	NULL+), (+	29,	4,	'PhysicsLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			4,	NULL+), (+	30,	4,	'PhysicsLab_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			8,	NULL+), (+	31,	5,	'AssemblyHall',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	40,	NULL+), (+	32,	5,	'BiologyLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	33,	5,	'BiologyLab_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	34,	5,	'ChemistryLab_1',	'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	35,	5,	'Classroom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	36,	5,	'Classroom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	16,	NULL+), (+	37,	5,	'Classroom_3',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	38,	5,	'Classroom_4',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	16,	NULL+), (+	39,	5,	'DiningHall',		'Monday,Tuesday,Wednesday,Thursday,Friday',			40,	NULL+), (+	40,	5,	'GamesField',		'Tuesday,Wednesday',						40,	"Sports-complex"+), (+	41,	5,	'Gym',			'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	"Sports-complex"+), (+	42,	5,	'Kitchen_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	43,	5,	'Kitchen_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	44,	5,	'MusicRoom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	6,	NULL+), (+	45,	5,	'MusicRoom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	46,	5,	'PhysicsLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	47,	5,	'PhysicsLab_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	48,	6,	'ArtRoom',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	49,	6,	'AssemblyHall',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	40,	NULL+), (+	50,	6,	'BiologyLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	51,	6,	'BiologyLab_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	52,	6,	'ChemistryLab_1',	'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	53,	6,	'Classroom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	54,	6,	'Classroom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	16,	NULL+), (+	55,	6,	'Classroom_3',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	56,	6,	'Classroom_4',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	16,	NULL+), (+	57,	6,	'DiningHall',		'Monday,Tuesday,Wednesday,Thursday,Friday',			60,	NULL+), (+	58,	6,	'GamesField',		'Sunday,Tuesday,Wednesday,Saturday',				40,	"Sports-complex"+), (+	59,	6,	'Gym',			'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	"Sports-complex"+), (+	60,	6,	'Kitchen_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	61,	6,	'Kitchen_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	62,	6,	'MusicRoom_1',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	6,	NULL+), (+	63,	6,	'MusicRoom_2',		'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	12,	NULL+), (+	64,	6,	'PhysicsLab_1',		'Monday,Tuesday,Wednesday,Thursday,Friday',			6,	NULL+), (+	65,	6,	'PhysicsLab_2',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+), (+	66,	6,	'SwimmingBaths',	'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',	20,	"Sports-complex"+), (+	67,	6,	'WoodworkRoom',		'Monday,Tuesday,Wednesday,Thursday,Friday',			12,	NULL+);+UNLOCK TABLES;++LOCK TABLES `tbl_facilityType` WRITE;+INSERT INTO `tbl_facilityType` (+	`facilityTypeId`,+	`projectId`,+	`facilityName`+) VALUES (+	1,	2,	'Blackboard'+), (+	2,	2,	'Desks'+), (+	3,	2,	'Kitchen-equipment'+), (+	4,	2,	'Musical instruments'+), (+	5,	2,	'Physics-lab'+), (+	6,	3,	'Blackboard'+), (+	7,	3,	'Chemistry-lab'+), (+	8,	3,	'Desks'+), (+	9,	3,	'Gym-equipment'+), (+	10,	3,	'Kitchen-equipment'+), (+	11,	3,	'Musical instruments'+), (+	12,	3,	'Physics-lab'+), (+	13,	4,	'Biology-lab'+), (+	14,	4,	'Blackboard'+), (+	15,	4,	'Chemistry-lab'+), (+	16,	4,	'Desks'+), (+	17,	4,	'Goal-posts'+), (+	18,	4,	'Gym-equipment'+), (+	19,	4,	'Kitchen-equipment'+), (+	20,	4,	'Lectern'+), (+	21,	4,	'Musical instruments'+), (+	22,	4,	'Physics-lab'+), (+	23,	4,	'Pipe-organ'+), (+	24,	4,	'Running-track'+), (+	25,	4,	'Seats'+), (+	26,	4,	'Showers'+), (+	27,	5,	'Biology-lab'+), (+	28,	5,	'Blackboard'+), (+	29,	5,	'Chemistry-lab'+), (+	30,	5,	'Desks'+), (+	31,	5,	'Goal-posts'+), (+	32,	5,	'Gym-equipment'+), (+	33,	5,	'Kitchen-equipment'+), (+	34,	5,	'Lectern'+), (+	35,	5,	'Musical instruments'+), (+	36,	5,	'Pipe-organ'+), (+	37,	5,	'Physics-lab'+), (+	38,	5,	'Running-track'+), (+	39,	5,	'Seats'+), (+	40,	5,	'Showers'+), (+	41,	5,	'Tables'+), (+	42,	6,	'Art-tools'+), (+	43,	6,	'Biology-lab'+), (+	44,	6,	'Blackboard'+), (+	45,	6,	'Chemistry-lab'+), (+	46,	6,	'Desks'+), (+	47,	6,	'Drawing-desks'+), (+	48,	6,	'Easels'+), (+	49,	6,	'Goal-posts'+), (+	50,	6,	'Gym-equipment'+), (+	51,	6,	'Kitchen-equipment'+), (+	52,	6,	'Lectern'+), (+	53,	6,	'Musical instruments'+), (+	54,	6,	'Physics-lab'+), (+	55,	6,	'Pipe-organ'+), (+	56,	6,	'Running-track'+), (+	57,	6,	'Seats'+), (+	58,	6,	'Showers'+), (+	59,	6,	'Sinks'+), (+	60,	6,	'Swimming-pool'+), (+	61,	6,	'Tables'+), (+	62,	6,	'Wood-tools'+), (+	63,	6,	'Work-benches'+);+UNLOCK TABLES;++LOCK TABLES `tbl_facility` WRITE;+INSERT INTO `tbl_facility` (+	`locationCatalogueId`,+	`facilityTypeId`+) VALUES (+	3,	1	-- 'Blackboard'+), (+	3,	2	-- 'Desks'+), (+	4,	1	-- 'Blackboard'+), (+	4,	2	-- 'Desks'+), (+	5,	3	-- 'Kitchen-equipment'+), (+	6,	4	-- 'Musical instruments'+), (+	7,	1	-- 'Blackboard'+), (+	7,	2	-- 'Desks'+), (+	7,	5	-- 'Physics-lab'+), (+	8,	6	-- 'Blackboard'+), (+	8,	7	-- 'Chemistry-lab'+), (+	8,	8	-- 'Desks'+), (+	9,	6	-- 'Blackboard'+), (+	9,	8	-- 'Desks'+), (+	10,	6	-- 'Blackboard'+), (+	10,	8	-- 'Desks'+), (+	11,	9	-- 'Gym-equipment'+), (+	12,	10	-- 'Kitchen-equipment'+), (+	13,	11	-- 'Musical instruments'+), (+	14,	6	-- 'Blackboard'+), (+	14,	8	-- 'Desks'+), (+	14,	12	-- 'Physics-lab'+), (+	15,	20	-- 'Lectern'+), (+	15,	23	-- 'Pipe-organ'+), (+	15,	25	-- 'Seats'+), (+	16,	13	-- 'Biology-lab'+), (+	16,	14	-- 'Blackboard'+), (+	16,	16	-- 'Desks'+), (+	17,	13	-- 'Biology-lab'+), (+	17,	14	-- 'Blackboard'+), (+	17,	16	-- 'Desks'+), (+	18,	14	-- 'Blackboard'+), (+	18,	15	-- 'Chemistry-lab'+), (+	18,	16	-- 'Desks'+), (+	19,	14	-- 'Blackboard'+), (+	19,	16	-- 'Desks'+), (+	20,	14	-- 'Blackboard'+), (+	20,	16	-- 'Desks'+), (+	21,	14	-- 'Blackboard'+), (+	21,	16	-- 'Desks'+), (+	22,	14	-- 'Blackboard'+), (+	22,	16	-- 'Desks'+), (+	23,	17	-- 'Goal-posts'+), (+	23,	24	-- 'Running-track'+), (+	23,	26	-- 'Showers'+), (+	24,	18	-- 'Gym-equipment'+), (+	25,	19	-- 'Kitchen-equipment'+), (+	26,	19	-- 'Kitchen-equipment'+), (+	27,	21	-- 'Musical instruments'+), (+	28,	14	-- 'Blackboard'+), (+	28,	21	-- 'Musical instruments'+), (+	29,	14	-- 'Blackboard'+), (+	29,	16	-- 'Desks'+), (+	29,	22	-- 'Physics-lab'+), (+	30,	14	-- 'Blackboard'+), (+	30,	16	-- 'Desks'+), (+	30,	22	-- 'Physics-lab'+), (+	31,	34	-- 'Lectern'+), (+	31,	36	-- 'Pipe-organ'+), (+	31,	39	-- 'Seats'+), (+	32,	27	-- 'Biology-lab'+), (+	32,	28	-- 'Blackboard'+), (+	32,	30	-- 'Desks'+), (+	33,	27	-- 'Biology-lab'+), (+	33,	28	-- 'Blackboard'+), (+	33,	30	-- 'Desks'+), (+	34,	28	-- 'Blackboard'+), (+	34,	29	-- 'Chemistry-lab'+), (+	34,	30	-- 'Desks'+), (+	35,	28	-- 'Blackboard'+), (+	35,	30	-- 'Desks'+), (+	36,	28	-- 'Blackboard'+), (+	36,	30	-- 'Desks'+), (+	37,	28	-- 'Blackboard'+), (+	37,	30	-- 'Desks'+), (+	38,	28	-- 'Blackboard'+), (+	38,	30	-- 'Desks'+), (+	39,	39	-- 'Seats'+), (+	39,	41	-- 'Tables'+), (+	40,	31	-- 'Goal-posts'+), (+	40,	38	-- 'Running-track'+), (+	40,	40	-- 'Showers'+), (+	41,	32	-- 'Gym-equipment'+), (+	42,	33	-- 'Kitchen-equipment'+), (+	43,	33	-- 'Kitchen-equipment'+), (+	44,	35	-- 'Musical instruments'+), (+	45,	28	-- 'Blackboard'+), (+	45,	35	-- 'Musical instruments'+), (+	46,	28	-- 'Blackboard'+), (+	46,	30	-- 'Desks'+), (+	46,	37	-- 'Physics-lab'+), (+	47,	28	-- 'Blackboard'+), (+	47,	30	-- 'Desks'+), (+	47,	37	-- 'Physics-lab'+), (+	48,	42	-- 'Art-tools'+), (+	48,	47	-- 'Drawing-desks'+), (+	48,	48	-- 'Easels'+), (+	48,	59	-- 'Sinks'+), (+	49,	52	-- 'Lectern'+), (+	49,	55	-- 'Pipe-organ'+), (+	49,	57	-- 'Seats'+), (+	50,	43	-- 'Biology-lab'+), (+	50,	44	-- 'Blackboard'+), (+	50,	46	-- 'Desks'+), (+	51,	43	-- 'Biology-lab'+), (+	51,	44	-- 'Blackboard'+), (+	51,	46	-- 'Desks'+), (+	52,	44	-- 'Blackboard'+), (+	52,	45	-- 'Chemistry-lab'+), (+	52,	46	-- 'Desks'+), (+	53,	44	-- 'Blackboard'+), (+	53,	46	-- 'Desks'+), (+	54,	44	-- 'Blackboard'+), (+	54,	46	-- 'Desks'+), (+	55,	44	-- 'Blackboard'+), (+	55,	46	-- 'Desks'+), (+	56,	44	-- 'Blackboard'+), (+	56,	46	-- 'Desks'+), (+	57,	57	-- 'Seats'+), (+	57,	61	-- 'Tables'+), (+	58,	49	-- 'Goal-posts'+), (+	58,	56	-- 'Running-track'+), (+	58,	58	-- 'Showers'+), (+	59,	50	-- 'Gym-equipment'+), (+	60,	51	-- 'Kitchen-equipment'+), (+	61,	51	-- 'Kitchen-equipment'+), (+	62,	53	-- 'Musical instruments'+), (+	63,	44	-- 'Blackboard'+), (+	63,	53	-- 'Musical instruments'+), (+	64,	44	-- 'Blackboard'+), (+	64,	46	-- 'Desks'+), (+	64,	54	-- 'Physics-lab'+), (+	65,	44	-- 'Blackboard'+), (+	65,	46	-- 'Desks'+), (+	65,	54	-- 'Physics-lab'+), (+	66,	60	-- 'Swimming-pool'+), (+	67,	62	-- 'Wood-tools'+), (+	67,	63	-- 'Work-benches'+);+UNLOCK TABLES;++LOCK TABLES `tbl_groupCatalogue` WRITE;+INSERT INTO `tbl_groupCatalogue` (+	`groupCatalogueId`,+	`projectId`,+	`groupId`,+	`locationId`,+	`mandatesAttendance`+) VALUES (+	1,	4,	'Administrators',	NULL,		TRUE+), (+	2,	4,	'Assembly',		'AssemblyHall',	FALSE+), (+	3,	4,	'Choir',		'MusicRoom_1',	TRUE+), (+	4,	4,	'Christians',		NULL,		TRUE+), (+	5,	4,	'Drama',		'MusicRoom_2',	TRUE+), (+	6,	4,	'Musicians',		NULL,		TRUE+), (+	7,	4,	'Science-teachers',	NULL,		TRUE+), (+	8,	4,	'Sport-teachers',	NULL,		TRUE+), (+	9,	5,	'Administrators',	NULL,		TRUE+), (+	10,	5,	'Assembly',		'AssemblyHall',	FALSE+), (+	11,	5,	'Choir',		'MusicRoom_1',	TRUE+), (+	12,	5,	'Drama',		'MusicRoom_2',	TRUE+), (+	13,	5,	'Lunch',		'DiningHall',	FALSE+), (+	14,	5,	'Musicians',		NULL,		TRUE+), (+	15,	5,	'Science-teachers',	NULL,		TRUE+), (+	16,	5,	'Sport-teachers',	NULL,		TRUE+), (+	17,	6,	'Administrators',	NULL,		TRUE+), (+	18,	6,	'Assembly',		'AssemblyHall',	FALSE+), (+	19,	6,	'Chess',		'Classroom_1',	FALSE+), (+	20,	6,	'Choir',		'MusicRoom_1',	TRUE+), (+	21,	6,	'Debating',		'Classroom_2',	TRUE+), (+	22,	6,	'Drama',		'MusicRoom_2',	TRUE+), (+	23,	6,	'Lunch_A',		'DiningHall',	FALSE+), (+	24,	6,	'Lunch_B',		'DiningHall',	FALSE+), (+	25,	6,	'Science-teachers',	NULL,		TRUE+), (+	26,	6,	'Sport-teachers',	NULL,		TRUE+);+UNLOCK TABLES;++LOCK TABLES `tbl_meetingTime` WRITE;+INSERT INTO `tbl_meetingTime` (+	`groupCatalogueId`,+	`day`,+	`timeslotId`+) VALUES (+	1,	'Tuesday',	0+), (+	2,	'Monday',	0+), (+	2,	'Tuesday',	0+), (+	2,	'Wednesday',	0+), (+	2,	'Thursday',	0+), (+	2,	'Friday',	0+), (+	3,	'Friday',	4+), (+	5,	'Friday',	4+), (+	7,	'Wednesday',	0+), (+	9,	'Tuesday',	0+), (+	10,	'Monday',	0+), (+	10,	'Tuesday',	0+), (+	10,	'Wednesday',	0+), (+	10,	'Thursday',	0+), (+	10,	'Friday',	0+), (+	11,	'Friday',	7+), (+	12,	'Friday',	7+), (+	13,	'Monday',	4+), (+	13,	'Tuesday',	4+), (+	13,	'Wednesday',	4+), (+	13,	'Thursday',	4+), (+	13,	'Friday',	4+), (+	15,	'Wednesday',	0+), (+	17,	'Tuesday',	0+), (+	18,	'Monday',	0+), (+	18,	'Tuesday',	0+), (+	18,	'Wednesday',	0+), (+	18,	'Thursday',	0+), (+	18,	'Friday',	0+), (+	19,	'Thursday',	12+), (+	20,	'Friday',	12+), (+	21,	'Thursday',	12+), (+	22,	'Friday',	12+), (+	23,	'Monday',	6+), (+	23,	'Tuesday',	6+), (+	23,	'Wednesday',	6+), (+	23,	'Thursday',	6+), (+	23,	'Friday',	6+), (+	24,	'Monday',	7+), (+	24,	'Tuesday',	7+), (+	24,	'Wednesday',	7+), (+	24,	'Thursday',	7+), (+	24,	'Friday',	7+), (+	25,	'Wednesday',	0+);+UNLOCK TABLES;++LOCK TABLES `tbl_studentBodyRegister` WRITE;+INSERT INTO `tbl_studentBodyRegister` (+	`studentBodyRegisterId`,+	`projectId`,+	`mnemonic`,+	`availability`,+	`teachingRatio`,+	`freePeriodPreference`+) VALUES (+	1,	1,	'Body_1',	'Monday,Tuesday,Wednesday,Thursday,Friday',	1,	NULL+), (+	2,	1,	'Body_2',	'Monday,Tuesday,Wednesday,Thursday,Friday',	1,	NULL+), (+	3,	1,	'Body_3',	'Monday,Tuesday,Wednesday,Thursday,Friday',	1,	NULL+), (+	4,	2,	'Body_01',	'Monday,Tuesday,Wednesday,Thursday,Friday',	1,	NULL+), (+	5,	2,	'Body_02',	'Monday,Tuesday,Wednesday,Thursday,Friday',	1,	NULL+), (+	6,	3,	'Body_01',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.8,	NULL+), (+	7,	3,	'Body_02',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.8,	NULL+), (+	8,	4,	'Body_01',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	9,	4,	'Body_02',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	10,	4,	'Body_03',	'Tuesday,Wednesday,Thursday,Friday',		0.75,	NULL+), (+	11,	4,	'Body_04',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	12,	4,	'Body_05',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.68,	NULL+), (+	13,	4,	'Body_06',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	14,	4,	'Body_07',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	15,	4,	'Body_08',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	16,	4,	'Body_09',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.72,	NULL+), (+	17,	4,	'Body_10',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.8,	NULL+), (+	18,	4,	'Body_11',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.68,	NULL+), (+	19,	5,	'Body_01',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	20,	5,	'Body_02',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	21,	5,	'Body_03',	'Tuesday,Wednesday,Thursday,Friday',		0.625,	NULL+), (+	22,	5,	'Body_04',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	23,	5,	'Body_05',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	24,	5,	'Body_06',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	25,	5,	'Body_07',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	26,	5,	'Body_08',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	27,	5,	'Body_09',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	28,	5,	'Body_10',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	29,	5,	'Body_11',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.625,	NULL+), (+	30,	6,	'Body_1.0',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	31,	6,	'Body_1.1',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	32,	6,	'Body_1.2',	'Tuesday,Wednesday,Thursday,Friday',		0.693,	'Post'+), (+	33,	6,	'Body_1.3',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	34,	6,	'Body_2.0',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	35,	6,	'Body_2.1',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	36,	6,	'Body_2.2',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	37,	6,	'Body_2.3',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	38,	6,	'Body_3.0',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	39,	6,	'Body_3.1',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+), (+	40,	6,	'Body_3.2',	'Monday,Tuesday,Wednesday,Thursday,Friday',	0.693,	NULL+);+UNLOCK TABLES;++LOCK TABLES `tbl_studentBodyMembership` WRITE;+INSERT INTO `tbl_studentBodyMembership` (+	`studentBodyRegisterId`,+	`studentId`+) VALUES (+	1,	'Student_1.0'+), (+	1,	'Student_1.1'+), (+	1,	'Student_1.2'+), (+	2,	'Student_2.0'+), (+	2,	'Student_2.1'+), (+	3,	'Student_3.0'+), (+	4,	'BallsHarry'+), (+	4,	'BoardBill'+), (+	4,	'BullTerry'+), (+	5,	'BodyAnnie'+), (+	5,	'BoyleLance'+), (+	5,	'SpencerMarkN'+), (+	6,	'BallsHarry'+), (+	6,	'BoardBill'+), (+	6,	'BullTerry'+), (+	7,	'BodyAnnie'+), (+	7,	'BoyleLance'+), (+	7,	'SpencerMarkN'+), (+	8,	'BallsHarry'+), (+	8,	'BoardBill'+), (+	8,	'BullTerry'+), (+	9,	'BodyAnnie'+), (+	9,	'BoyleLance'+), (+	9,	'SpencerMarkN'+), (+	10,	'BushRose'+), (+	10,	'PondLilly'+), (+	11,	'DaySonny'+), (+	12,	'EsterPolly'+), (+	13,	'ForestWoody'+), (+	13,	'HareLotta'+), (+	13,	'LearSandy'+), (+	14,	'GunnTommy'+), (+	14,	'PostMark'+), (+	15,	'LottMona'+), (+	16,	'PipeDwain'+), (+	17,	'PoleLou'+), (+	17,	'PottJack'+), (+	18,	'ShawRick'+), (+	19,	'Student_01.0'+), (+	19,	'Student_01.1'+), (+	19,	'Student_01.2'+), (+	20,	'Student_02.0'+), (+	20,	'Student_02.1'+), (+	20,	'Student_02.2'+), (+	21,	'Student_03.0'+), (+	21,	'Student_03.1'+), (+	22,	'Student_04.0'+), (+	23,	'Student_05.0'+), (+	24,	'Student_06.0'+), (+	24,	'Student_06.1'+), (+	24,	'Student_06.2'+), (+	25,	'Student_07.0'+), (+	25,	'Student_07.1'+), (+	26,	'Student_08.0'+), (+	27,	'Student_09.0'+), (+	28,	'Student_10.0'+), (+	28,	'Student_10.1'+), (+	29,	'Student_11.0'+), (+	30,	'Student_1.0.0'+), (+	30,	'Student_1.0.1'+), (+	30,	'Student_1.0.2'+), (+	31,	'Student_1.1.0'+), (+	31,	'Student_1.1.1'+), (+	31,	'Student_1.1.2'+), (+	32,	'Student_1.2.0'+), (+	32,	'Student_1.2.1'+), (+	33,	'Student_1.3.0'+), (+	34,	'Student_2.0.0'+), (+	35,	'Student_2.1.0'+), (+	35,	'Student_2.1.1'+), (+	35,	'Student_2.1.2'+), (+	36,	'Student_2.2.0'+), (+	36,	'Student_2.2.1'+), (+	37,	'Student_2.3.0'+), (+	38,	'Student_3.0.0'+), (+	39,	'Student_3.1.0'+), (+	39,	'Student_3.1.1'+), (+	40,	'Student_3.2.0'+);+UNLOCK TABLES;++LOCK TABLES `tbl_studentGroupMembership` WRITE;+INSERT INTO `tbl_studentGroupMembership` (+	`studentBodyRegisterId`,+	`groupId`+) VALUES (+	8,	'Assembly'+), (+	9,	'Assembly'+), (+	10,	'Assembly'+), (+	10,	'Choir'+), (+	11,	'Assembly'+), (+	11,	'Drama'+), (+	12,	'Assembly'+), (+	12,	'Drama'+), (+	13,	'Assembly'+), (+	14,	'Assembly'+), (+	15,	'Assembly'+), (+	15,	'Drama'+), (+	16,	'Assembly'+), (+	17,	'Assembly'+), (+	18,	'Assembly'+), (+	18,	'Choir'+), (+	19,	'Assembly'+), (+	19,	'Lunch'+), (+	20,	'Assembly'+), (+	20,	'Lunch'+), (+	21,	'Assembly'+), (+	21,	'Choir'+), (+	21,	'Lunch'+), (+	22,	'Assembly'+), (+	22,	'Drama'+), (+	22,	'Lunch'+), (+	23,	'Assembly'+), (+	23,	'Drama'+), (+	23,	'Lunch'+), (+	24,	'Assembly'+), (+	24,	'Lunch'+), (+	25,	'Assembly'+), (+	25,	'Lunch'+), (+	26,	'Assembly'+), (+	26,	'Drama'+), (+	26,	'Lunch'+), (+	27,	'Assembly'+), (+	27,	'Lunch'+), (+	28,	'Assembly'+), (+	28,	'Lunch'+), (+	29,	'Assembly'+), (+	29,	'Choir'+), (+	29,	'Lunch'+), (+	30,	'Assembly'+), (+	30,	'Debating'+), (+	30,	'Lunch_A'+), (+	31,	'Assembly'+), (+	31,	'Chess'+), (+	31,	'Lunch_B'+), (+	32,	'Assembly'+), (+	32,	'Choir'+), (+	32,	'Lunch_A'+), (+	33,	'Assembly'+), (+	33,	'Drama'+), (+	33,	'Lunch_B'+), (+	34,	'Assembly'+), (+	34,	'Debating'+), (+	34,	'Lunch_A'+), (+	35,	'Assembly'+), (+	35,	'Chess'+), (+	35,	'Lunch_B'+), (+	36,	'Assembly'+), (+	36,	'Choir'+), (+	36,	'Lunch_A'+), (+	37,	'Assembly'+), (+	37,	'Drama'+), (+	37,	'Lunch_B'+), (+	38,	'Assembly'+), (+	38,	'Chess'+), (+	38,	'Lunch_A'+), (+	39,	'Assembly'+), (+	39,	'Debating'+), (+	39,	'Lunch_B'+), (+	40,	'Assembly'+), (+	40,	'Choir'+), (+	40,	'Lunch_A'+);+UNLOCK TABLES;++LOCK TABLES `tbl_teacherRegister` WRITE;+INSERT INTO `tbl_teacherRegister` (+	`teacherRegisterId`,+	`projectId`,+	`teacherId`,+	`availability`,+	`locationId`,+	`maximumTeachingRatio`,+	`freePeriodPreference`+) VALUES (+	1,	1,	'Teacher_1',		'Tuesday,Wednesday,Thursday',			NULL,			1,	NULL+), (+	2,	1,	'Teacher_2',		'Wednesday,Thursday,Friday',			NULL,			1,	NULL+), (+	3,	1,	'Teacher_3',		'Monday,Thursday,Friday',			NULL,			1,	NULL+), (+	4,	1,	'Teacher_4',		'Monday,Tuesday,Friday',			NULL,			1,	NULL+), (+	5,	2,	'AtrickJerry',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0,	NULL+), (+	6,	2,	'BannJoe',		'Monday,Tuesday,Wednesday',			'MusicRoom_1',		0.83,	NULL+), (+	7,	2,	'EasterleyGale',	'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.9,	NULL+), (+	8,	2,	'InnoveraMarge',	'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.9,	NULL+), (+	9,	2,	'MasseyHugh',		'Tuesday,Wednesday,Thursday,Friday',		NULL,			0.875,	NULL+), (+	10,	2,	'NuttHazel',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.9,	NULL+), (+	11,	2,	'TheronLou',		'Tuesday,Friday',				NULL,			0.75,	NULL+), (+	12,	3,	'AtrickJerry',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0,	NULL+), (+	13,	3,	'EasterleyGale',	'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.93,	NULL+), (+	14,	3,	'InnoveraMarge',	'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.93,	NULL+), (+	15,	3,	'IronsRusty',		'Monday,Tuesday,Wednesday,Thursday,Friday',	'ChemistryLab_1',	0.93,	NULL+), (+	16,	3,	'MasseyHugh',		'Tuesday,Wednesday,Thursday,Friday',		NULL,			0.92,	NULL+), (+	17,	3,	'NuttHazel',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.93,	NULL+), (+	18,	3,	'ShoeiJim',		'Monday,Tuesday,Wednesday,Friday,Saturday',	NULL,			0.93,	NULL+), (+	19,	3,	'TheronLou',		'Tuesday,Friday',				NULL,			0.83,	NULL+), (+	20,	3,	'WallCathR',		'Monday,Tuesday,Wednesday',			'MusicRoom_1',		0.89,	NULL+), (+	21,	4,	'AnderCorrie',		'Monday,Wednesday,Thursday,Friday',		NULL,			0.9,	NULL+), (+	22,	4,	'AtrickJerry',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0,	NULL+), (+	23,	4,	'BannJoe',		'Monday,Tuesday,Wednesday',			'MusicRoom_1',		0.8,	NULL+), (+	24,	4,	'BaptistAnna',		'Tuesday,Thursday',				NULL,			0.9,	NULL+), (+	25,	4,	'EasterleyGale',	'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.92,	NULL+), (+	26,	4,	'InnoveraMarge',	'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.96,	NULL+), (+	27,	4,	'IronsRusty',		'Monday,Tuesday,Wednesday,Thursday,Friday',	'ChemistryLab_1',	0.92,	NULL+), (+	28,	4,	'LynMandy',		'Tuesday,Thursday,Friday',			'MusicRoom_2',		0.7,	NULL+), (+	29,	4,	'LyonDanD',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.92,	NULL+), (+	30,	4,	'MasseyHugh',		'Tuesday,Wednesday,Thursday,Friday',		NULL,			0.9,	NULL+), (+	31,	4,	'NuttHazel',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.92,	NULL+), (+	32,	4,	'PaineJock',		'Tuesday,Wednesday,Thursday,Saturday',		NULL,			0.9,	NULL+), (+	33,	4,	'PoleDi',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.92,	NULL+), (+	34,	4,	'PooleJean',		'Monday,Tuesday,Wednesday,Friday',		'BiologyLab_2',		0.9,	NULL+), (+	35,	4,	'ShoeiJim',		'Monday,Tuesday,Wednesday,Friday,Saturday',	NULL,			0.92,	NULL+), (+	36,	4,	'SteinFrankN',		'Monday,Wednesday,Thursday,Friday',		'BiologyLab_1',		0.9,	NULL+), (+	37,	4,	'TheronLou',		'Tuesday,Friday',				NULL,			0.8,	NULL+), (+	38,	5,	'Teacher_01',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0,	NULL+), (+	39,	5,	'Teacher_02',		'Monday,Tuesday,Wednesday',			'MusicRoom_1',		0.625,	NULL+), (+	40,	5,	'Teacher_03',		'Tuesday,Thursday',				NULL,			0.625,	NULL+), (+	41,	5,	'Teacher_04',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.625,	NULL+), (+	42,	5,	'Teacher_05',		'Monday,Wednesday,Thursday,Friday',		NULL,			0.625,	NULL+), (+	43,	5,	'Teacher_06',		'Monday,Wednesday,Thursday,Friday',		'BiologyLab_1',		0.625,	NULL+), (+	44,	5,	'Teacher_07',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.625,	NULL+), (+	45,	5,	'Teacher_08',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.625,	NULL+), (+	46,	5,	'Teacher_09',		'Monday,Tuesday,Wednesday,Thursday,Friday',	'ChemistryLab_1',	0.625,	NULL+), (+	47,	5,	'Teacher_10',		'Tuesday,Wednesday,Thursday,Saturday',		NULL,			0.625,	NULL+), (+	48,	5,	'Teacher_11',		'Tuesday,Wednesday,Thursday,Friday',		NULL,			0.625,	NULL+), (+	49,	5,	'Teacher_12',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.625,	NULL+), (+	50,	5,	'Teacher_13',		'Monday,Tuesday,Wednesday,Friday',		'BiologyLab_2',		0.625,	NULL+), (+	51,	5,	'Teacher_14',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.625,	NULL+), (+	52,	5,	'Teacher_15',		'Monday,Tuesday,Wednesday,Friday,Saturday',	NULL,			0.625,	NULL+), (+	53,	5,	'Teacher_16',		'Tuesday,Thursday,Friday',			'MusicRoom_2',		0.625,	NULL+), (+	54,	5,	'Teacher_17',		'Tuesday,Friday',				NULL,			0.625,	NULL+), (+	55,	5,	'Teacher_18',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.625,	NULL+), (+	56,	6,	'Teacher_01',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0,	NULL+), (+	57,	6,	'Teacher_02',		'Monday,Tuesday,Wednesday',			'MusicRoom_1',		0.616,	NULL+), (+	58,	6,	'Teacher_03',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	59,	6,	'Teacher_04',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	'Post'+), (+	60,	6,	'Teacher_05',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	61,	6,	'Teacher_06',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	62,	6,	'Teacher_07',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	63,	6,	'Teacher_08',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	64,	6,	'Teacher_09',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	65,	6,	'Teacher_10',		'Monday,Tuesday,Wednesday,Thursday,Friday',	'ChemistryLab_1',	0.616,	NULL+), (+	66,	6,	'Teacher_11',		'Tuesday,Wednesday,Thursday,Saturday',		NULL,			0.616,	NULL+), (+	67,	6,	'Teacher_12',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	68,	6,	'Teacher_13',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	69,	6,	'Teacher_14',		'Monday,Tuesday,Wednesday,Friday',		'BiologyLab_2',		0.616,	NULL+), (+	70,	6,	'Teacher_15',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	'Terminal'+), (+	71,	6,	'Teacher_16',		'Monday,Tuesday,Wednesday,Friday,Saturday',	NULL,			0.616,	NULL+), (+	72,	6,	'Teacher_17',		'Thursday,Friday',				'MusicRoom_2',		0.616,	NULL+), (+	73,	6,	'Teacher_18',		'Tuesday,Friday',				NULL,			0.616,	NULL+), (+	74,	6,	'Teacher_19',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	75,	6,	'Teacher_20',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	76,	6,	'Teacher_21',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	77,	6,	'Teacher_22',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+), (+	78,	6,	'Teacher_23',		'Monday,Tuesday,Wednesday,Thursday,Friday',	NULL,			0.616,	NULL+);+UNLOCK TABLES;++LOCK TABLES `tbl_teacherGroupMembership` WRITE;+INSERT INTO `tbl_teacherGroupMembership` (+	`teacherRegisterId`,+	`groupId`+) VALUES (+	22,	'Assembly'+), (+	23,	'Assembly'+), (+	23,	'Musicians'+), (+	24,	'Administrators'+), (+	25,	'Drama'+), (+	26,	'Drama'+), (+	27,	'Science-teachers'+), (+	28,	'Assembly'+), (+	28,	'Choir'+), (+	28,	'Musicians'+), (+	30,	'Science-teachers'+), (+	32,	'Sport-teachers'+), (+	33,	'Science-teachers'+), (+	34,	'Science-teachers'+), (+	35,	'Sport-teachers'+), (+	36,	'Science-teachers'+), (+	37,	'Administrators'+), (+	38,	'Assembly'+), (+	38,	'Lunch'+), (+	39,	'Assembly'+), (+	39,	'Lunch'+), (+	39,	'Musicians'+), (+	40,	'Administrators'+), (+	40,	'Lunch'+), (+	41,	'Drama'+), (+	41,	'Lunch'+), (+	42,	'Lunch'+), (+	43,	'Lunch'+), (+	43,	'Science-teachers'+), (+	44,	'Drama'+), (+	44,	'Lunch'+), (+	45,	'Lunch'+), (+	46,	'Lunch'+), (+	46,	'Science-teachers'+), (+	47,	'Lunch'+), (+	47,	'Sport-teachers'+), (+	48,	'Lunch'+), (+	48,	'Science-teachers'+), (+	49,	'Lunch'+), (+	49,	'Science-teachers'+), (+	50,	'Lunch'+), (+	50,	'Science-teachers'+), (+	51,	'Lunch'+), (+	52,	'Lunch'+), (+	52,	'Sport-teachers'+), (+	53,	'Assembly'+), (+	53,	'Choir'+), (+	53,	'Lunch'+), (+	53,	'Musicians'+), (+	54,	'Administrators'+), (+	54,	'Lunch'+), (+	55,	'Lunch'+), (+	56,	'Assembly'+), (+	56,	'Lunch_B'+), (+	57,	'Assembly'+), (+	57,	'Lunch_A'+), (+	58,	'Lunch_B'+), (+	59,	'Administrators'+), (+	59,	'Lunch_A'+), (+	60,	'Drama'+), (+	60,	'Lunch_B'+), (+	61,	'Drama'+), (+	61,	'Lunch_A'+), (+	62,	'Drama'+), (+	62,	'Lunch_B'+), (+	63,	'Lunch_A'+), (+	64,	'Debating'+), (+	64,	'Lunch_B'+), (+	65,	'Lunch_A'+), (+	65,	'Science-teachers'+), (+	66,	'Lunch_B'+), (+	66,	'Sport-teachers'+), (+	67,	'Lunch_A'+), (+	67,	'Science-teachers'+), (+	68,	'Lunch_B'+), (+	68,	'Science-teachers'+), (+	69,	'Chess'+), (+	69,	'Lunch_A'+), (+	69,	'Science-teachers'+), (+	70,	'Lunch_B'+), (+	71,	'Lunch_A'+), (+	71,	'Sport-teachers'+), (+	72,	'Assembly'+), (+	72,	'Choir'+), (+	72,	'Lunch_B'+), (+	73,	'Administrators'+), (+	73,	'Lunch_A'+), (+	74,	'Lunch_B'+), (+	75,	'Lunch_A'+), (+	76,	'Lunch_B'+), (+	77,	'Lunch_A'+), (+	78,	'Lunch_B'+);+UNLOCK TABLES;++LOCK TABLES `tbl_service` WRITE;+INSERT INTO `tbl_service` (+	`teacherRegisterId`,+	`topic`,+	`level`,+	`requiredLessonsPerWeek`,+	`minimumConsecutiveLessons`,+	`maximumClassSize`,+	`synchronisationId`,+	`idealTimeslotRequest`+) VALUES (+	1,	'Geography',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	1,	'History',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	2,	'Maths',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	2,	'Music',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	3,	'Physics',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	4,	'Domestic Science',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	4,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	6,	'Music',		'2',	2,	1,	NULL,	NULL,			NULL+), (+	7,	'Geography',		'1',	3,	1,	NULL,	NULL,			NULL+), (+	8,	'Maths',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	9,	'Physics',		'1',	2,	1,	3,	NULL,			NULL+), (+	10,	'Domestic Science',	'1',	2,	1,	8,	NULL,			NULL+), (+	11,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	13,	'Geography',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	13,	'Geography',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	14,	'Maths',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	15,	'Chemistry',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	16,	'Physics',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	17,	'Domestic Science',	'1',	2,	2,	8,	NULL,			NULL+), (+	18,	'Physical Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	19,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	20,	'Music',		'2',	2,	1,	NULL,	NULL,			NULL+), (+	21,	'Domestic Science',	'1',	2,	2,	4,	NULL,			NULL+), (+	21,	'Domestic Science',	'2',	4,	2,	NULL,	NULL,			NULL+), (+	23,	'Music',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	23,	'Music',		'2',	2,	1,	NULL,	NULL,			NULL+), (+	24,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	25,	'Geography',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	25,	'Geography',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	26,	'Maths',		'1',	2,	1,	NULL,	NULL,			1+), (+	26,	'Maths',		'2',	3,	1,	NULL,	NULL,			1+), (+	27,	'Chemistry',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	27,	'Chemistry',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	28,	'French',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	28,	'Music',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	29,	'French',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	29,	'French',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	29,	'French',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	30,	'Physics',		'1',	2,	1,	3,	NULL,			NULL+), (+	30,	'Physics',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	30,	'Physics',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	31,	'Domestic Science',	'1',	2,	2,	8,	NULL,			NULL+), (+	31,	'Domestic Science',	'2',	4,	2,	8,	NULL,			NULL+), (+	32,	'Games',		'1',	3,	3,	NULL,	NULL,			NULL+), (+	32,	'Physical Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	33,	'Physics',		'3',	4,	1,	3,	NULL,			NULL+), (+	34,	'Biology',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	34,	'Biology',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	35,	'Games',		'1',	3,	3,	NULL,	NULL,			NULL+), (+	35,	'Physical Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	36,	'Biology',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	37,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	39,	'Music',		'1',	2,	1,	NULL,	NULL,			7+), (+	39,	'Music',		'2',	3,	1,	NULL,	NULL,			7+), (+	39,	'Music',		'3',	4,	1,	NULL,	NULL,			7+), (+	40,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	41,	'Geography',		'3',	4,	1,	NULL,	'Geography/History 3',	NULL+), (+	41,	'Geography',		'4',	5,	1,	NULL,	'Geography/History 4',	NULL+), (+	42,	'Domestic Science',	'1',	2,	2,	4,	NULL,			3+), (+	42,	'Domestic Science',	'2',	3,	2,	NULL,	NULL,			3+), (+	42,	'Domestic Science',	'3',	4,	2,	NULL,	NULL,			3+), (+	43,	'Biology',		'4',	5,	1,	NULL,	NULL,			NULL+), (+	44,	'Maths',		'2',	3,	1,	NULL,	NULL,			1+), (+	44,	'Maths',		'3',	4,	1,	NULL,	NULL,			1+), (+	44,	'Maths',		'4',	5,	1,	NULL,	NULL,			1+), (+	45,	'French',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	45,	'French',		'4',	5,	1,	NULL,	NULL,			NULL+), (+	46,	'Chemistry',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	46,	'Chemistry',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	46,	'Chemistry',		'4',	5,	1,	NULL,	NULL,			NULL+), (+	47,	'Games',		'',	3,	3,	NULL,	NULL,			NULL+), (+	47,	'Physical Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	48,	'Physics',		'3.A',	4,	1,	NULL,	'Physics 3 stream',	NULL+), (+	48,	'Physics',		'4',	5,	1,	NULL,	NULL,			NULL+), (+	49,	'Physics',		'3.B',	4,	1,	3,	'Physics 3 stream',	NULL+), (+	49,	'Physics',		'4',	5,	1,	NULL,	NULL,			NULL+), (+	50,	'Biology',		'3',	4,	1,	NULL,	NULL,			NULL+), (+	50,	'Biology',		'4',	5,	1,	NULL,	NULL,			NULL+), (+	51,	'Domestic Science',	'1',	2,	2,	8,	NULL,			3+), (+	51,	'Domestic Science',	'2',	3,	2,	NULL,	NULL,			3+), (+	51,	'Domestic Science',	'3',	4,	2,	8,	NULL,			3+), (+	52,	'Games',		'',	3,	3,	NULL,	NULL,			NULL+), (+	52,	'Physical Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	53,	'Music',		'1',	2,	1,	NULL,	NULL,			7+), (+	54,	'Religious Education',	'1',	1,	1,	NULL,	NULL,			NULL+), (+	55,	'History',		'3',	4,	1,	NULL,	'Geography/History 3',	NULL+), (+	55,	'History',		'4',	5,	1,	NULL,	'Geography/History 4',	NULL+), (+	57,	'Music',		'2',	2,	1,	NULL,	NULL,			NULL+), (+	57,	'Music',		'3',	3,	1,	NULL,	NULL,			NULL+), (+	58,	'German',		'1',	3,	1,	NULL,	'Foreign Languages/1',	NULL+), (+	58,	'German',		'2',	4,	1,	NULL,	'Foreign Languages/2',	NULL+), (+	58,	'German',		'3',	5,	1,	NULL,	'Foreign Languages/3',	NULL+), (+	59,	'English',		'1',	5,	1,	NULL,	NULL,			NULL+), (+	59,	'English',		'2',	5,	1,	NULL,	NULL,			NULL+), (+	60,	'Geography',		'1',	3,	1,	NULL,	NULL,			NULL+), (+	60,	'Geography',		'2',	4,	1,	NULL,	NULL,			NULL+), (+	60,	'Geography',		'3',	5,	1,	NULL,	'Geography/History 3',	NULL+), (+	61,	'Maths',		'1',	5,	1,	NULL,	NULL,			1+), (+	61,	'Maths',		'2',	5,	1,	NULL,	NULL,			1+), (+	61,	'Maths',		'3',	5,	1,	NULL,	NULL,			1+), (+	62,	'Maths',		'1',	5,	1,	NULL,	NULL,			1+), (+	62,	'Maths',		'2',	5,	1,	NULL,	NULL,			1+), (+	62,	'Maths',		'3',	5,	1,	NULL,	NULL,			1+), (+	63,	'French',		'1',	3,	1,	NULL,	'Foreign Languages/1',	NULL+), (+	63,	'French',		'2',	4,	1,	NULL,	'Foreign Languages/2',	NULL+), (+	64,	'English',		'2',	5,	1,	NULL,	NULL,			NULL+), (+	64,	'English',		'3',	5,	1,	NULL,	NULL,			NULL+), (+	65,	'Chemistry',		'1',	4,	2,	NULL,	NULL,			NULL+), (+	65,	'Chemistry',		'2',	6,	2,	NULL,	NULL,			NULL+), (+	65,	'Chemistry',		'3',	8,	2,	NULL,	NULL,			NULL+), (+	66,	'Games',		'',	5,	5,	NULL,	NULL,			NULL+), (+	66,	'Physical Education',	'1',	2,	1,	NULL,	NULL,			NULL+), (+	66,	'Physical Education',	'2',	2,	1,	NULL,	NULL,			NULL+), (+	66,	'Physical Education',	'3',	2,	1,	NULL,	NULL,			NULL+), (+	66,	'Swimming',		'1',	4,	2,	NULL,	NULL,			NULL+), (+	66,	'Swimming',		'2',	4,	2,	NULL,	NULL,			NULL+), (+	66,	'Swimming',		'3',	4,	2,	NULL,	NULL,			NULL+), (+	67,	'Physics',		'1',	4,	2,	NULL,	NULL,			NULL+), (+	67,	'Physics',		'2',	6,	2,	NULL,	NULL,			NULL+), (+	67,	'Physics',		'3.A',	8,	2,	NULL,	'Physics 3 stream',	NULL+), (+	68,	'Physics',		'1',	4,	2,	NULL,	NULL,			NULL+), (+	68,	'Physics',		'2',	6,	2,	NULL,	NULL,			NULL+), (+	68,	'Physics',		'3.B',	8,	2,	3,	'Physics 3 stream',	NULL+), (+	69,	'Biology',		'1',	4,	2,	NULL,	NULL,			NULL+), (+	69,	'Biology',		'2',	6,	2,	NULL,	NULL,			NULL+), (+	69,	'Biology',		'3',	8,	2,	NULL,	NULL,			NULL+), (+	70,	'Domestic Science',	'1',	2,	2,	8,	NULL,			4+), (+	70,	'Domestic Science',	'2',	4,	2,	8,	NULL,			4+), (+	70,	'Domestic Science',	'3',	6,	2,	8,	NULL,			4+), (+	71,	'Games',		'',	5,	5,	NULL,	NULL,			NULL+), (+	71,	'Physical Education',	'1',	2,	1,	NULL,	NULL,			NULL+), (+	71,	'Physical Education',	'2',	2,	1,	NULL,	NULL,			NULL+), (+	71,	'Physical Education',	'3',	2,	1,	NULL,	NULL,			NULL+), (+	71,	'Swimming',		'1',	4,	2,	NULL,	NULL,			NULL+), (+	71,	'Swimming',		'2',	4,	2,	NULL,	NULL,			NULL+), (+	71,	'Swimming',		'3',	4,	2,	NULL,	NULL,			NULL+), (+	72,	'Music',		'1',	1,	1,	NULL,	NULL,			NULL+), (+	72,	'Music',		'2',	2,	1,	NULL,	NULL,			NULL+), (+	73,	'Religious Education',	'1',	2,	1,	NULL,	NULL,			NULL+), (+	73,	'Religious Education',	'2',	3,	1,	NULL,	NULL,			NULL+), (+	74,	'History',		'1',	3,	1,	NULL,	NULL,			NULL+), (+	74,	'History',		'2',	4,	1,	NULL,	NULL,			NULL+), (+	74,	'History',		'3',	5,	1,	NULL,	'Geography/History 3',	NULL+), (+	75,	'Chinese',		'1',	3,	1,	NULL,	'Foreign Languages/1',	NULL+), (+	75,	'Chinese',		'2',	4,	1,	NULL,	'Foreign Languages/2',	NULL+), (+	75,	'Chinese',		'3',	5,	1,	NULL,	'Foreign Languages/3',	NULL+), (+	76,	'Woodwork',		'1',	2,	1,	NULL,	NULL,			NULL+), (+	76,	'Woodwork',		'2',	3,	1,	NULL,	NULL,			NULL+), (+	77,	'Technical Drawing',	'1',	2,	1,	NULL,	NULL,			NULL+), (+	77,	'Technical Drawing',	'2',	3,	1,	NULL,	NULL,			NULL+), (+	78,	'Art',			'1',	2,	1,	NULL,	NULL,			NULL+), (+	78,	'Art',			'2',	3,	1,	NULL,	NULL,			NULL+), (+	78,	'Art',			'3',	4,	1,	NULL,	NULL,			NULL+);+UNLOCK TABLES;++LOCK TABLES `tbl_specialtyTopic` WRITE;+INSERT INTO `tbl_specialtyTopic` (+	`teacherRegisterId`,+	`topic`+) VALUES (+	6,	'Music'+), (+	7,	'Geography'+), (+	8,	'Maths'+), (+	9,	'Physics'+), (+	10,	'Domestic Science'+), (+	11,	'Religious Education'+), (+	13,	'Geography'+), (+	14,	'Maths'+), (+	15,	'Chemistry'+), (+	16,	'Physics'+), (+	17,	'Domestic Science'+), (+	18,	'Physical Education'+), (+	19,	'Religious Education'+), (+	20,	'Music'+), (+	21,	'Domestic Science'+), (+	23,	'Music'+), (+	24,	'Religious Education'+), (+	25,	'Geography'+), (+	26,	'Maths'+), (+	27,	'Chemistry'+), (+	28,	'Music'+), (+	29,	'French'+), (+	30,	'Physics'+), (+	31,	'Domestic Science'+), (+	32,	'Games'+), (+	33,	'Physics'+), (+	34,	'Biology'+), (+	35,	'Physical Education'+), (+	36,	'Biology'+), (+	37,	'Religious Education'+), (+	39,	'Music'+), (+	40,	'Religious Education'+), (+	41,	'Geography'+), (+	42,	'Domestic Science'+), (+	43,	'Biology'+), (+	44,	'Maths'+), (+	45,	'French'+), (+	46,	'Chemistry'+), (+	47,	'Games'+), (+	48,	'Physics'+), (+	49,	'Physics'+), (+	50,	'Biology'+), (+	51,	'Domestic Science'+), (+	52,	'Physical Education'+), (+	53,	'Music'+), (+	54,	'Religious Education'+), (+	55,	'History'+), (+	57,	'Music'+), (+	58,	'German'+), (+	59,	'English'+), (+	60,	'Geography'+), (+	62,	'Maths'+), (+	63,	'French'+), (+	64,	'English'+), (+	65,	'Chemistry'+), (+	66,	'Games'+), (+	67,	'Physics'+), (+	68,	'Physics'+), (+	69,	'Biology'+), (+	70,	'Domestic Science'+), (+	71,	'Physical Education'+), (+	72,	'Music'+), (+	73,	'Religious Education'+), (+	74,	'History'+), (+	75,	'Chinese'+), (+	76,	'Woodwork'+), (+	77,	'Technical Drawing'+), (+	78,	'Art'+);+UNLOCK TABLES;++LOCK TABLES `tbl_specificTimeRequest` WRITE;+INSERT INTO `tbl_specificTimeRequest` (+	`teacherRegisterId`,+	`topic`,+	`level`,+	`day`,+	`timeslotId`+) VALUES (+	32,	'Games',	'1',	'Wednesday',	2+), (+	32,	'Games',	'1',	'Wednesday',	3+), (+	32,	'Games',	'1',	'Wednesday',	4+), (+	35,	'Games',	'1',	'Tuesday',	2+), (+	35,	'Games',	'1',	'Tuesday',	3+), (+	35,	'Games',	'1',	'Tuesday',	4+), (+	47,	'Games',	'',	'Wednesday',	5+), (+	47,	'Games',	'',	'Wednesday',	6+), (+	47,	'Games',	'',	'Wednesday',	7+), (+	52,	'Games',	'',	'Tuesday',	5+), (+	52,	'Games',	'',	'Tuesday',	6+), (+	52,	'Games',	'',	'Tuesday',	7+), (+	66,	'Games',	'',	'Wednesday',	8+), (+	66,	'Games',	'',	'Wednesday',	9+), (+	66,	'Games',	'',	'Wednesday',	10+), (+	66,	'Games',	'',	'Wednesday',	11+), (+	66,	'Games',	'',	'Wednesday',	12+), (+	71,	'Games',	'',	'Tuesday',	8+), (+	71,	'Games',	'',	'Tuesday',	9+), (+	71,	'Games',	'',	'Tuesday',	10+), (+	71,	'Games',	'',	'Tuesday',	11+), (+	71,	'Games',	'',	'Tuesday',	12+);+UNLOCK TABLES;++LOCK TABLES `tbl_requiredFacility` WRITE;+INSERT INTO `tbl_requiredFacility` (+	`teacherRegisterId`,+	`topic`,+	`level`,+	`facilityTypeId`+) VALUES (+	6,	'Music',		'2',	4	-- 'Musical instruments'+), (+	7,	'Geography',		'1',	1	-- 'Blackboard'+), (+	7,	'Geography',		'1',	2	-- 'Desks'+), (+	8,	'Maths',		'1',	1	-- 'Blackboard'+), (+	8,	'Maths',		'1',	2	-- 'Desks'+), (+	9,	'Physics',		'1',	1	-- 'Blackboard'+), (+	9,	'Physics',		'1',	2	-- 'Desks'+), (+	9,	'Physics',		'1',	5	-- 'Physics-lab'+), (+	10,	'Domestic Science',	'1',	3	-- 'Kitchen-equipment'+), (+	11,	'Religious Education',	'1',	2	-- 'Desks'+), (+	13,	'Geography',		'1',	6	-- 'Blackboard'+), (+	13,	'Geography',		'1',	8	-- 'Desks'+), (+	13,	'Geography',		'2',	6	-- 'Blackboard'+), (+	13,	'Geography',		'2',	8	-- 'Desks'+), (+	14,	'Maths',		'2',	6	-- 'Blackboard'+), (+	14,	'Maths',		'2',	8	-- 'Desks'+), (+	15,	'Chemistry',		'1',	6	-- 'Blackboard'+), (+	15,	'Chemistry',		'1',	7	-- 'Chemistry-lab'+), (+	15,	'Chemistry',		'1',	8	-- 'Desks'+), (+	16,	'Physics',		'2',	6	-- 'Blackboard'+), (+	16,	'Physics',		'2',	8	-- 'Desks'+), (+	16,	'Physics',		'2',	12	-- 'Physics-lab'+), (+	17,	'Domestic Science',	'1',	10	-- 'Kitchen-equipment'+), (+	18,	'Physical Education',	'1',	9	-- 'Gym-equipment'+), (+	19,	'Religious Education',	'1',	8	-- 'Desks'+), (+	20,	'Music',		'2',	11	-- 'Musical instruments'+), (+	21,	'Domestic Science',	'1',	19	-- 'Kitchen-equipment'+), (+	21,	'Domestic Science',	'2',	19	-- 'Kitchen-equipment'+), (+	23,	'Music',		'1',	21	-- 'Musical instruments'+), (+	23,	'Music',		'2',	21	-- 'Musical instruments'+), (+	24,	'Religious Education',	'1',	16	-- 'Desks'+), (+	25,	'Geography',		'2',	14	-- 'Blackboard'+), (+	25,	'Geography',		'2',	16	-- 'Desks'+), (+	25,	'Geography',		'3',	14	-- 'Blackboard'+), (+	25,	'Geography',		'3',	16	-- 'Desks'+), (+	26,	'Maths',		'1',	14	-- 'Blackboard'+), (+	26,	'Maths',		'1',	16	-- 'Desks'+), (+	26,	'Maths',		'2',	14	-- 'Blackboard'+), (+	26,	'Maths',		'2',	16	-- 'Desks'+), (+	27,	'Chemistry',		'1',	14	-- 'Blackboard'+), (+	27,	'Chemistry',		'1',	15	-- 'Chemistry-lab'+), (+	27,	'Chemistry',		'1',	16	-- 'Desks'+), (+	27,	'Chemistry',		'2',	14	-- 'Blackboard'+), (+	27,	'Chemistry',		'2',	15	-- 'Chemistry-lab'+), (+	27,	'Chemistry',		'2',	16	-- 'Desks'+), (+	28,	'French',		'1',	14	-- 'Blackboard'+), (+	28,	'French',		'1',	16	-- 'Desks'+), (+	28,	'Music',		'1',	21	-- 'Musical instruments'+), (+	29,	'French',		'1',	14	-- 'Blackboard'+), (+	29,	'French',		'1',	16	-- 'Desks'+), (+	29,	'French',		'2',	14	-- 'Blackboard'+), (+	29,	'French',		'2',	16	-- 'Desks'+), (+	29,	'French',		'3',	14	-- 'Blackboard'+), (+	29,	'French',		'3',	16	-- 'Desks'+), (+	30,	'Physics',		'1',	14	-- 'Blackboard'+), (+	30,	'Physics',		'1',	16	-- 'Desks'+), (+	30,	'Physics',		'1',	22	-- 'Physics-lab'+), (+	30,	'Physics',		'2',	14	-- 'Blackboard'+), (+	30,	'Physics',		'2',	16	-- 'Desks'+), (+	30,	'Physics',		'2',	22	-- 'Physics-lab'+), (+	30,	'Physics',		'3',	14	-- 'Blackboard'+), (+	30,	'Physics',		'3',	16	-- 'Desks'+), (+	30,	'Physics',		'3',	22	-- 'Physics-lab'+), (+	31,	'Domestic Science',	'1',	19	-- 'Kitchen-equipment'+), (+	31,	'Domestic Science',	'2',	19	-- 'Kitchen-equipment'+), (+	32,	'Games',		'1',	24	-- 'Running-track'+), (+	32,	'Physical Education',	'1',	18	-- 'Gym-equipment'+), (+	33,	'Physics',		'3',	14	-- 'Blackboard'+), (+	33,	'Physics',		'3',	16	-- 'Desks'+), (+	33,	'Physics',		'3',	22	-- 'Physics-lab'+), (+	34,	'Biology',		'2',	13	-- 'Biology-lab'+), (+	34,	'Biology',		'2',	14	-- 'Blackboard'+), (+	34,	'Biology',		'2',	16	-- 'Desks'+), (+	34,	'Biology',		'3',	13	-- 'Biology-lab'+), (+	34,	'Biology',		'3',	14	-- 'Blackboard'+), (+	34,	'Biology',		'3',	16	-- 'Desks'+), (+	35,	'Games',		'1',	17	-- 'Goal-posts'+), (+	35,	'Games',		'1',	26	-- 'Showers'+), (+	35,	'Physical Education',	'1',	18	-- 'Gym-equipment'+), (+	36,	'Biology',		'1',	13	-- 'Biology-lab'+), (+	36,	'Biology',		'1',	14	-- 'Blackboard'+), (+	36,	'Biology',		'1',	16	-- 'Desks'+), (+	37,	'Religious Education',	'1',	16	-- 'Desks'+), (+	39,	'Music',		'1',	35	-- 'Musical instruments'+), (+	39,	'Music',		'2',	35	-- 'Musical instruments'+), (+	39,	'Music',		'3',	35	-- 'Musical instruments'+), (+	40,	'Religious Education',	'1',	30	-- 'Desks'+), (+	41,	'Geography',		'3',	28	-- 'Blackboard'+), (+	41,	'Geography',		'3',	30	-- 'Desks'+), (+	41,	'Geography',		'4',	28	-- 'Blackboard'+), (+	41,	'Geography',		'4',	30	-- 'Desks'+), (+	42,	'Domestic Science',	'1',	33	-- 'Kitchen-equipment'+), (+	42,	'Domestic Science',	'2',	33	-- 'Kitchen-equipment'+), (+	42,	'Domestic Science',	'3',	33	-- 'Kitchen-equipment'+), (+	43,	'Biology',		'4',	27	-- 'Biology-lab'+), (+	43,	'Biology',		'4',	28	-- 'Blackboard'+), (+	43,	'Biology',		'4',	30	-- 'Desks'+), (+	44,	'Maths',		'2',	28	-- 'Blackboard'+), (+	44,	'Maths',		'2',	30	-- 'Desks'+), (+	44,	'Maths',		'3',	28	-- 'Blackboard'+), (+	44,	'Maths',		'3',	30	-- 'Desks'+), (+	44,	'Maths',		'4',	28	-- 'Blackboard'+), (+	44,	'Maths',		'4',	30	-- 'Desks'+), (+	45,	'French',		'3',	28	-- 'Blackboard'+), (+	45,	'French',		'3',	30	-- 'Desks'+), (+	45,	'French',		'4',	28	-- 'Blackboard'+), (+	45,	'French',		'4',	30	-- 'Desks'+), (+	46,	'Chemistry',		'2',	28	-- 'Blackboard'+), (+	46,	'Chemistry',		'2',	29	-- 'Chemistry-lab'+), (+	46,	'Chemistry',		'2',	30	-- 'Desks'+), (+	46,	'Chemistry',		'3',	28	-- 'Blackboard'+), (+	46,	'Chemistry',		'3',	29	-- 'Chemistry-lab'+), (+	46,	'Chemistry',		'3',	30	-- 'Desks'+), (+	46,	'Chemistry',		'4',	28	-- 'Blackboard'+), (+	46,	'Chemistry',		'4',	29	-- 'Chemistry-lab'+), (+	46,	'Chemistry',		'4',	30	-- 'Desks'+), (+	47,	'Games',		'',	38	-- 'Running-track'+), (+	47,	'Physical Education',	'1',	32	-- 'Gym-equipment'+), (+	48,	'Physics',		'3.A',	28	-- 'Blackboard'+), (+	48,	'Physics',		'3.A',	30	-- 'Desks'+), (+	48,	'Physics',		'3.A',	37	-- 'Physics-lab'+), (+	48,	'Physics',		'4',	28	-- 'Blackboard'+), (+	48,	'Physics',		'4',	30	-- 'Desks'+), (+	48,	'Physics',		'4',	37	-- 'Physics-lab'+), (+	49,	'Physics',		'3.B',	28	-- 'Blackboard'+), (+	49,	'Physics',		'3.B',	30	-- 'Desks'+), (+	49,	'Physics',		'3.B',	37	-- 'Physics-lab'+), (+	49,	'Physics',		'4',	28	-- 'Blackboard'+), (+	49,	'Physics',		'4',	30	-- 'Desks'+), (+	49,	'Physics',		'4',	37	-- 'Physics-lab'+), (+	50,	'Biology',		'3',	27	-- 'Biology-lab'+), (+	50,	'Biology',		'3',	28	-- 'Blackboard'+), (+	50,	'Biology',		'3',	30	-- 'Desks'+), (+	50,	'Biology',		'4',	27	-- 'Biology-lab'+), (+	50,	'Biology',		'4',	28	-- 'Blackboard'+), (+	50,	'Biology',		'4',	30	-- 'Desks'+), (+	51,	'Domestic Science',	'1',	33	-- 'Kitchen-equipment'+), (+	51,	'Domestic Science',	'2',	33	-- 'Kitchen-equipment'+), (+	51,	'Domestic Science',	'3',	33	-- 'Kitchen-equipment'+), (+	52,	'Games',		'',	31	-- 'Goal-posts'+), (+	52,	'Games',		'',	40	-- 'Showers'+), (+	52,	'Physical Education',	'1',	32	-- 'Gym-equipment'+), (+	53,	'Music',		'1',	35	-- 'Musical instruments'+), (+	54,	'Religious Education',	'1',	30	-- 'Desks'+), (+	55,	'History',		'3',	28	-- 'Blackboard'+), (+	55,	'History',		'3',	30	-- 'Desks'+), (+	55,	'History',		'4',	28	-- 'Blackboard'+), (+	55,	'History',		'4',	30	-- 'Desks'+), (+	57,	'Music',		'2',	53	-- 'Musical instruments'+), (+	57,	'Music',		'3',	53	-- 'Musical instruments'+), (+	58,	'German',		'1',	44	-- 'Blackboard'+), (+	58,	'German',		'1',	46	-- 'Desks'+), (+	58,	'German',		'2',	44	-- 'Blackboard'+), (+	58,	'German',		'2',	46	-- 'Desks'+), (+	58,	'German',		'3',	44	-- 'Blackboard'+), (+	58,	'German',		'3',	46	-- 'Desks'+), (+	59,	'English',		'1',	44	-- 'Blackboard'+), (+	59,	'English',		'1',	46	-- 'Desks'+), (+	59,	'English',		'2',	44	-- 'Blackboard'+), (+	59,	'English',		'2',	46	-- 'Desks'+), (+	60,	'Geography',		'1',	44	-- 'Blackboard'+), (+	60,	'Geography',		'1',	46	-- 'Desks'+), (+	60,	'Geography',		'2',	44	-- 'Blackboard'+), (+	60,	'Geography',		'2',	46	-- 'Desks'+), (+	60,	'Geography',		'3',	44	-- 'Blackboard'+), (+	60,	'Geography',		'3',	46	-- 'Desks'+), (+	61,	'Maths',		'1',	44	-- 'Blackboard'+), (+	61,	'Maths',		'1',	46	-- 'Desks'+), (+	61,	'Maths',		'2',	44	-- 'Blackboard'+), (+	61,	'Maths',		'2',	46	-- 'Desks'+), (+	61,	'Maths',		'3',	44	-- 'Blackboard'+), (+	61,	'Maths',		'3',	46	-- 'Desks'+), (+	62,	'Maths',		'1',	44	-- 'Blackboard'+), (+	62,	'Maths',		'1',	46	-- 'Desks'+), (+	62,	'Maths',		'2',	44	-- 'Blackboard'+), (+	62,	'Maths',		'2',	46	-- 'Desks'+), (+	62,	'Maths',		'3',	44	-- 'Blackboard'+), (+	62,	'Maths',		'3',	46	-- 'Desks'+), (+	63,	'French',		'1',	44	-- 'Blackboard'+), (+	63,	'French',		'1',	46	-- 'Desks'+), (+	63,	'French',		'2',	44	-- 'Blackboard'+), (+	63,	'French',		'2',	46	-- 'Desks'+), (+	64,	'English',		'2',	44	-- 'Blackboard'+), (+	64,	'English',		'2',	46	-- 'Desks'+), (+	64,	'English',		'3',	44	-- 'Blackboard'+), (+	64,	'English',		'3',	46	-- 'Desks'+), (+	65,	'Chemistry',		'1',	44	-- 'Blackboard'+), (+	65,	'Chemistry',		'1',	45	--'Chemistry-lab'+), (+	65,	'Chemistry',		'1',	46	-- 'Desks'+), (+	65,	'Chemistry',		'2',	44	-- 'Blackboard'+), (+	65,	'Chemistry',		'2',	45	--'Chemistry-lab'+), (+	65,	'Chemistry',		'2',	46	-- 'Desks'+), (+	65,	'Chemistry',		'3',	44	-- 'Blackboard'+), (+	65,	'Chemistry',		'3',	45	--'Chemistry-lab'+), (+	65,	'Chemistry',		'3',	46	-- 'Desks'+), (+	66,	'Games',		'',	56	-- 'Running-track'+), (+	66,	'Physical Education',	'1',	50	-- 'Gym-equipment'+), (+	66,	'Physical Education',	'2',	50	-- 'Gym-equipment'+), (+	66,	'Physical Education',	'3',	50	-- 'Gym-equipment'+), (+	66,	'Swimming',		'1',	60	-- 'Swimming-pool'+), (+	66,	'Swimming',		'2',	60	-- 'Swimming-pool'+), (+	66,	'Swimming',		'3',	60	-- 'Swimming-pool'+), (+	67,	'Physics',		'1',	44	-- 'Blackboard'+), (+	67,	'Physics',		'1',	46	-- 'Desks'+), (+	67,	'Physics',		'1',	54	-- 'Physics-lab'+), (+	67,	'Physics',		'2',	44	-- 'Blackboard'+), (+	67,	'Physics',		'2',	46	-- 'Desks'+), (+	67,	'Physics',		'2',	54	-- 'Physics-lab'+), (+	67,	'Physics',		'3.A',	44	-- 'Blackboard'+), (+	67,	'Physics',		'3.A',	46	-- 'Desks'+), (+	67,	'Physics',		'3.A',	54	-- 'Physics-lab'+), (+	68,	'Physics',		'1',	44	-- 'Blackboard'+), (+	68,	'Physics',		'1',	46	-- 'Desks'+), (+	68,	'Physics',		'1',	54	-- 'Physics-lab'+), (+	68,	'Physics',		'2',	44	-- 'Blackboard'+), (+	68,	'Physics',		'2',	46	-- 'Desks'+), (+	68,	'Physics',		'2',	54	-- 'Physics-lab'+), (+	68,	'Physics',		'3.B',	44	-- 'Blackboard'+), (+	68,	'Physics',		'3.B',	46	-- 'Desks'+), (+	68,	'Physics',		'3.B',	54	-- 'Physics-lab'+), (+	69,	'Biology',		'1',	43	-- 'Biology-lab'+), (+	69,	'Biology',		'1',	44	-- 'Blackboard'+), (+	69,	'Biology',		'1',	46	-- 'Desks'+), (+	69,	'Biology',		'2',	43	-- 'Biology-lab'+), (+	69,	'Biology',		'2',	44	-- 'Blackboard'+), (+	69,	'Biology',		'2',	46	-- 'Desks'+), (+	69,	'Biology',		'3',	43	-- 'Biology-lab'+), (+	69,	'Biology',		'3',	44	-- 'Blackboard'+), (+	69,	'Biology',		'3',	46	-- 'Desks'+), (+	70,	'Domestic Science',	'1',	51	-- 'Kitchen-equipment'+), (+	70,	'Domestic Science',	'2',	51	-- 'Kitchen-equipment'+), (+	70,	'Domestic Science',	'3',	51	-- 'Kitchen-equipment'+), (+	71,	'Games',		'',	49	-- 'Goal-posts'+), (+	71,	'Games',		'',	58	-- 'Showers'+), (+	71,	'Physical Education',	'1',	50	-- 'Gym-equipment'+), (+	71,	'Physical Education',	'2',	50	-- 'Gym-equipment'+), (+	71,	'Physical Education',	'3',	50	-- 'Gym-equipment'+), (+	71,	'Swimming',		'1',	60	-- 'Swimming-pool'+), (+	71,	'Swimming',		'2',	60	-- 'Swimming-pool'+), (+	71,	'Swimming',		'3',	60	-- 'Swimming-pool'+), (+	72,	'Music',		'1',	53	-- 'Musical instruments'+), (+	72,	'Music',		'2',	53	-- 'Musical instruments'+), (+	73,	'Religious Education',	'1',	46	-- 'Desks'+), (+	73,	'Religious Education',	'2',	46	-- 'Desks'+), (+	74,	'History',		'1',	44	-- 'Blackboard'+), (+	74,	'History',		'1',	46	-- 'Desks'+), (+	74,	'History',		'2',	44	-- 'Blackboard'+), (+	74,	'History',		'2',	46	-- 'Desks'+), (+	74,	'History',		'3',	44	-- 'Blackboard'+), (+	74,	'History',		'3',	46	-- 'Desks'+), (+	75,	'Chinese',		'1',	44	-- 'Blackboard'+), (+	75,	'Chinese',		'1',	46	-- 'Desks'+), (+	75,	'Chinese',		'2',	44	-- 'Blackboard'+), (+	75,	'Chinese',		'2',	46	-- 'Desks'+), (+	75,	'Chinese',		'3',	44	-- 'Blackboard'+), (+	75,	'Chinese',		'3',	46	-- 'Desks'+), (+	76,	'Woodwork',		'1',	62	-- 'Wood-tools'+), (+	76,	'Woodwork',		'1',	63	-- 'Work-benches'+), (+	76,	'Woodwork',		'2',	62	-- 'Wood-tools'+), (+	76,	'Woodwork',		'2',	63	-- 'Work-benches'+), (+	77,	'Technical Drawing',	'1',	47	-- 'Drawing-desks'+), (+	77,	'Technical Drawing',	'2',	47	-- 'Drawing-desks'+), (+	78,	'Art',			'1',	42	-- 'Art-tools'+), (+	78,	'Art',			'1',	48	-- 'Easels'+), (+	78,	'Art',			'1',	59	-- 'Sinks'+), (+	78,	'Art',			'2',	42	-- 'Art-tools'+), (+	78,	'Art',			'2',	48	-- 'Easels'+), (+	78,	'Art',			'2',	59	-- 'Sinks'+), (+	78,	'Art',			'3',	42	-- 'Art-tools'+), (+	78,	'Art',			'3',	48	-- 'Easels'+), (+	78,	'Art',			'3',	59	-- 'Sinks'+);+UNLOCK TABLES;++LOCK TABLES `tbl_knowledgeRequirement` WRITE;+INSERT INTO `tbl_knowledgeRequirement` (+	`studentBodyRegisterId`,+	`priority`,+	`topic`,+	`level`+) VALUES (+	1,	'core',		'Geography',		'1'+), (+	1,	'core',		'Maths',		'1'+), (+	1,	'core',		'Physics',		'1'+), (+	1,	'optional',	'Music',		'1'+), (+	1,	'optional',	'Religious Education',	'1'+), (+	2,	'core',		'Geography',		'1'+), (+	2,	'core',		'Maths',		'1'+), (+	2,	'core',		'Physics',		'1'+), (+	2,	'optional',	'Domestic Science',	'1'+), (+	2,	'optional',	'Religious Education',	'1'+), (+	3,	'core',		'History',		'1'+), (+	3,	'core',		'Maths',		'1'+), (+	3,	'core',		'Physics',		'1'+), (+	3,	'optional',	'Domestic Science',	'1'+), (+	3,	'optional',	'Music',		'1'+), (+	4,	'core',		'Geography',		'1'+), (+	4,	'core',		'Maths',		'1'+), (+	4,	'optional',	'Music',		'2'+), (+	4,	'core',		'Physics',		'1'+), (+	4,	'core',		'Religious Education',	'1'+), (+	5,	'optional',	'Domestic Science',	'1'+), (+	5,	'core',		'Geography',		'1'+), (+	5,	'core',		'Maths',		'1'+), (+	5,	'core',		'Physics',		'1'+), (+	5,	'core',		'Religious Education',	'1'+), (+	6,	'core',		'Geography',		'1'+), (+	6,	'core',		'Maths',		'2'+), (+	6,	'optional',	'Music',		'2'+), (+	6,	'core',		'Physical Education',	'1'+), (+	6,	'core',		'Physics',		'2'+), (+	6,	'core',		'Religious Education',	'1'+), (+	7,	'core',		'Chemistry',		'1'+), (+	7,	'optional',	'Domestic Science',	'1'+), (+	7,	'core',		'Geography',		'2'+), (+	7,	'core',		'Maths',		'2'+), (+	7,	'core',		'Physical Education',	'1'+), (+	7,	'core',		'Religious Education',	'1'+), (+	8,	'core',		'French',		'3'+), (+	8,	'core',		'Geography',		'3'+), (+	8,	'core',		'Maths',		'2'+), (+	8,	'optional',	'Music',		'1'+), (+	8,	'core',		'Physical Education',	'1'+), (+	8,	'core',		'Physics',		'3'+), (+	8,	'core',		'Religious Education',	'1'+), (+	9,	'core',		'Chemistry',		'2'+), (+	9,	'optional',	'Domestic Science',	'2'+), (+	9,	'core',		'French',		'2'+), (+	9,	'optional',	'Music',		'2'+), (+	9,	'core',		'Physical Education',	'1'+), (+	9,	'core',		'Physics',		'3'+), (+	9,	'core',		'Religious Education',	'1'+), (+	10,	'core',		'French',		'2'+), (+	10,	'core',		'Games',		'1'+), (+	10,	'core',		'Geography',		'2'+), (+	10,	'core',		'Maths',		'2'+), (+	10,	'optional',	'Music',		'1'+), (+	10,	'core',		'Physical Education',	'1'+), (+	10,	'core',		'Religious Education',	'1'+), (+	11,	'core',		'Biology',		'2'+), (+	11,	'core',		'Chemistry',		'2'+), (+	11,	'optional',	'Domestic Science',	'2'+), (+	11,	'core',		'French',		'1'+), (+	11,	'optional',	'Music',		'2'+), (+	11,	'core',		'Physical Education',	'1'+), (+	11,	'core',		'Physics',		'1'+), (+	11,	'core',		'Religious Education',	'1'+), (+	12,	'core',		'Biology',		'2'+), (+	12,	'optional',	'Domestic Science',	'1'+), (+	12,	'core',		'Games',		'1'+), (+	12,	'core',		'Geography',		'2'+), (+	12,	'optional',	'Music',		'1'+), (+	12,	'core',		'Physical Education',	'1'+), (+	12,	'core',		'Physics',		'2'+), (+	12,	'core',		'Religious Education',	'1'+), (+	13,	'core',		'Biology',		'1'+), (+	13,	'core',		'Chemistry',		'2'+), (+	13,	'optional',	'Domestic Science',	'2'+), (+	13,	'core',		'French',		'2'+), (+	13,	'core',		'Maths',		'2'+), (+	13,	'optional',	'Music',		'1'+), (+	13,	'core',		'Physical Education',	'1'+), (+	13,	'core',		'Religious Education',	'1'+), (+	14,	'core',		'Biology',		'1'+), (+	14,	'core',		'Chemistry',		'2'+), (+	14,	'optional',	'Domestic Science',	'2'+), (+	14,	'core',		'French',		'2'+), (+	14,	'core',		'Geography',		'2'+), (+	14,	'optional',	'Music',		'2'+), (+	14,	'core',		'Religious Education',	'1'+), (+	15,	'core',		'Biology',		'1'+), (+	15,	'core',		'Chemistry',		'2'+), (+	15,	'optional',	'Domestic Science',	'2'+), (+	15,	'core',		'French',		'2'+), (+	15,	'core',		'Maths',		'2'+), (+	15,	'optional',	'Music',		'2'+), (+	15,	'core',		'Religious Education',	'1'+), (+	16,	'core',		'Chemistry',		'1'+), (+	16,	'optional',	'Domestic Science',	'2'+), (+	16,	'core',		'Games',		'1'+), (+	16,	'core',		'Geography',		'2'+), (+	16,	'core',		'Maths',		'1'+), (+	16,	'optional',	'Music',		'1'+), (+	16,	'core',		'Physics',		'1'+), (+	16,	'core',		'Religious Education',	'1'+), (+	17,	'core',		'Biology',		'3'+), (+	17,	'core',		'Chemistry',		'2'+), (+	17,	'optional',	'Domestic Science',	'2'+), (+	17,	'core',		'Geography',		'2'+), (+	17,	'core',		'Maths',		'2'+), (+	17,	'optional',	'Music',		'2'+), (+	17,	'core',		'Physical Education',	'1'+), (+	18,	'core',		'Biology',		'3'+), (+	18,	'optional',	'Domestic Science',	'1'+), (+	18,	'core',		'Geography',		'2'+), (+	18,	'core',		'Maths',		'1'+), (+	18,	'optional',	'Music',		'1'+), (+	18,	'core',		'Physical Education',	'1'+), (+	18,	'core',		'Physics',		'3'+), (+	19,	'optional',	'Domestic Science',	'2'+), (+	19,	'core',		'French',		'3'+), (+	19,	'core',		'Geography',		'3'+), (+	19,	'core',		'Maths',		'4'+), (+	19,	'optional',	'Music',		'2'+), (+	19,	'core',		'Physical Education',	'1'+), (+	19,	'core',		'Physics',		'3.A'+), (+	19,	'core',		'Religious Education',	'1'+), (+	20,	'core',		'Chemistry',		'4'+), (+	20,	'optional',	'Domestic Science',	'3'+), (+	20,	'core',		'French',		'4'+), (+	20,	'optional',	'Music',		'3'+), (+	20,	'core',		'Physical Education',	'1'+), (+	20,	'core',		'Physics',		'4'+), (+	20,	'core',		'Religious Education',	'1'+), (+	21,	'optional',	'Domestic Science',	'1'+), (+	21,	'core',		'French',		'3'+), (+	21,	'core',		'Games',		''+), (+	21,	'core',		'Geography',		'3'+), (+	21,	'core',		'Maths',		'2'+), (+	21,	'optional',	'Music',		'1'+), (+	21,	'core',		'Physical Education',	'1'+), (+	21,	'core',		'Religious Education',	'1'+), (+	22,	'core',		'Biology',		'4'+), (+	22,	'optional',	'Domestic Science',	'2'+), (+	22,	'core',		'French',		'3'+), (+	22,	'core',		'Maths',		'3'+), (+	22,	'optional',	'Music',		'2'+), (+	22,	'core',		'Physical Education',	'1'+), (+	22,	'core',		'Physics',		'3.B'+), (+	22,	'core',		'Religious Education',	'1'+), (+	23,	'core',		'Biology',		'4'+), (+	23,	'optional',	'Domestic Science',	'2'+), (+	23,	'core',		'Games',		''+), (+	23,	'core',		'History',		'4'+), (+	23,	'optional',	'Music',		'1'+), (+	23,	'core',		'Physical Education',	'1'+), (+	23,	'core',		'Physics',		'4'+), (+	23,	'core',		'Religious Education',	'1'+), (+	24,	'core',		'Biology',		'4'+), (+	24,	'core',		'Chemistry',		'4'+), (+	24,	'optional',	'Domestic Science',	'3'+), (+	24,	'core',		'French',		'3'+), (+	24,	'core',		'Maths',		'4'+), (+	24,	'core',		'Physical Education',	'1'+), (+	24,	'core',		'Religious Education',	'1'+), (+	25,	'core',		'Biology',		'4'+), (+	25,	'core',		'French',		'3'+), (+	25,	'core',		'Games',		''+), (+	25,	'core',		'Geography',		'4'+), (+	25,	'optional',	'Music',		'1'+), (+	25,	'core',		'Physics',		'4'+), (+	25,	'core',		'Religious Education',	'1'+), (+	26,	'core',		'Biology',		'3'+), (+	26,	'core',		'Chemistry',		'3'+), (+	26,	'optional',	'Domestic Science',	'3'+), (+	26,	'core'	,	'Maths',		'3'+), (+	26,	'optional',	'Music',		'3'+), (+	26,	'core'	,	'Physics',		'4'+), (+	27,	'core'	,	'Chemistry',		'2'+), (+	27,	'optional',	'Domestic Science',	'3'+), (+	27,	'core'	,	'Games',		''+), (+	27,	'core'	,	'History',		'3'+), (+	27,	'core'	,	'Maths',		'3'+), (+	27,	'optional',	'Music',		'1'+), (+	27,	'core'	,	'Physics',		'3.A'+), (+	27,	'core'	,	'Religious Education',	'1'+), (+	28,	'core'	,	'Biology',		'3'+), (+	28,	'core'	,	'Chemistry',		'3'+), (+	28,	'optional',	'Domestic Science',	'3'+), (+	28,	'core'	,	'Geography',		'4'+), (+	28,	'core'	,	'Maths',		'3'+), (+	28,	'optional',	'Music',		'2'+), (+	28,	'core'	,	'Physical Education',	'1'+), (+	29,	'core'	,	'Biology',		'3'+), (+	29,	'optional',	'Domestic Science',	'3'+), (+	29,	'core'	,	'History',		'3'+), (+	29,	'core'	,	'Maths',		'3'+), (+	29,	'optional',	'Music',		'3'+), (+	29,	'core'	,	'Physical Education',	'1'+), (+	29,	'core'	,	'Physics',		'3.B'+), (+	30,	'optional',	'Art',			'1'+), (+	30,	'core'	,	'Chemistry',		'1'+), (+	30,	'optional',	'Domestic Science',	'1'+), (+	30,	'core'	,	'English',		'1'+), (+	30,	'core'	,	'French',		'1'+), (+	30,	'core'	,	'Games',		''+), (+	30,	'core'	,	'Geography',		'1'+), (+	30,	'core'	,	'History',		'1'+), (+	30,	'core'	,	'Maths',		'1'+), (+	30,	'optional',	'Music',		'1'+), (+	30,	'core'	,	'Physical Education',	'1'+), (+	30,	'core'	,	'Physics',		'1'+), (+	30,	'core'	,	'Swimming',		'1'+), (+	30,	'optional',	'Woodwork',		'1'+), (+	31,	'optional',	'Art',			'2'+), (+	31,	'core'	,	'Chemistry',		'1'+), (+	31,	'optional',	'Domestic Science',	'1'+), (+	31,	'core'	,	'English',		'1'+), (+	31,	'core'	,	'Games',		''+), (+	31,	'core'	,	'Geography',		'1'+), (+	31,	'core'	,	'German',		'1'+), (+	31,	'core'	,	'History',		'1'+), (+	31,	'core'	,	'Maths',		'1'+), (+	31,	'core'	,	'Physical Education',	'1'+), (+	31,	'core'	,	'Physics',		'1'+), (+	31,	'core'	,	'Religious Education',	'1'+), (+	31,	'core'	,	'Swimming',		'1'+), (+	32,	'optional',	'Art',			'1'+), (+	32,	'core'	,	'English',		'1'+), (+	32,	'core'	,	'Games',		''+), (+	32,	'core'	,	'Geography',		'1'+), (+	32,	'core'	,	'History',		'1'+), (+	32,	'core'	,	'Maths',		'1'+), (+	32,	'optional',	'Music',		'1'+), (+	32,	'core'	,	'Physical Education',	'1'+), (+	32,	'core'	,	'Physics',		'1'+), (+	32,	'core'	,	'Religious Education',	'1'+), (+	32,	'core'	,	'Swimming',		'1'+), (+	33,	'optional',	'Art',			'1'+), (+	33,	'core'	,	'Biology',		'1'+), (+	33,	'core'	,	'Chinese',		'1'+), (+	33,	'optional',	'Domestic Science',	'1'+), (+	33,	'core'	,	'English',		'1'+), (+	33,	'core'	,	'Games',		''+), (+	33,	'core'	,	'Geography',		'1'+), (+	33,	'core'	,	'History',		'1'+), (+	33,	'core'	,	'Maths',		'1'+), (+	33,	'optional',	'Music',		'1'+), (+	33,	'core'	,	'Physical Education',	'1'+), (+	33,	'core'	,	'Physics',		'1'+), (+	33,	'core'	,	'Religious Education',	'1'+), (+	33,	'core'	,	'Swimming',		'1'+), (+	34,	'core'	,	'Biology',		'2'+), (+	34,	'optional',	'Domestic Science',	'2'+), (+	34,	'core'	,	'English',		'2'+), (+	34,	'core'	,	'French',		'2'+), (+	34,	'core'	,	'Games',		''+), (+	34,	'core'	,	'History',		'2'+), (+	34,	'optional',	'Music',		'2'+), (+	34,	'core'	,	'Physical Education',	'2'+), (+	34,	'core'	,	'Physics',		'2'+), (+	34,	'core'	,	'Swimming',		'2'+), (+	34,	'optional',	'Technical Drawing',	'2'+), (+	35,	'optional',	'Art',			'2'+), (+	35,	'core'	,	'Chemistry',		'2'+), (+	35,	'optional',	'Domestic Science',	'2'+), (+	35,	'core'	,	'English',		'2'+), (+	35,	'core'	,	'Games',		''+), (+	35,	'core'	,	'Geography',		'2'+), (+	35,	'core'	,	'German',		'2'+), (+	35,	'core'	,	'Maths',		'2'+), (+	35,	'core'	,	'Physical Education',	'2'+), (+	35,	'core'	,	'Religious Education',	'2'+), (+	35,	'core'	,	'Swimming',		'2'+), (+	36,	'optional',	'Art',			'1'+), (+	36,	'core'	,	'Biology',		'2'+), (+	36,	'core'	,	'Chinese',		'2'+), (+	36,	'core'	,	'English',		'2'+), (+	36,	'core'	,	'Games',		''+), (+	36,	'core'	,	'Geography',		'2'+), (+	36,	'core'	,	'Maths',		'2'+), (+	36,	'optional',	'Music',		'2'+), (+	36,	'core'	,	'Physics',		'2'+), (+	36,	'core'	,	'Swimming',		'2'+), (+	36,	'optional',	'Technical Drawing',	'1'+), (+	37,	'core'	,	'Biology',		'2'+), (+	37,	'core'	,	'Chemistry',		'2'+), (+	37,	'core'	,	'English',		'2'+), (+	37,	'core'	,	'French',		'2'+), (+	37,	'core'	,	'History',		'2'+), (+	37,	'core'	,	'Maths',		'2'+), (+	37,	'optional',	'Music',		'2'+), (+	37,	'core'	,	'Physics',		'2'+), (+	37,	'core'	,	'Swimming',		'2'+), (+	37,	'optional',	'Woodwork',		'2'+), (+	38,	'core'	,	'Chinese',		'3'+), (+	38,	'optional',	'Domestic Science',	'3'+), (+	38,	'core'	,	'English',		'3'+), (+	38,	'core'	,	'Games',		''+), (+	38,	'core'	,	'History',		'3'+), (+	38,	'core'	,	'Maths',		'3'+), (+	38,	'core'	,	'Physics',		'3.A'+), (+	38,	'core'	,	'Swimming',		'3'+), (+	38,	'optional',	'Technical Drawing',	'1'+), (+	39,	'optional',	'Art',			'3'+), (+	39,	'core'	,	'Biology',		'3'+), (+	39,	'core'	,	'Chemistry',		'3'+), (+	39,	'optional',	'Domestic Science',	'2'+), (+	39,	'core'	,	'English',		'3'+), (+	39,	'core'	,	'German',		'3'+), (+	39,	'core'	,	'Maths',		'3'+), (+	39,	'core'	,	'Physical Education',	'3'+), (+	39,	'core'	,	'Swimming',		'3'+), (+	40,	'core'	,	'Biology',		'3'+), (+	40,	'core'	,	'English',		'3'+), (+	40,	'core'	,	'Geography',		'3'+), (+	40,	'core'	,	'Maths',		'3'+), (+	40,	'optional',	'Music',		'3'+), (+	40,	'core'	,	'Physical Education',	'3'+), (+	40,	'core'	,	'Physics',		'3.B'+), (+	40,	'core'	,	'Swimming',		'3'+), (+	40,	'optional',	'Technical Drawing',	'2'+), (+	40,	'optional',	'Woodwork',		'1'+);+UNLOCK TABLES;+
+ sql/MySQL/weekdazeTriggers.sql view
@@ -0,0 +1,1279 @@+-- Copyright (C) 2015 Dr. Alistair Ward+--+-- This file is part of WeekDaze.+--+-- WeekDaze 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.+--+-- WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+--+-- Create the functions required shortly in triggers.++DROP FUNCTION IF EXISTS `inClosedUnitInterval`;+CREATE FUNCTION inClosedUnitInterval(f DOUBLE) RETURNS BOOL COMMENT 'Whether the specified floating-point number lies within the inclusive range, zero to one.' DETERMINISTIC+	RETURN	f BETWEEN 0 AND 1;++DROP FUNCTION IF EXISTS `isValidConfigVersion`;+CREATE FUNCTION isValidConfigVersion(configVersion VARCHAR(16)) RETURNS BOOL COMMENT 'Whether the format of the specified configuration-version is acceptable.' DETERMINISTIC+	RETURN	configVersion REGEXP "^[0-9]+(\.[0-9]+)*$";++DROP FUNCTION IF EXISTS `isValidEmailAddressFormat`;+CREATE FUNCTION isValidEmailAddressFormat(emailAddress VARCHAR(255)) RETURNS BOOL COMMENT 'Validates the format of the specified email-address, but not the existence of any MX-record.' DETERMINISTIC+	RETURN	emailAddress REGEXP "^[-#$^&|!%'`?*+/={}~[:alnum:]]+(\.[-#$^&|!%'`?*+/={}~[:alnum:]]+)*@([[:alnum:]][-[:alnum:]]{0,62}\.)+[[:alpha:]]{2,}$";++DROP FUNCTION IF EXISTS `facilityProvidersExist`;+CREATE FUNCTION facilityProvidersExist(+	pProjectId	INT UNSIGNED,+	pFacilityTypeId	INT UNSIGNED+) RETURNS BOOL COMMENT 'Whether the specified facility-type is advertised by a location in the specified project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_locationCatalogue` NATURAL JOIN `tbl_facility` /* USING (`locationCatalogueId`) */ WHERE `projectId` = pProjectId AND `facilityTypeId` = pFacilityTypeId+	);++DROP FUNCTION IF EXISTS `areAvailableMemberStudentBodies`;+CREATE FUNCTION areAvailableMemberStudentBodies(+	pProjectId	INT UNSIGNED,+	pGroupId	VARCHAR(32),+	pDay		ENUM('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')+) RETURNS BOOL COMMENT 'Whether all the student-bodies who\'re members of the specified group, are available to meet on the specified day.'+	RETURN NOT EXISTS (+		SELECT 1 FROM `tbl_studentBodyRegister` NATURAL JOIN `tbl_studentGroupMembership` /* USING (`studentBodyRegisterId`) */ WHERE `projectId` = pProjectId AND `groupId` = pGroupId AND FIND_IN_SET(pDay, availability) = 0 /* unavailable */+	);++DROP FUNCTION IF EXISTS `areAvailableMemberTeachers`;+CREATE FUNCTION areAvailableMemberTeachers(+	pProjectId	INT UNSIGNED,+	pGroupId	VARCHAR(32),+	pDay		ENUM('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')+) RETURNS BOOL COMMENT 'Whether all the teachers who\'re members of the specified group, are available to meet on the specified day.'+	RETURN NOT EXISTS (+		SELECT 1 FROM `tbl_teacherRegister` NATURAL JOIN `tbl_teacherGroupMembership` /* USING (`teacherRegisterId`) */ WHERE `projectId` = pProjectId AND `groupId` = pGroupId AND FIND_IN_SET(pDay, availability) = 0 /* unavailable */+	);++-- DROP FUNCTION IF EXISTS `facilityIsRequired`;+-- CREATE FUNCTION facilityIsRequired(+-- 	pProjectId	INT UNSIGNED,+-- 	pFacilityTypeId	INT UNSIGNED+-- ) RETURNS BOOL COMMENT 'Whether the specified facility-type is required by any course, offered by any teacher in the specified project.'+-- 	RETURN EXISTS (+-- 		SELECT 1 FROM `tbl_teacherRegister` NATURAL JOIN `tbl_requiredFacility` /* USING (`teacherRegisterId`) */ WHERE `projectId` = pProjectId AND `facilityTypeId` = pFacilityTypeId+-- 	);++DROP FUNCTION IF EXISTS `groupIdExists`;+CREATE FUNCTION groupIdExists(+	pProjectId	INT UNSIGNED,+	pGroupId	VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified group has been defined in the specified project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_groupCatalogue` WHERE `projectId` = pProjectId AND `groupId` = pGroupId+	);++DROP FUNCTION IF EXISTS `groupIdByStudentBodyRegisterIdExists`;+CREATE FUNCTION groupIdByStudentBodyRegisterIdExists(+	pStudentBodyRegisterId	INT UNSIGNED,+	pGroupId		VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified group has been defined in the implied project.'+	RETURN groupIdExists(+		(SELECT `projectId` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = pStudentBodyRegisterId),+		pGroupId+	);++DROP FUNCTION IF EXISTS `groupIdByTeacherRegisterIdExists`;+CREATE FUNCTION groupIdByTeacherRegisterIdExists(+	pTeacherRegisterId	INT UNSIGNED,+	pGroupId		VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified group has been defined in the implied project.'+	RETURN groupIdExists(+		(SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = pTeacherRegisterId),+		pGroupId+	);++DROP FUNCTION IF EXISTS `isAvailableFacility`;+CREATE FUNCTION isAvailableFacility(+	pTeacherRegisterId	INT UNSIGNED,+	pFacilityTypeId		INT UNSIGNED+) RETURNS BOOL COMMENT 'Whether the specified facility-type is available @ any location in the implied project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_locationCatalogue` NATURAL JOIN `tbl_facility` /* USING (`locationCatalogueId`) */ WHERE `projectId` = (+			SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = pTeacherRegisterId+		) AND `facilityTypeId` = pFacilityTypeId+	);++DROP FUNCTION IF EXISTS `isAvailableGroupForAllMandatoryMeetings`;+CREATE FUNCTION isAvailableGroupForAllMandatoryMeetings(+	pProjectId	INT UNSIGNED,+	pGroupId	VARCHAR(32),+	pAvailability	SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')+) RETURNS BOOL COMMENT 'Whether all the mandatory meeting-times defined for the specified group, fall within the specified set of available days.'+	RETURN NOT EXISTS (+		SELECT 1 FROM `tbl_groupCatalogue` NATURAL JOIN `tbl_meetingTime` /* USING (`groupCatalogueId`) */ WHERE `projectId` = pProjectId AND `groupId` = pGroupId AND `mandatesAttendance` <=> TRUE AND FIND_IN_SET(day, pAvailability) = 0 /* unavailable */+	);++-- CAVEAT: check for NULL locationId before calling.+DROP FUNCTION IF EXISTS `isAvailableLocation`;+CREATE FUNCTION isAvailableLocation(+	pProjectId	INT UNSIGNED,+	pLocationId	VARCHAR(32),+	pDay		ENUM('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')+) RETURNS BOOL COMMENT 'Whether the specified location, in the specified project, is available on the specified day.'+	RETURN FIND_IN_SET(+		pDay,+		(+			SELECT `availability` FROM `tbl_locationCatalogue` WHERE `projectId` = pProjectId AND `locationId` = pLocationId+		)+	) > 0;++DROP FUNCTION IF EXISTS `matchingCourseExists`;+CREATE FUNCTION matchingCourseExists(+	pProjectId	INT UNSIGNED,+	pTopic		VARCHAR(32),+	pLevel		VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified subject is offered in any course, of any teacher in the specified project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_teacherRegister` NATURAL JOIN `tbl_service` /* USING (`teacherRegisterId`) */ WHERE `projectId` = pProjectId AND `topic` = pTopic AND `level` = pLevel+	);++DROP FUNCTION IF EXISTS `meetingTimeExists`;+CREATE FUNCTION meetingTimeExists(pProjectId INT UNSIGNED) RETURNS BOOL COMMENT 'Whether any meeting-times have been defined in the specified project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_groupCatalogue` NATURAL JOIN `tbl_meetingTime` /* USING (`groupCatalogueId`) */ WHERE `projectId` = pProjectId+	);++DROP FUNCTION IF EXISTS `specificTimeRequestExists`;+CREATE FUNCTION specificTimeRequestExists(pProjectId INT UNSIGNED) RETURNS BOOL COMMENT 'Whether any specific time requests have been defined in the specified project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_teacherRegister` NATURAL JOIN `tbl_specificTimeRequest` /* USING (`teacherRegisterId`) */ WHERE `projectId` = pProjectId+	);++DROP FUNCTION IF EXISTS `studentExists`;+CREATE FUNCTION studentExists(+	pStudentBodyRegisterId	INT UNSIGNED,+	pStudentId		VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified student exists in any student-body in the implied project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_studentBodyRegister` NATURAL JOIN `tbl_studentBodyMembership` /* USING (`studentBodyRegisterId`) */ WHERE `projectId` = (+			SELECT `projectId` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = pStudentBodyRegisterId+		) AND `studentId` = pStudentId+	);++DROP FUNCTION IF EXISTS `subjectIsOffered`;+CREATE FUNCTION subjectIsOffered(+	pProjectId	INT UNSIGNED,+	pTopic		VARCHAR(32),+	pLevel		VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified subject is offered by any teachers in the specified project.'+	RETURN EXISTS (+		SELECT DISTINCT `teacherRegisterId` FROM `tbl_service` WHERE `teacherRegisterId` IN (+			SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = pProjectId+		) AND `topic` = pTopic AND `level` = pLevel+	);++DROP FUNCTION IF EXISTS `subjectIsRequired`;+CREATE FUNCTION subjectIsRequired(+	pProjectId	INT UNSIGNED,+	pTopic		VARCHAR(32),+	pLevel		VARCHAR(32)+) RETURNS BOOL COMMENT 'Whether the specified subject is included in the knowledge-requirements, of any student-body in the specified project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_studentBodyRegister` INNER JOIN `tbl_knowledgeRequirement` AS k USING (studentBodyRegisterId) WHERE `projectId` = pProjectId AND `topic` = pTopic AND k.`level` = pLevel+	);++DROP FUNCTION IF EXISTS `areLocationAndFacilityTypeInSameProject`;+CREATE FUNCTION areLocationAndFacilityTypeInSameProject(+	pLocationCatalogueId	INT UNSIGNED,+	pFacilityTypeId		INT UNSIGNED+) RETURNS BOOL COMMENT 'Whether the referenced location & facility-type exist in the same project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_locationCatalogue` NATURAL JOIN `tbl_facilityType` WHERE `locationCatalogueId` = pLocationCatalogueId AND `facilityTypeId` = pFacilityTypeId+	);++DROP FUNCTION IF EXISTS `areTeacherAndFacilityTypeInSameProject`;+CREATE FUNCTION areTeacherAndFacilityTypeInSameProject(+	pTeacherRegisterId	INT UNSIGNED,+	pFacilityTypeId		INT UNSIGNED+) RETURNS BOOL COMMENT 'Whether the referenced teacher & facility-type exist in the same project.'+	RETURN EXISTS (+		SELECT 1 FROM `tbl_teacherRegister` NATURAL JOIN `tbl_facilityType` WHERE `teacherRegisterId` = pTeacherRegisterId AND `facilityTypeId` = pFacilityTypeId+	);++-- Create the procedures required shortly in triggers.++DROP PROCEDURE IF EXISTS `deleteKnowledgeRequirements`;+CREATE PROCEDURE deleteKnowledgeRequirements(+	IN pProjectId	INT UNSIGNED,+	IN pTopic	VARCHAR(32),+	IN pLevel	VARCHAR(32)+) COMMENT 'Deletes matching knowledgeRequirements.'+	DELETE FROM `tbl_knowledgeRequirement` WHERE `studentBodyRegisterId` IN (+		SELECT `studentBodyRegisterId` FROM `tbl_studentBodyRegister` WHERE `projectId` = pProjectId+	) AND `topic` = pTopic AND `level` = pLevel AND NOT subjectIsOffered(pProjectId, pTopic, pLevel);++DROP PROCEDURE IF EXISTS `deleteKnowledgeRequirementsLackingCourse`;+CREATE PROCEDURE deleteKnowledgeRequirementsLackingCourse(IN pProjectId INT UNSIGNED) COMMENT 'Deletes knowledgeRequirements lacking a course.'+	DELETE FROM `tbl_knowledgeRequirement` WHERE `studentBodyRegisterId` IN (+		SELECT `studentBodyRegisterId` FROM `tbl_studentBodyRegister` WHERE `projectId` = pProjectId+	) AND NOT EXISTS (+		SELECT 1 FROM `tbl_service` AS s NATURAL JOIN /* USING (`teacherRegisterId`) */ `tbl_teacherRegister` WHERE `projectId` = pProjectId AND `tbl_knowledgeRequirement`.`topic` = `s`.`topic` AND `tbl_knowledgeRequirement`.`level` = `s`.`level`+	);++DROP PROCEDURE IF EXISTS `deleteRequiredFacility`;+CREATE PROCEDURE deleteRequiredFacility(+	IN pProjectId		INT UNSIGNED,+	IN pFacilityTypeId	INT UNSIGNED+) COMMENT 'Deletes the specified requiredFacilities.'+	DELETE FROM `tbl_requiredFacility` WHERE `teacherRegisterId` IN (+		SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = pProjectId+	) AND `facilityTypeId` = pFacilityTypeId;++DROP PROCEDURE IF EXISTS `deleteMatchingRequiredFacilities`;+CREATE PROCEDURE deleteMatchingRequiredFacilities(+	IN pTeacherRegisterId	INT UNSIGNED,+	IN pTopic		VARCHAR(32),+	IN pLevel		VARCHAR(32)+) COMMENT 'Deletes matching requiredFacilities.'+	DELETE FROM `tbl_requiredFacility` WHERE `teacherRegisterId` = pTeacherRegisterId AND `topic` = pTopic AND `level` = pLevel;++DROP PROCEDURE IF EXISTS `deleteSpecificTimeRequests`;+CREATE PROCEDURE deleteSpecificTimeRequests(+	IN pTeacherRegisterId	INT UNSIGNED,+	IN pTopic		VARCHAR(32),+	IN pLevel		VARCHAR(32)+) COMMENT 'Deletes matching specificTimeRequests.'+	DELETE FROM `tbl_specificTimeRequest` WHERE `teacherRegisterId` = pTeacherRegisterId AND `topic` = pTopic AND `level` = pLevel;++DROP PROCEDURE IF EXISTS `deleteUnadvertisedRequiredFacilities`;+CREATE PROCEDURE deleteUnadvertisedRequiredFacilities(IN pProjectId INT UNSIGNED) COMMENT 'Deletes unspecified requiredFacilities which are not advertised by any location.'+	DELETE FROM `tbl_requiredFacility` WHERE `teacherRegisterId` IN (+		SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = pProjectId+	) AND `facilityTypeId` NOT IN (+		SELECT `facilityTypeId` FROM `tbl_facility` NATURAL JOIN /* USING (`locationCatalogueId`)*/ `tbl_locationCatalogue` WHERE `projectId` = pProjectId+	);++-- Temporarily redefine MySqlClient's statement-delimiter, to distinguish it from the SQL statement-separator.+DELIMITER //++DROP PROCEDURE IF EXISTS `deleteGroupMembership`;+CREATE PROCEDURE deleteGroupMembership(+	IN pProjectId	INT UNSIGNED,+	IN pGroupId	VARCHAR(32)+) COMMENT 'Deletes all memberships of the specified group.'+	BEGIN+		DELETE FROM `tbl_studentGroupMembership` WHERE `studentBodyRegisterId` IN (+			SELECT `studentBodyRegisterId` FROM `tbl_studentBodyRegister` WHERE `projectId` = pProjectId+		) AND `groupId` = pGroupId;++		DELETE FROM `tbl_teacherGroupMembership` WHERE `teacherRegisterId` IN (+			SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = pProjectId+		) AND `groupId` = pGroupId;+	END+//+/*+	Create triggers to express a more sophisticated referential integrity than a mere foreign key can express.+	CAVEAT: in MySql, "Triggers are not activated by foreign key actions"; https://dev.mysql.com/doc/refman/5.5/en/stored-program-restrictions.html+	CAVEAT: for security, don't print embed any VARCHAR fields into error-messages, since they may contain arbitrary text & this database may be used as part of a web-application.+*/+CREATE TRIGGER `user.beforeInsert` BEFORE INSERT ON `tbl_user`+	FOR EACH ROW /* inserted */+	BEGIN+		IF NOT isValidEmailAddressFormat(NEW.`emailAddress`) THEN+			SET @msg	= CONCAT('user: invalid "emailAddress"; where userId=', NEW.`userId`, '.');	-- CAVEAT: for security, don't print the `email-address` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_user', COLUMN_NAME='emailAddress', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `user.beforeUpdate` BEFORE UPDATE ON `tbl_user`+	FOR EACH ROW /* updated */+	BEGIN+		IF NOT isValidEmailAddressFormat(NEW.`emailAddress`) THEN+			SET @msg	= CONCAT('user: invalid "emailAddress"; where userId=', NEW.`userId`, '.');	-- CAVEAT: for security, don't print the `email-address` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_user', COLUMN_NAME='emailAddress', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `configVersion.beforeInsert` BEFORE INSERT ON `tbl_configVersion`+	FOR EACH ROW /* inserted */+	BEGIN+		IF NOT isValidConfigVersion(NEW.`configVersion`) THEN+			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_configVersion', COLUMN_NAME='configVersion', MESSAGE_TEXT='configVersion: invalid "configVersion"; dotted-decimal required.';	-- CAVEAT: for security, don't print the `configVersion` which may contain arbitrary text.+		END IF;+	END+//+CREATE TRIGGER `configVersion.beforeUpdate` BEFORE UPDATE ON `tbl_configVersion`+	FOR EACH ROW /* updated */+	BEGIN+		IF NOT isValidConfigVersion(NEW.`configVersion`) THEN+			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_configVersion', COLUMN_NAME='configVersion', MESSAGE_TEXT='configVersion: invalid "configVersion"; dotted-decimal required.';	-- CAVEAT: for security, don't print the `configVersion` which may contain arbitrary text.+		END IF;+	END+//+-- This won't trigger on deleting a foreign key 'tbl_project.projectId', but it will cascade-delete the affected rows from 'tbl_specificTimeRequest', 'tbl_service' (via tbl_teacherRegister) & 'tbl_meetingTime', thus rendering the issue mute.+CREATE TRIGGER `timeslotIdBounds.beforeDelete` BEFORE DELETE ON `tbl_timeslotIdBounds`+	FOR EACH ROW /* deleted */+	BEGIN+		DELETE FROM `tbl_meetingTime` WHERE `groupCatalogueId` IN (+			SELECT `groupCatalogueId` FROM `tbl_groupCatalogue` WHERE `projectId` = OLD.`projectId`+		); -- Nothing depends on these.++		DELETE FROM `tbl_service` WHERE `teacherRegisterId` IN (+			SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = OLD.`projectId`+		) AND (+			`idealTimeslotRequest` IS NOT NULL OR `minimumConsecutiveLessons` > 1+		); -- CAVEAT: this might result in some knowledge-requirements being deleted also.++		DELETE FROM `tbl_specificTimeRequest` WHERE `teacherRegisterId` IN (+			SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = OLD.`projectId`+		); -- Nothing depends on these.+	END+//+CREATE TRIGGER `timeslotIdBounds.beforeInsert` BEFORE INSERT ON `tbl_timeslotIdBounds`+	FOR EACH ROW /* inserted */+	BEGIN+		IF NEW.`min` > NEW.`max` THEN+			SET @msg	= CONCAT('timeslotIdBounds: min=', NEW.`min`, ' exceeds max=', NEW.`max`, '; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_timeslotIdBounds', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `timeslotIdBounds.beforeUpdate` BEFORE UPDATE ON `tbl_timeslotIdBounds`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_timeslotIdBounds';++		IF NEW.`projectId` <> OLD.`projectId` /* the old timeslot-id bounds have effectively been deleted */ AND (+			specificTimeRequestExists(OLD.`projectId`) OR meetingTimeExists(OLD.`projectId`)+		) THEN+			SET @msg	= CONCAT('timeslotIdBounds: specific time requests or meeting-times still reference this range; where projectId=', OLD.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='projectId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`min` > NEW.`max` THEN+			SET @msg	= CONCAT('timeslotIdBounds: min=', NEW.`min`, ' exceeds max=', NEW.`max`, '; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSE+			DELETE FROM `tbl_meetingTime` WHERE `groupCatalogueId` IN (+				SELECT `groupCatalogueId` FROM `tbl_groupCatalogue` WHERE `projectId` = OLD.`projectId`+			) AND `timeslotId` NOT BETWEEN NEW.`min` AND NEW.`max`;	-- Nothing depends on these.++			DELETE FROM `tbl_service` WHERE `teacherRegisterId` IN (+				SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = OLD.`projectId`+			) AND (+				(+					`idealTimeslotRequest` IS NOT NULL AND `idealTimeslotRequest` NOT BETWEEN NEW.`min` AND NEW.`max`+				) OR `minimumConsecutiveLessons` > 1 + NEW.`max` - NEW.`min`+			); -- CAVEAT: this might result in some knowledge-requirements being deleted also.++			DELETE FROM `tbl_specificTimeRequest` WHERE `teacherRegisterId` IN (+				SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = OLD.`projectId`+			) AND `timeslotId` NOT BETWEEN NEW.`min` AND NEW.`max`;	-- Nothing depends on these.+		END IF;+	END+//+CREATE TRIGGER `outputOptions.beforeInsert` BEFORE INSERT ON `tbl_outputOptions`+	FOR EACH ROW /* inserted */+	BEGIN+		IF NEW.`nDecimalDigits` = 0 THEN+			SET @msg	= CONCAT('outputOptions: "nDecimalDigits" must exceed zero; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_outputOptions', COLUMN_NAME='nDecimalDigits', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `outputOptions.beforeUpdate` BEFORE UPDATE ON `tbl_outputOptions`+	FOR EACH ROW /* updated */+	BEGIN+		IF NEW.`nDecimalDigits` = 0 THEN+			SET @msg	= CONCAT('outputOptions: "nDecimalDigits" must exceed zero; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_outputOptions', COLUMN_NAME='nDecimalDigits', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `evolutionStrategies.beforeInsert` BEFORE INSERT ON `tbl_evolutionStrategies`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_evolutionStrategies';++		IF NEW.`fecundityDecayRatio` IS NOT NULL AND NOT inClosedUnitInterval(NEW.`fecundityDecayRatio`) THEN+			SET @msg	= CONCAT('evolutionStrategies: fecundityDecayRatio=', NEW.`fecundityDecayRatio`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='fecundityDecayRatio', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`minimumPopulationDiversityRatio` IS NOT NULL AND NOT inClosedUnitInterval(NEW.`minimumPopulationDiversityRatio`) THEN+			SET @msg	= CONCAT('evolutionStrategies: minimumPopulationDiversityRatio=', NEW.`minimumPopulationDiversityRatio`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='minimumPopulationDiversityRatio', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `evolutionStrategies.beforeUpdate` BEFORE UPDATE ON `tbl_evolutionStrategies`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_evolutionStrategies';++		IF NEW.`fecundityDecayRatio` IS NOT NULL AND NOT inClosedUnitInterval(NEW.`fecundityDecayRatio`) THEN+			SET @msg	= CONCAT('evolutionStrategies: fecundityDecayRatio=', NEW.`fecundityDecayRatio`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='fecundityDecayRatio', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`minimumPopulationDiversityRatio` IS NOT NULL AND NOT inClosedUnitInterval(NEW.`minimumPopulationDiversityRatio`) THEN+			SET @msg	= CONCAT('evolutionStrategies: minimumPopulationDiversityRatio=', NEW.`minimumPopulationDiversityRatio`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='minimumPopulationDiversityRatio', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `tbl_optimiseLessonCriteriaWeights.beforeInsert` BEFORE INSERT ON `tbl_optimiseLessonCriteriaWeights`+	FOR EACH ROW /* inserted */+	BEGIN+		IF NEW.`reductionFactor` IS NOT NULL AND NOT inClosedUnitInterval(NEW.`reductionFactor`) THEN+			SET @msg	= CONCAT('optimiseLessonCriteriaWeights: reductionFactor=', NEW.`reductionFactor`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_optimiseLessonCriteriaWeights', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `tbl_optimiseLessonCriteriaWeights.beforeUpdate` BEFORE UPDATE ON `tbl_optimiseLessonCriteriaWeights`+	FOR EACH ROW /* updated */+	BEGIN+		IF NEW.`reductionFactor` IS NOT NULL AND NOT inClosedUnitInterval(NEW.`reductionFactor`) THEN+			SET @msg	= CONCAT('optimiseLessonCriteriaWeights: reductionFactor=', NEW.`reductionFactor`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_optimiseLessonCriteriaWeights', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `lessonCriteriaWeights.beforeInsert` BEFORE INSERT ON `tbl_lessonCriteriaWeights`+	FOR EACH ROW /* inserted */+	BEGIN+		IF GREATEST(+			NEW.`areResourcesReused`,+			NEW.`greatestSynchronisedCourseSetSize`,+			NEW.`greatestMinimumConsecutiveLessons`,+			NEW.`greatestRemainingCourseLessons`,+			NEW.`isCoreKnowledgeRequirement`,+			NEW.`isSpecialistInTopic`,+			NEW.`matchCourseClassSizeToLocationCapacity`,+			NEW.`maximiseRelativeFacilityUtilisation`,+			NEW.`maximiseStudentClassSizeOverCourseClassSize`,+			NEW.`maximiseStudentClassSizeOverLocationCapacity`,+			NEW.`minimiseBookingAtAnotherCoursesSpecifiedTime`,+			NEW.`minimiseBookingOfLocationByOtherTeachers`,+			NEW.`minimiseDeviationFromTimeslotRequest`,+			NEW.`minimiseInterCampusMigrationsOfStudents`,+			NEW.`minimiseInterCampusMigrationsOfTeachers`,+			NEW.`minimiseStudentBodyCombinations`,+			NEW.`minimiseTeachersLocusOperandi`,+			NEW.`minimiseWasteOfScarceFacilities`+		) > 1.0 THEN+			SET @msg	= CONCAT('lessonCriteriaWeights: weight can\'t exceed one; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_lessonCriteriaWeights', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `lessonCriteriaWeights.beforeUpdate` BEFORE UPDATE ON `tbl_lessonCriteriaWeights`+	FOR EACH ROW /* updated */+	BEGIN+		IF GREATEST(+			NEW.`areResourcesReused`,+			NEW.`greatestSynchronisedCourseSetSize`,+			NEW.`greatestMinimumConsecutiveLessons`,+			NEW.`greatestRemainingCourseLessons`,+			NEW.`isCoreKnowledgeRequirement`,+			NEW.`isSpecialistInTopic`,+			NEW.`matchCourseClassSizeToLocationCapacity`,+			NEW.`maximiseRelativeFacilityUtilisation`,+			NEW.`maximiseStudentClassSizeOverCourseClassSize`,+			NEW.`maximiseStudentClassSizeOverLocationCapacity`,+			NEW.`minimiseBookingAtAnotherCoursesSpecifiedTime`,+			NEW.`minimiseBookingOfLocationByOtherTeachers`,+			NEW.`minimiseDeviationFromTimeslotRequest`,+			NEW.`minimiseInterCampusMigrationsOfStudents`,+			NEW.`minimiseInterCampusMigrationsOfTeachers`,+			NEW.`minimiseStudentBodyCombinations`,+			NEW.`minimiseTeachersLocusOperandi`,+			NEW.`minimiseWasteOfScarceFacilities`+		) > 1.0 THEN+			SET @msg	= CONCAT('lessonCriteriaWeights: weight can\'t exceed one; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_lessonCriteriaWeights', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `timetableCriteriaWeights.beforeInsert` BEFORE INSERT ON `tbl_timetableCriteriaWeights`+	FOR EACH ROW /* inserted */+	BEGIN+		IF GREATEST(+			NEW.`maximiseComplianceWithFreePeriodPreferences`,+			NEW.`maximiseMeanRatioOfStudentClassSizeToLocationCapacity`,+			NEW.`maximiseMeanStudentClassSize`,+			NEW.`maximiseSynchronisationOfSynchronisedCourses`,+			NEW.`maximiseWeightedMeanStudentBodyUtilisationRatio`,+			NEW.`minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest`,+			NEW.`minimiseDispersionOfStudentFreePeriodsPerDay`,+			NEW.`minimiseDispersionOfTeacherFreePeriodsPerDay`,+			NEW.`minimiseDispersionOfTeacherWorkload`,+			NEW.`minimiseMeanInterCampusMigrationsOfStudents`,+			NEW.`minimiseMeanInterCampusMigrationsOfTeachers`,+			NEW.`minimiseMeanLocationChangesOfTeachers`,+			NEW.`minimiseMeanLocusOperandiOfTeachers`,+			NEW.`minimiseMeanRatioOfIncompletelyBookedCoreKnowledge`,+			NEW.`minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge`,+			NEW.`minimiseMeanStudentBodyCombinationsPerLesson`,+			NEW.`minimiseRatioOfConsecutiveEqualLessons`,+			NEW.`minimiseRatioOfSeparatedEqualLessonsWithinAnyDay`+		) > 1.0 THEN+			SET @msg	= CONCAT('timetableCriteriaWeights: weight can\'t exceed one; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_timetableCriteriaWeights', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `timetableCriteriaWeights.beforeUpdate` BEFORE UPDATE ON `tbl_timetableCriteriaWeights`+	FOR EACH ROW /* updated */+	BEGIN+		IF GREATEST(+			NEW.`maximiseComplianceWithFreePeriodPreferences`,+			NEW.`maximiseMeanRatioOfStudentClassSizeToLocationCapacity`,+			NEW.`maximiseMeanStudentClassSize`,+			NEW.`maximiseSynchronisationOfSynchronisedCourses`,+			NEW.`maximiseWeightedMeanStudentBodyUtilisationRatio`,+			NEW.`minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest`,+			NEW.`minimiseDispersionOfStudentFreePeriodsPerDay`,+			NEW.`minimiseDispersionOfTeacherFreePeriodsPerDay`,+			NEW.`minimiseDispersionOfTeacherWorkload`,+			NEW.`minimiseMeanInterCampusMigrationsOfStudents`,+			NEW.`minimiseMeanInterCampusMigrationsOfTeachers`,+			NEW.`minimiseMeanLocationChangesOfTeachers`,+			NEW.`minimiseMeanLocusOperandiOfTeachers`,+			NEW.`minimiseMeanRatioOfIncompletelyBookedCoreKnowledge`,+			NEW.`minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge`,+			NEW.`minimiseMeanStudentBodyCombinationsPerLesson`,+			NEW.`minimiseRatioOfConsecutiveEqualLessons`,+			NEW.`minimiseRatioOfSeparatedEqualLessonsWithinAnyDay`+		) > 1.0 THEN+			SET @msg	= CONCAT('timetableCriteriaWeights: weight can\'t exceed one; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_timetableCriteriaWeights', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `locationCatalogue.beforeDelete` BEFORE DELETE ON `tbl_locationCatalogue`+	FOR EACH ROW /* deleted */+	BEGIN+		DELETE FROM `tbl_studentGroupMembership` WHERE `studentBodyRegisterId` IN (+			SELECT `studentBodyRegisterId` FROM `tbl_studentBodyRegister` WHERE `projectId` = OLD.`projectId`+		) AND `groupId` IN (+			SELECT `groupId` FROM `tbl_groupCatalogue` WHERE `projectId` = OLD.`projectId` AND `locationId` <=> OLD.`locationId`+		);++		DELETE FROM `tbl_teacherGroupMembership` WHERE `teacherRegisterId` IN (+			SELECT `teacherRegisterId` FROM `tbl_teacherRegister` WHERE `projectId` = OLD.`projectId`+		) AND `groupId` IN (+			SELECT `groupId` FROM `tbl_groupCatalogue` WHERE `projectId` = OLD.`projectId` AND `locationId` <=> OLD.`locationId`+		);+	END+//+CREATE TRIGGER `locationCatalogue.afterDelete` AFTER DELETE ON `tbl_locationCatalogue`+	FOR EACH ROW /* deleted */+	BEGIN+/*+	If one attempts to sequentially determine whether each requiredFacility lacks a corresponding facility, BEFORE any of the locations in the request are deleted,+	then one may find that each is still advertised by one of the other moribund locations in the request.+*/+		CALL deleteUnadvertisedRequiredFacilities(OLD.`projectId`);	-- Though facilities are deleted to preserve referential integrity, this won't fire the DELETE trigger for tbl_facility; we must do it manually.+	END+//+CREATE TRIGGER `locationCatalogue.beforeInsert` BEFORE INSERT ON `tbl_locationCatalogue`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_locationCatalogue';++		IF NEW.`locationId` = '' THEN+			SET @msg	= CONCAT('locationCatalogue: anonymous "locationId"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='locationId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`availability` = '' THEN+			SET @msg	= CONCAT('locationCatalogue: insufficient "availability"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`capacity` = 0 THEN+			SET @msg	= CONCAT('locationCatalogue: zero "capacity"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='capacity', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `locationCatalogue.beforeUpdate` BEFORE UPDATE ON `tbl_locationCatalogue`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_locationCatalogue';++		IF NEW.`locationId` = '' THEN+			SET @msg	= CONCAT('locationCatalogue: anonymous "locationId"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='locationId', MESSAGE_TEXT=@msg;+		ELSEIF EXISTS (+			SELECT 1 FROM `tbl_groupCatalogue` NATURAL JOIN `tbl_meetingTime` /* USING (`groupCatalogueId`) */ WHERE `projectId` = NEW.`projectId` AND `locationId` <=> NEW.`locationId` AND FIND_IN_SET(`day`, NEW.`availability`) = 0 /* unavailable */+		) THEN+			SET @msg	= CONCAT('locationCatalogue: "locationId" is unavailable @ the meeting-times of groups held there; where projectId=', NEW.`projectId`, '.');	-- CAVEAT: for security, don't print the `locationId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='locationId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`availability` = '' THEN+			SET @msg	= CONCAT('locationCatalogue: insufficient "availability"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`capacity` = 0 THEN+			SET @msg	= CONCAT('locationCatalogue: zero "capacity"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='capacity', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `locationCatalogue.afterUpdate` AFTER UPDATE ON `tbl_locationCatalogue`+	FOR EACH ROW /* updated */+	BEGIN+/*+	If one attempts to sequentially determine whether each requiredFacility lacks a corresponding facility, BEFORE any of the locations in the request are deleted,+	then one may find that each is still advertised by one of the other moribund locations in the request.+*/+		IF NEW.`projectId` <> OLD.`projectId` /* the old location has effectively been deleted */ THEN+			CALL deleteUnadvertisedRequiredFacilities(OLD.`projectId`);+		END IF;+	END+//+CREATE TRIGGER `facility.afterDelete` AFTER DELETE ON `tbl_facility`+	FOR EACH ROW /* deleted */+	BEGIN+		SELECT `projectId` FROM `tbl_locationCatalogue` WHERE `locationCatalogueId` = OLD.`locationCatalogueId` INTO @oldProjectId;++		IF NOT facilityProvidersExist(@oldProjectId, OLD.`facilityTypeId`) THEN+			CALL deleteRequiredFacility(@oldProjectId, OLD.`facilityTypeId`);+		END IF;+	END+//+CREATE TRIGGER `facility.beforeInsert` BEFORE INSERT ON `tbl_facility`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_facility';++		IF NOT areLocationAndFacilityTypeInSameProject(NEW.`locationCatalogueId`, NEW.`facilityTypeId`) THEN+			SET @msg	= CONCAT('facility: locationCatalogueId=', NEW.`locationCatalogueId` ,' is not in the same project as facilityTypeId=', NEW.`facilityTypeId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `facility.beforeUpdate` BEFORE UPDATE ON `tbl_facility`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_facility';++		IF NOT areLocationAndFacilityTypeInSameProject(NEW.`locationCatalogueId`, NEW.`facilityTypeId`) THEN+			SET @msg	= CONCAT('facility: locationCatalogueId=', NEW.`locationCatalogueId` ,' is not in the same project as facilityTypeId=', NEW.`facilityTypeId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `facility.afterUpdate` AFTER UPDATE ON `tbl_facility`+	FOR EACH ROW /* updated */+	BEGIN+		SELECT `projectId` FROM `tbl_locationCatalogue` WHERE `locationCatalogueId` = OLD.`locationCatalogueId` INTO @oldProjectId;++		IF (+			NEW.`facilityTypeId` <> OLD.`facilityTypeId` OR (+				SELECT `projectId` FROM `tbl_locationCatalogue` WHERE `locationCatalogueId` = NEW.`locationCatalogueId`+			) <> @oldProjectId	-- The old facility has effectively been deleted.+		) AND NOT facilityProvidersExist(@oldProjectId, OLD.`facilityTypeId`) THEN+			CALL deleteRequiredFacility(@oldProjectId, OLD.`facilityTypeId`);+		END IF;+	END+//+-- This won't trigger on deleting a foreign key 'tbl_project.projectId', but it will cascade-delete the affected rows from 'tbl_studentGroupMembersip' & 'tbl_teacherGroupMembership', thus rendering the issue mute.+CREATE TRIGGER `groupCatalogue.beforeDelete` BEFORE DELETE ON `tbl_groupCatalogue`+	FOR EACH ROW /* deleted */+	BEGIN+		CALL deleteGroupMembership(OLD.`projectId`, OLD.`groupId`);+	END+//+CREATE TRIGGER `groupCatalogue.beforeInsert` BEFORE INSERT ON `tbl_groupCatalogue`+	FOR EACH ROW /* inserted */+	BEGIN+		IF NEW.`groupId` = '' THEN+			SET @msg	= CONCAT('groupCatalogue: anonymous "groupId"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_groupCatalogue', COLUMN_NAME='groupId', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `groupCatalogue.beforeUpdate` BEFORE UPDATE ON `tbl_groupCatalogue`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_groupCatalogue';++		IF NEW.`groupId` = '' THEN+			SET @msg	= CONCAT('groupCatalogue: anonymous "groupId"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='groupId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`projectId` <> OLD.`projectId` OR NEW.`groupId` <> OLD.`groupId` /* the old group has effectively been deleted */ THEN+			CALL deleteGroupMembership(OLD.`projectId`, OLD.`groupId`);+		END IF;+	END+//+CREATE TRIGGER `meetingTime.beforeInsert` BEFORE INSERT ON `tbl_meetingTime`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_meetingTime';++		SELECT `projectId` FROM `tbl_groupCatalogue` WHERE `groupCatalogueId` = NEW.`groupCatalogueId` INTO @newProjectId;+		SELECT `min`, `max` FROM `tbl_timeslotIdBounds` WHERE `projectId` = @newProjectId INTO @min, @max;++		IF @max IS NULL THEN+			SET @msg	= CONCAT('meetingTime: first one must populate the timeslot-id bounds for projectId=', @newProjectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`timeslotId` NOT BETWEEN @min AND @max THEN+			SET @msg	= CONCAT('meetingTime: timeslotId=', NEW.`timeslotId`, ', not in closed interval [', @min, ', ', @max, ']; where groupCatalogueId=', NEW.`groupCatalogueId` , '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='timeslotId', MESSAGE_TEXT=@msg;+		ELSE+			SELECT `groupId`, `locationId`, `mandatesAttendance` FROM `tbl_groupCatalogue` WHERE `projectId` = @newProjectId AND `groupCatalogueId` = NEW.`groupCatalogueId` INTO @groupId, @locationId, @mandatesAttendance;++			IF @mandatesAttendance <=> TRUE THEN+				IF NOT areAvailableMemberStudentBodies(@newProjectId, @groupId, NEW.`day`) THEN+					SET @msg	= CONCAT('meetingTime: some student-bodies who\'re members of groupCatalogueId=', NEW.groupCatalogueId /* CAVEAT: for security, don't print the `groupId` which may contain arbitrary text */, ', which mandates attendance, are unavailable on "', NEW.`day`, '".');++					SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='day', MESSAGE_TEXT=@msg;+				ELSEIF NOT areAvailableMemberTeachers(@newProjectId, @groupId, NEW.`day`) THEN+					SET @msg	= CONCAT('meetingTime: some teachers who\'re members of groupCatalogueId=', NEW.groupCatalogueId /* CAVEAT: for security, don't print the `groupId` which may contain arbitrary text */, ', which mandates attendance, are unavailable on "', NEW.`day`, '".');++					SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='day', MESSAGE_TEXT=@msg;+				END IF;+			END IF;++			IF NOT @locationId IS NULL AND NOT isAvailableLocation(@newProjectId, @locationId, NEW.`day`) THEN+				SET @msg	= CONCAT('meetingTime: the specified "locationId" is unavailable on "', NEW.`day`, '"; where projectId=', @newProjectId, '.');	-- CAVEAT: for security, don't print the `locationId` which may contain arbitrary text.++				SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='day', MESSAGE_TEXT=@msg;+			END IF;+		END IF;+	END+//+CREATE TRIGGER `meetingTime.beforeUpdate` BEFORE UPDATE ON `tbl_meetingTime`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_meetingTime';++		SELECT `projectId` FROM `tbl_groupCatalogue` WHERE `groupCatalogueId` = NEW.`groupCatalogueId` INTO @newProjectId;+		SELECT `min`, `max` FROM `tbl_timeslotIdBounds` WHERE `projectId` = @newProjectId INTO @min, @max;++		IF @max IS NULL THEN+			SET @msg	= CONCAT('meetingTime: first one must populate the timeslot-id bounds for projectId=', @newProjectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`timeslotId` NOT BETWEEN @min AND @max THEN+			SET @msg	= CONCAT('meetingTime: timeslotId=', NEW.`timeslotId`, ', not in closed interval [', @min, ', ', @max, ']; where groupCatalogueId=', NEW.`groupCatalogueId` , '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='timeslotId', MESSAGE_TEXT=@msg;+		ELSE+			SELECT `groupId`, `locationId`, `mandatesAttendance` FROM `tbl_groupCatalogue` WHERE `projectId` = @newProjectId AND `groupCatalogueId` = NEW.`groupCatalogueId` INTO @groupId, @locationId, @mandatesAttendance;++			IF @mandatesAttendance <=> TRUE THEN+				IF NOT areAvailableMemberStudentBodies(@newProjectId, @groupId, NEW.`day`) THEN+					SET @msg	= CONCAT('meetingTime: some student-bodies who\'re members of groupCatalogueId=', NEW.groupCatalogueId /* CAVEAT: for security, don't print the `groupId` which may contain arbitrary text */, ', which mandates attendance, are unavailable on "', NEW.`day`, '".');++					SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='day', MESSAGE_TEXT=@msg;+				ELSEIF NOT areAvailableMemberTeachers(@newProjectId, @groupId, NEW.`day`) THEN+					SET @msg	= CONCAT('meetingTime: some teachers who\'re members of groupCatalogueId=', NEW.groupCatalogueId /* CAVEAT: for security, don't print the `groupId` which may contain arbitrary text */, ', which mandates attendance, are unavailable on "', NEW.`day`, '".');++					SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='day', MESSAGE_TEXT=@msg;+				END IF;+			END IF;++			IF NOT @locationId IS NULL AND NOT isAvailableLocation(@newProjectId, @locationId, NEW.`day`) THEN+				SET @msg	= CONCAT('meetingTime: the specified "locationId" is unavailable on "', NEW.`day`, '"; where projectId=', @newProjectId, '.');	-- CAVEAT: for security, don't print the `locationId` which may contain arbitrary text.++				SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='day', MESSAGE_TEXT=@msg;+			END IF;+		END IF;+	END+//+CREATE TRIGGER `studentBodyRegister.beforeInsert` BEFORE INSERT ON `tbl_studentBodyRegister`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_studentBodyRegister';++		IF NEW.`mnemonic` = '' THEN+			SET @msg	= CONCAT('studentBodyRegister: anonymous "mnemonic"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='mnemonic', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`availability` = '' THEN+			SET @msg	= CONCAT('studentBodyRegister: insufficient "availability"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`teachingRatio` = 0 OR NEW.`teachingRatio` > 1.0 THEN+			SET @msg	= CONCAT('studentBodyRegister: "teachingRatio=', NEW.teachingRatio, ' must be in the semi-closed unit-interval (0,1]; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='teachingRatio', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `studentBodyRegister.beforeUpdate` BEFORE UPDATE ON `tbl_studentBodyRegister`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_studentBodyRegister';++		IF NEW.`mnemonic` = '' THEN+			SET @msg	= CONCAT('studentBodyRegister: anonymous "mnemonic"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='mnemonic', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`availability` = '' THEN+			SET @msg	= CONCAT('studentBodyRegister: insufficient "availability"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF EXISTS (+			SELECT 1 FROM `tbl_groupCatalogue` NATURAL JOIN `tbl_meetingTime` /* USING (`groupCatalogueId`) */ WHERE `projectId` = NEW.`projectId` AND `groupId` IN (+				SELECT `groupId` FROM `tbl_studentGroupMembership` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId`+			) AND `mandatesAttendance` <=> TRUE AND FIND_IN_SET(day, NEW.`availability`) = 0 /* unavailable */+		) THEN+			SET @msg	= CONCAT('studentBodyRegister: some groups of which this student-body is a member, mandate attendance when they\'re unavailable; where projectId=', NEW.`projectId`, '.');	-- CAVEAT: for security, don't print the `mnemonic` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`teachingRatio` = 0 OR NEW.`teachingRatio` > 1.0 THEN+			SET @msg	= CONCAT('studentBodyRegister: "teachingRatio=', NEW.teachingRatio, ' must be in the semi-closed unit-interval (0,1]; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='teachingRatio', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `studentBodyMembership.beforeInsert` BEFORE INSERT ON `tbl_studentBodyMembership`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_studentBodyMembership';++		IF NEW.`studentId` = '' THEN+			SET @msg	= CONCAT('studentBodyMembership: anonymous "studentId"; where studentBodyRegisterId=', NEW.`studentBodyRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='studentId', MESSAGE_TEXT=@msg;+		ELSEIF studentExists(NEW.`studentBodyRegisterId`, NEW.`studentId`) THEN+			SET @msg	= CONCAT('studentBodyMembership: the specified "studentId" already exists; where projectId=', (SELECT `projectId` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId`), '.');	-- CAVEAT: for security, don't print the `studentId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='studentId', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `studentBodyMembership.beforeUpdate` BEFORE UPDATE ON `tbl_studentBodyMembership`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_studentBodyMembership';++		IF NEW.`studentId` = '' THEN+			SET @msg	= CONCAT('studentBodyMembership: anonymous "studentId"; where studentBodyRegisterId=', NEW.`studentBodyRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='studentId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`studentId` <> OLD.`studentId` && studentExists(NEW.`studentBodyRegisterId`, NEW.`studentId`) THEN+			SET @msg	= CONCAT('studentBodyMembership: the specified "studentId" already exists; where projectId=', (SELECT `projectId` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId`), '.');	-- CAVEAT: for security, don't print the `studentId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='studentId', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `studentGroupMembership.beforeInsert` BEFORE INSERT ON `tbl_studentGroupMembership`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_studentGroupMembership';++		SELECT `projectId`, `availability` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId` INTO @projectId, @availability;++		IF NOT groupIdByStudentBodyRegisterIdExists(NEW.`studentBodyRegisterId`, NEW.`groupId`) THEN+			SET @msg	= CONCAT('studentGroupMembership: the specified "groupId" doesn\'t exist; where studentBodyRegisterId=', NEW.`studentBodyRegisterId`, '.');	-- CAVEAT: for security, don't print the `groupId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NOT isAvailableGroupForAllMandatoryMeetings(@projectId, NEW.`groupId`, @availability) THEN+			SET @msg	= CONCAT('studentGroupMembership: some groups of which studentBodyRegisterId=', NEW.`studentBodyRegisterId`, ' is a member, mandate attendance when they\'re unavailable; where projectId=', @projectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `studentGroupMembership.beforeUpdate` BEFORE UPDATE ON `tbl_studentGroupMembership`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_studentGroupMembership';++		SELECT `projectId`, `availability` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId` INTO @projectId, @availability;++		IF NOT groupIdByStudentBodyRegisterIdExists(NEW.`studentBodyRegisterId`, NEW.`groupId`) THEN+			SET @msg	= CONCAT('studentGroupMembership: the specified "groupId" doesn\'t exist; where studentBodyRegisterId=', NEW.`studentBodyRegisterId`, '.');	-- CAVEAT: for security, don't print the `groupId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NOT isAvailableGroupForAllMandatoryMeetings(@projectId, NEW.`groupId`, @availability) THEN+			SET @msg	= CONCAT('studentGroupMembership: some groups of which studentBodyRegisterId=', NEW.`studentBodyRegisterId`, ' is a member, mandate attendance when they\'re unavailable; where projectId=', @projectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `teacherRegister.afterDelete` AFTER DELETE ON `tbl_teacherRegister`+	FOR EACH ROW /* deleted */+	BEGIN+		CALL deleteKnowledgeRequirementsLackingCourse(OLD.`projectId`);+	END+//+CREATE TRIGGER `teacherRegister.beforeInsert` BEFORE INSERT ON `tbl_teacherRegister`+	FOR EACH ROW /* inserted */+	BEGIN+		DECLARE thisTeacherRegisterId	INT UNSIGNED;+		DECLARE thisAvailability	SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');+		DECLARE done			BOOL	DEFAULT FALSE;+		DECLARE locationCursor		CURSOR FOR SELECT `teacherRegisterId`, `availability` FROM `tbl_teacherRegister` WHERE `projectId` = NEW.`projectId` AND `locationId` <=> NEW.`locationId` /* CAVEAT: both could be NULL */;++		DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;++		SET @tableName	= 'tbl_teacherRegister';++		IF NEW.`teacherId` = '' THEN+			SET @msg	= CONCAT('teacherRegister: anonymous "teacherId"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='teacherId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`availability` = '' THEN+			SET @msg	= CONCAT('teacherRegister: insufficient "availability"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF NOT inClosedUnitInterval(NEW.`maximumTeachingRatio`) THEN+			SET @msg	= CONCAT('teacherRegister: maximumTeachingRatio=', NEW.`maximumTeachingRatio`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='maximumTeachingRatio', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`locationId` IS NOT NULL THEN+			OPEN locationCursor;++			locationLoop: LOOP+				FETCH locationCursor INTO thisTeacherRegisterId, thisAvailability;++				IF done THEN+					LEAVE locationLoop;+				ELSEIF thisAvailability & /* intersection */ NEW.`availability` THEN+					SET @msg	= CONCAT('teacherRegister: the specified "locationId" is taken by teacherRegisterId=', thisTeacherRegisterId, ' whose availability="', thisAvailability, '" intersects.');	-- CAVEAT: for security, don't print the `locationId` which may contain arbitrary text.++					SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='locationId', MESSAGE_TEXT=@msg;+				END IF;+			END LOOP locationLoop;++			CLOSE locationCursor;+		END IF;+	END+//+CREATE TRIGGER `teacherRegister.beforeUpdate` BEFORE UPDATE ON `tbl_teacherRegister`+	FOR EACH ROW /* updated */+	BEGIN+		DECLARE thisTeacherRegisterId	INT UNSIGNED;+		DECLARE thisAvailability	SET('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');+		DECLARE done			BOOL	DEFAULT FALSE;+		DECLARE locationCursor		CURSOR FOR SELECT `teacherRegisterId`, `availability` FROM `tbl_teacherRegister` WHERE `projectId` = NEW.`projectId` AND `locationId` <=> NEW.`locationId` /* CAVEAT: both could be NULL */;++		DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;++		SET @tableName	= 'tbl_teacherRegister';++		IF NEW.`teacherId` = '' THEN+			SET @msg	= CONCAT('teacherRegister: anonymous "teacherId"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='teacherId', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`availability` = '' THEN+			SET @msg	= CONCAT('teacherRegister: insufficient "availability"; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF EXISTS (+			SELECT 1 FROM `tbl_groupCatalogue` NATURAL JOIN `tbl_meetingTime` /* USING (`groupCatalogueId`) */ WHERE `projectId` = NEW.`projectId` AND `groupId` IN (+				SELECT `groupId` FROM `tbl_teacherGroupMembership` WHERE `teacherRegisterId` = NEW.`teacherRegisterId`+			) AND `mandatesAttendance` <=> TRUE AND FIND_IN_SET(day, NEW.`availability`) = 0 /* unavailable */+		) THEN+			SET @msg	= CONCAT('teacherRegister: some groups of which the specified "teacherId" is a member, mandate attendance when they\'re unavailable; where projectId=', NEW.`projectId`, '.');	-- CAVEAT: for security, don't print the `teacherId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='availability', MESSAGE_TEXT=@msg;+		ELSEIF NOT inClosedUnitInterval(NEW.`maximumTeachingRatio`) THEN+			SET @msg	= CONCAT('teacherRegister: maximumTeachingRatio=', NEW.`maximumTeachingRatio`, ' is not in the closed unit-interval; where projectId=', NEW.`projectId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='maximumTeachingRatio', MESSAGE_TEXT=@msg;+		ELSE+			IF NEW.`locationId` IS NOT NULL AND (+				NEW.`projectId` <> OLD.`projectId` OR NEW.`availability` <> OLD.`availability` OR NEW.`locationId` <=> OLD.`locationId`+			) THEN+				OPEN locationCursor;++				locationLoop: LOOP+					FETCH locationCursor INTO thisTeacherRegisterId, thisAvailability;++					IF done THEN+						LEAVE locationLoop;+					ELSEIF thisTeacherRegisterId <> OLD.`teacherRegisterId` AND thisAvailability & /* intersection */ NEW.`availability` THEN+						SET @msg	= CONCAT('teacherRegister: the specified "locationId" is taken by teacherRegisterId=', thisTeacherRegisterId, ' whose availability="', thisAvailability, '" intersects.');	-- CAVEAT: for security, don't print the `locationId` which may contain arbitrary text.++						SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='locationId', MESSAGE_TEXT=@msg;+					END IF;+				END LOOP locationLoop;++				CLOSE locationCursor;+			END IF;+		END IF;+	END+//+CREATE TRIGGER `teacherRegister.afterUpdate` AFTER UPDATE ON `tbl_teacherRegister`+	FOR EACH ROW /* updated */+	BEGIN+		IF NEW.`projectId` <> OLD.`projectId` /* the old teacher has effectively been deleted */ THEN+			CALL deleteKnowledgeRequirementsLackingCourse(OLD.`projectId`);+		END IF;+	END+//+CREATE TRIGGER `teacherGroupMembership.beforeInsert` BEFORE INSERT ON `tbl_teacherGroupMembership`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_teacherGroupMembership';++		SELECT `projectId`, `availability` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @projectId, @availability;++		IF NOT groupIdByTeacherRegisterIdExists(NEW.`teacherRegisterId`, NEW.`groupId`) THEN+			SET @msg	= CONCAT('teacherGroupMembership: the specified "groupId" doesn\'t exist; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');	-- CAVEAT: for security, don't print the `groupId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NOT isAvailableGroupForAllMandatoryMeetings(@projectId, NEW.`groupId`, @availability) THEN+			SET @msg	= CONCAT('teacherGroupMembership: some groups of which teacherRegisterId=', NEW.`teacherRegisterId`, ' is a member, mandate attendance when they\'re unavailable; where projectId=', @projectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `teacherGroupMembership.beforeUpdate` BEFORE UPDATE ON `tbl_teacherGroupMembership`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_teacherGroupMembership';++		SELECT `projectId`, `availability` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @projectId, @availability;++		IF NOT groupIdByTeacherRegisterIdExists(NEW.`teacherRegisterId`, NEW.`groupId`) THEN+			SET @msg	= CONCAT('teacherGroupMembership: the specified "groupId" doesn\'t exist; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');	-- CAVEAT: for security, don't print the `groupId` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NOT isAvailableGroupForAllMandatoryMeetings(@projectId, NEW.`groupId`, @availability) THEN+			SET @msg	= CONCAT('teacherGroupMembership: some groups of which teacherRegisterId=', NEW.`teacherRegisterId`, ' is a member, mandate attendance when they\'re unavailable; where projectId=', @projectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `service.beforeDelete` BEFORE DELETE ON `tbl_service`+	FOR EACH ROW /* deleted */+	BEGIN+		CALL deleteMatchingRequiredFacilities(OLD.`teacherRegisterId`, OLD.`topic`, OLD.`level`);+		CALL deleteSpecificTimeRequests(OLD.`teacherRegisterId`, OLD.`topic`, OLD.`level`);+	END+//+CREATE TRIGGER `service.afterDelete` AFTER DELETE ON `tbl_service`+	FOR EACH ROW /* deleted */+	BEGIN+		SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = OLD.`teacherRegisterId` INTO @oldProjectId;+/*+	If one attempts to sequentially determine whether each knowledge-requirement lacks a teacher, BEFORE any of the courses in the request are deleted,+	then one may find that each is still offered by the other moribund courses in the request.+*/+		CALL deleteKnowledgeRequirements(@oldProjectId, OLD.`topic`, OLD.`level`);+	END+//+CREATE TRIGGER `service.beforeInsert` BEFORE INSERT ON `tbl_service`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_service';++		SELECT `min`, `max` FROM `tbl_teacherRegister` NATURAL JOIN `tbl_timeslotIdBounds` /* USING (`projectId`) */ WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @min, @max;++		SET @timeslotsPerDay	= 1 + @max - @min;++		IF NEW.`minimumConsecutiveLessons` > NEW.`requiredLessonsPerWeek` THEN+			SET @msg	= CONCAT('service: minimumConsecutiveLessons=', NEW.`minimumConsecutiveLessons`, ' exceeds requiredLessonsPerWeek=', NEW.`requiredLessonsPerWeek`, '; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`minimumConsecutiveLessons` = 0 THEN+			SET @msg	= CONCAT('service: "minimumConsecutiveLessons" must exceed zero; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='minimumConsecutiveLessons', MESSAGE_TEXT=@msg;+		ELSEIF @max IS NULL THEN+			SET @msg	= CONCAT('service: first one must populate the timeslot-id bounds for projectId=', (SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = NEW.`teacherRegisterId`), '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`minimumConsecutiveLessons` > @timeslotsPerDay THEN+			SET @msg	= CONCAT('service: minimumConsecutiveLessons=', NEW.`minimumConsecutiveLessons`, ' exceeds time-slots/day=', @timeslotsPerDay, '; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='minimumConsecutiveLessons', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`maximumClassSize` <=> 0 THEN+			SET @msg	= CONCAT('service: "maximumClassSize" must exceed zero; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='maximumClassSize', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`idealTimeslotRequest` IS NOT NULL AND NEW.`idealTimeslotRequest` NOT BETWEEN @min AND @max THEN+			SET @msg	= CONCAT('service: idealTimeslotRequest=', NEW.`idealTimeslotRequest`, ' is not in the closed interval [', @min, ', ', @max, ']; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='idealTimeslotRequest', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `service.beforeUpdate` BEFORE UPDATE ON `tbl_service`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_service';++		SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = OLD.`teacherRegisterId` INTO @oldProjectId;+		SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @newProjectId;+		SELECT `min`, `max` FROM `tbl_teacherRegister` NATURAL JOIN `tbl_timeslotIdBounds` /* USING (`projectId`) */ WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @min, @max;++		SET @timeslotsPerDay	= 1 + @max - @min;++		IF NEW.`minimumConsecutiveLessons` > NEW.`requiredLessonsPerWeek` THEN+			SET @msg	= CONCAT('service: minimumConsecutiveLessons=', NEW.`minimumConsecutiveLessons`, ' exceeds requiredLessonsPerWeek=', NEW.`requiredLessonsPerWeek`, '; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`minimumConsecutiveLessons` = 0 THEN+			SET @msg	= CONCAT('service: "minimumConsecutiveLessons" must exceed zero; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='minimumConsecutiveLessons', MESSAGE_TEXT=@msg;+		ELSEIF @max IS NULL THEN+			SET @msg	= CONCAT('service: first one must populate the timeslot-id bounds for projectId=', @newProjectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`minimumConsecutiveLessons` > @timeslotsPerDay THEN+			SET @msg	= CONCAT('service: minimumConsecutiveLessons=', NEW.`minimumConsecutiveLessons`, ' exceeds time-slots/day=', @timeslotsPerDay, '; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='minimumConsecutiveLessons', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`maximumClassSize` <=> 0 THEN+			SET @msg	= CONCAT('service: "maximumClassSize" must exceed zero; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='maximumClassSize', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`idealTimeslotRequest` IS NOT NULL AND NEW.`idealTimeslotRequest` NOT BETWEEN @min AND @max THEN+			SET @msg	= CONCAT('service: idealTimeslotRequest=', NEW.`idealTimeslotRequest`, ' is not in the closed interval [', @min, ', ', @max, ']; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='idealTimeslotRequest', MESSAGE_TEXT=@msg;+		ELSEIF NEW.`teacherRegisterId` <> OLD.`teacherRegisterId` OR NEW.`topic` <> OLD.`topic` OR NEW.`level` <> OLD.`level` THEN	-- The course has effectively been deleted.+			CALL deleteMatchingRequiredFacilities(OLD.`teacherRegisterId`, OLD.`topic`, OLD.`level`);+			CALL deleteSpecificTimeRequests(OLD.`teacherRegisterId`, OLD.`topic`, OLD.`level`);+		END IF;+	END+//+CREATE TRIGGER `service.afterUpdate` AFTER UPDATE ON `tbl_service`+	FOR EACH ROW /* updated */+	BEGIN+		SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = OLD.`teacherRegisterId` INTO @oldProjectId;++		IF @newProjectId <> @oldProjectId OR NEW.`topic` <> OLD.`topic` OR NEW.`level` <> OLD.`level` THEN	-- The course has effectively been deleted from this teacher's service.+/*+	If one attempts to sequentially determine whether each knowledge-requirement lacks a teacher, BEFORE any of the courses in the request are updated,+	then one may find that each is still offered by the other courses in the request.+*/+			CALL deleteKnowledgeRequirements(@oldProjectId, OLD.`topic`, OLD.`level`);+		END IF;+	END+//+CREATE TRIGGER `specificTimeRequest.beforeInsert` BEFORE INSERT ON `tbl_specificTimeRequest`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_specificTimeRequest';++		SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @newProjectId;+		SELECT `min`, `max` FROM `tbl_timeslotIdBounds` WHERE `projectId` = @newProjectId INTO @min, @max;++		IF @max IS NULL THEN+			SET @msg	= CONCAT('specificTimeRequest: first one must populate the timeslot-id bounds for projectId=', @newProjectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`timeslotId` NOT BETWEEN @min AND @max THEN+			SET @msg	= CONCAT('specificTimeRequest: timeslotId=', NEW.`timeslotId`, ' is not in the closed interval [', @min, ', ', @max, ']; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='timeslotId', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `specificTimeRequest.beforeUpdate` BEFORE UPDATE ON `tbl_specificTimeRequest`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_specificTimeRequest';++		SELECT `projectId` FROM `tbl_teacherRegister` WHERE `teacherRegisterId` = NEW.`teacherRegisterId` INTO @newProjectId;+		SELECT `min`, `max` FROM `tbl_timeslotIdBounds` WHERE `projectId` = @newProjectId INTO @min, @max;++		IF @max IS NULL THEN+			SET @msg	= CONCAT('specificTimeRequest: first one must populate the timeslot-id bounds for projectId=', @newProjectId, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NEW.`timeslotId` NOT BETWEEN @min AND @max THEN+			SET @msg	= CONCAT('specificTimeRequest: timeslotId=', NEW.`timeslotId`, ' is not in the closed interval [', @min, ', ', @max, ']; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, COLUMN_NAME='timeslotId', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `requiredFacility.beforeInsert` BEFORE INSERT ON `tbl_requiredFacility`+	FOR EACH ROW /* inserted */+	BEGIN+		SET @tableName	= 'tbl_requiredFacility';++		IF NOT areTeacherAndFacilityTypeInSameProject(NEW.`teacherRegisterId`, NEW.`facilityTypeId`) THEN+			SET @msg	= CONCAT('requiredFacility: teacherRegisterId=', NEW.`teacherRegisterId` ,' is not in the same project as facilityTypeId=', NEW.`facilityTypeId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NOT isAvailableFacility(NEW.`teacherRegisterId`, NEW.`facilityTypeId`) THEN+			SET @msg	= CONCAT('requiredFacility: zero locations offer facilityTypeId=', NEW.facilityTypeId ,'; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `requiredFacility.beforeUpdate` BEFORE UPDATE ON `tbl_requiredFacility`+	FOR EACH ROW /* updated */+	BEGIN+		SET @tableName	= 'tbl_requiredFacility';++		IF NOT areTeacherAndFacilityTypeInSameProject(NEW.`teacherRegisterId`, NEW.`facilityTypeId`) THEN+			SET @msg	= CONCAT('requiredFacility: teacherRegisterId=', NEW.`teacherRegisterId` ,' is not in the same project as facilityTypeId=', NEW.`facilityTypeId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		ELSEIF NOT isAvailableFacility(NEW.`teacherRegisterId`, NEW.`facilityTypeId`) THEN+			SET @msg	= CONCAT('requiredFacility: zero locations offer facilityTypeId=', NEW.facilityTypeId ,'; where teacherRegisterId=', NEW.`teacherRegisterId`, '.');++			SIGNAL SQLSTATE '45000' SET TABLE_NAME=@tableName, MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `knowledgeRequirement.beforeInsert` BEFORE INSERT ON `tbl_knowledgeRequirement`+	FOR EACH ROW /* inserted */+	BEGIN+		SELECT `projectId` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId` INTO @projectId;++		IF matchingCourseExists(@projectId, NEW.`topic`, NEW.`level`) = 0 THEN+			SET @msg	= CONCAT('knowledgeRequirement: zero services match both the specified "topic" & "level"; where projectId=', @projectId, '.');	-- CAVEAT: for security, don't print either the `topic` or the `level` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_knowledgeRequirement', MESSAGE_TEXT=@msg;+		END IF;+	END+//+CREATE TRIGGER `knowledgeRequirement.beforeUpdate` BEFORE UPDATE ON `tbl_knowledgeRequirement`+	FOR EACH ROW /* updated */+	BEGIN+		SELECT `projectId` FROM `tbl_studentBodyRegister` WHERE `studentBodyRegisterId` = NEW.`studentBodyRegisterId` INTO @projectId;++		IF matchingCourseExists(@projectId, NEW.`topic`, NEW.`level`) = 0 THEN+			SET @msg	= CONCAT('knowledgeRequirement: zero services match both the specified "topic" & "level"; where projectId=', @projectId, '.');	-- CAVEAT: for security, don't print either the `topic` or the `level` which may contain arbitrary text.++			SIGNAL SQLSTATE '45000' SET TABLE_NAME='tbl_knowledgeRequirement', MESSAGE_TEXT=@msg;+		END IF;+	END+//+DELIMITER ;+
+ src-exe/Main.hs view
@@ -0,0 +1,1127 @@+{-# LANGUAGE CPP #-}+#ifdef MIN_TOOL_VERSION_ghc	/* CAVEAT: early versions of Cabal don't define this */+#if MIN_TOOL_VERSION_ghc(8,0,1)+{-# OPTIONS_GHC -freduction-depth=22 #-}+#endif+#else+{-# OPTIONS_GHC -fcontext-stack=22 #-}+#endif+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Reads the configuration, either from the specified local XML file, or from the specified database on the referenced DBMS.++	* Override this, by parsing the remainder of the command-line arguments, to determine transient configuration.++	* Attempts to solves the configured problem.++	* Present the results in each of the specified output file-formats.++	* <https://en.wikipedia.org/wiki/School_timetable>.+-}++module Main(main) where++import			Control.Arrow((***), (&&&))+import			Control.Category((>>>))+import qualified	Control.Arrow+import qualified	Control.Exception+import qualified	Control.Monad+import qualified	Control.Monad.Writer	-- The lazy instance.+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Data.Time.Clock+import qualified	Data.Version+import qualified	Distribution.Verbosity+import qualified	Factory.Data.Interval+import qualified	Paths_weekdaze								as Paths	-- Either local stub, or package-instance autogenerated by 'Setup build'.+import qualified	System.Console.GetOpt							as G+import qualified	System.Directory+import qualified	System.Environment+import qualified	System.Exit+import qualified	System.FilePath+import			System.FilePath((</>), (<.>))+import qualified	System.IO+import qualified	System.Info+import qualified	System.Random+import qualified	Text.Printf+import qualified	Text.XML.HXT.Core							as HXT+import qualified	ToolShed.Data.List+import qualified	ToolShed.SelfValidate+import qualified	ToolShed.System.File+import qualified	WeekDaze.Aggregate.StudentBody						as Aggregate.StudentBody+import qualified	WeekDaze.Configuration							as Configuration+import qualified	WeekDaze.Data.Group							as Data.Group+import qualified	WeekDaze.Data.Subject							as Data.Subject+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities				as Dynamic.StudentViewTimetableUtilities+-- import		WeekDaze.Enhanced.EnhancedDouble()	-- Required when some of the 'Rational' types below are replaced by 'Double'.+import			WeekDaze.Enhanced.EnhancedRatio()+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies			as ExecutionConfiguration.EvolutionStrategies+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions			as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights		as ExecutionConfiguration.OptimiseLessonCriteriaWeights+import qualified	WeekDaze.Identifiers.Campus						as Identifiers.Campus+import qualified	WeekDaze.Identifiers.Level						as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId						as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.Stream						as Identifiers.Stream+import qualified	WeekDaze.Identifiers.SynchronisationId					as Identifiers.SynchronisationId+import qualified	WeekDaze.Identifiers.TeacherId						as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId						as Identifiers.TimeslotId+import qualified	WeekDaze.Implementation.EvolutionaryAlgorithm				as Implementation.EvolutionaryAlgorithm+import qualified	WeekDaze.Implementation.TimetableFitness				as Implementation.TimetableFitness+import qualified	WeekDaze.Input.CommandLineOption					as Input.CommandLineOption+import qualified	WeekDaze.Input.ConfigVersion						as Input.ConfigVersion+import qualified	WeekDaze.Input.Options							as Input.Options+import qualified	WeekDaze.LocationView.LessonResourceIds					as LocationView.LessonResourceIds+import qualified	WeekDaze.LocationView.Timetable						as LocationView.Timetable+import qualified	WeekDaze.Model.Timetable						as Model.Timetable+import qualified	WeekDaze.OutputConfiguration.FileFormat					as OutputConfiguration.FileFormat+import qualified	WeekDaze.OutputConfiguration.Format					as OutputConfiguration.Format+import qualified	WeekDaze.OutputConfiguration.Options					as OutputConfiguration.Options+import qualified	WeekDaze.OutputConfiguration.Style					as OutputConfiguration.Style+import qualified	WeekDaze.OutputConfiguration.Verbosity					as OutputConfiguration.Verbosity+import qualified	WeekDaze.OutputConfiguration.View					as OutputConfiguration.View+import qualified	WeekDaze.OutputFormat.XHTMLFormat					as OutputFormat.XHTMLFormat+import qualified	WeekDaze.OutputFormat.XHTMLFormatLocationViewTimetable			as OutputFormat.XHTMLFormatLocationViewTimetable+import qualified	WeekDaze.OutputFormat.XHTMLFormatStudentViewTimetable			as OutputFormat.XHTMLFormatStudentViewTimetable+import qualified	WeekDaze.OutputFormat.XHTMLFormatTeacherViewTimetable			as OutputFormat.XHTMLFormatTeacherViewTimetable+import qualified	WeekDaze.OutputFormat.DeterministicStudentViewTimetableSelection	as OutputFormat.DeterministicStudentViewTimetableSelection+import qualified	WeekDaze.OutputFormat.EvolutionStrategyStatistics			as OutputFormat.EvolutionStrategyStatistics+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis				as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters				as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.LessonResourceIds					as StudentView.LessonResourceIds+import qualified	WeekDaze.TeacherView.LessonResourceIds					as TeacherView.LessonResourceIds+import qualified	WeekDaze.TeacherView.Timetable						as TeacherView.Timetable+import qualified	WeekDaze.Text.CSS							as Text.CSS++#ifdef TOOL_VERSION_ghc+import qualified	GHC.Conc+#endif++#ifdef USE_HDBC+import qualified	Crypto.Hash+import qualified	Database.HDBC+import qualified	Data.Byteable+import qualified	Data.ByteString+import qualified	Data.ByteString.Char8+import qualified	WeekDaze.Database.Selector						as Database.Selector+#ifdef USE_HDBC_ODBC+import qualified	Database.HDBC.ODBC+import qualified	WeekDaze.Database.ODBC							as Database.ODBC+#endif+#ifdef USE_HDBC_MYSQL+import qualified	WeekDaze.Database.MySQL							as Database.MySQL+#endif+#endif /* USE_HDBC */++#ifdef USE_UNIX+import qualified	WeekDaze.SignalHandlers							as SignalHandlers+#endif++-- | Define a concrete type for the value of a criterion.+type CriterionValue		= Rational	-- CAVEAT: avoid arithmetic on bounded rationals, which can easily overflow.++-- | Define a concrete type for the weighting applied to criteria, used to bias their significance in the selection of /lesson/s or /timetable/s.+type CriterionWeight		= CriterionValue	-- There's no obvious reason for it to differ from this.++-- | Define a concrete type for the factor by which the fecundity of the breeding-program is amended, when the diversity of the population of candidates falls beneath the minimum acceptable.+type FecundityDecayRatio	= Rational	-- CAVEAT: avoid arithmetic on bounded rationals, which can easily overflow.++-- | Define a concrete type for the diversity-ratio in the population of candidates.+type PopulationDiversityRatio	= FecundityDecayRatio	-- There's no obvious reason for it to differ from this.++{- |+	* The concrete type used for IO of Fractional values.++	* This allows one to read 'Rational' values from the command-line, into this intermediate type, before conversion to the correct internal type,+-}+type FractionalIOFormat		= Double++-- | Define a concrete type for the ratio of a /teacher/'s working-week which is actually devoted to teaching.+type TeachingRatio		= Rational	-- CAVEAT: avoid arithmetic on bounded rationals, which can easily overflow.++-- | Define a concrete type for the weighted mean of; the criteria by which /lesson/s or /timetable/s, are selected.+type WeightedMean		= CriterionWeight	-- There's no obvious reason for it to differ from this.++-- | Define a concrete type for the mean of the values of /lesson-criteria/.+type Mean			= CriterionValue	-- There's no obvious reason for it to differ from this.++-- | Define a concrete type for the standard deviation of the criteria by which /lesson/s, are selected.+type StandardDeviation		= Double	-- There's little choice, since it must implement 'Floating'.++-- | Define a concrete instance of the underlying polymorphic type.+type ProblemParameters		= ProblemConfiguration.ProblemParameters.ProblemParameters Identifiers.Campus.Campus Identifiers.Level.Level Identifiers.LocationId.LocationId Identifiers.Stream.Stream Identifiers.SynchronisationId.SynchronisationId Identifiers.TeacherId.TeacherId TeachingRatio Identifiers.TimeslotId.TimeslotId++-- | Define a concrete instance of the underlying polymorphic type.+type ExecutionOptions		= ExecutionConfiguration.ExecutionOptions.ExecutionOptions CriterionWeight FecundityDecayRatio PopulationDiversityRatio++-- | Define a concrete type for the minimum acceptable contrast-ratio between the automatically generated foreground & complementary background-colours.+type MinimumContrastRatio	= Rational++-- | Define a concrete instance of the underlying polymorphic type.+type Options			= Input.Options.Options Identifiers.Campus.Campus CriterionWeight FecundityDecayRatio Identifiers.Level.Level Identifiers.LocationId.LocationId MinimumContrastRatio PopulationDiversityRatio Identifiers.Stream.Stream Identifiers.SynchronisationId.SynchronisationId Identifiers.TeacherId.TeacherId TeachingRatio Identifiers.TimeslotId.TimeslotId++-- | Define a concrete instance of the underlying polymorphic type.+type ProblemAnalysis		= ProblemConfiguration.ProblemAnalysis.ProblemAnalysis Identifiers.Level.Level Identifiers.LocationId.LocationId Identifiers.SynchronisationId.SynchronisationId Identifiers.TeacherId.TeacherId Identifiers.TimeslotId.TimeslotId++-- | Express the specified file in XML, citing the referenced DTD (whether it exists or not), & write it to the file-system.+writeXMLToFile+	:: HXT.XmlPickler a+	=> System.FilePath.FilePath+	-> String+	-> System.FilePath.FilePath+	-> a	-- ^ The pickleable.+	-> IO ()+writeXMLToFile destinationFilePath rootElementTag dtdFilePath x = do+--	System.IO.hPutStrLn System.IO.stderr . showString "INFO:\twriting " . showString rootElementTag . showString "-configuration to file=" $ shows destinationFilePath "."++	System.IO.withFile destinationFilePath System.IO.WriteMode (+		`System.IO.hPutStrLn` (+			showString "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE " . showString rootElementTag . showString " SYSTEM " . shows dtdFilePath $ showString ">\n" (+				HXT.showPickled [+					HXT.withIndent HXT.yes	-- CAVEAT: corresponding input-option 'HXT.withRemoveWS' may subsequently be required.+				] x+			)+		)+	 ) -- Section.++{- |+	* Defines the permissible command-line arguments.++	* Parses the XML configuration-file, to determine the persistent configuration.++	* Override this, by parsing the command-line arguments, to determine transient configuration.++	* Solve the resulting problem.++	* Present the results in each of the specified output file-formats.+-}+main :: IO ()+main	= do+-- Inspect the environment.+	startUTCTime	<- Data.Time.Clock.getCurrentTime+	progName	<- System.Environment.getProgName+	args		<- System.Environment.getArgs+	dataDir		<- fmap System.FilePath.normalise Paths.getDataDir	-- Defined using 'cabal configure --datadir="<dir>" --datasubdir="<dir>"'.+	appUserDataDir	<- System.Directory.getAppUserDataDirectory progName	-- CAVEAT: on Unix/Gnu-Linux, requires the '$HOME' environment-variable to have been defined.++	let+		packageIdentifier, author :: String+		packageIdentifier	= showString progName . showChar '-' $ showString (Input.ConfigVersion.toString $ Data.Version.versionBranch Paths.version) ""+		author			= "Dr. Alistair Ward"++		inputConfigFilePathFlag :: Input.CommandLineOption.Flag+		inputConfigFilePathFlag	= "inputConfigFilePath"+#ifdef USE_HDBC+#ifdef USE_HDBC_ODBC+		dsnFlag :: Input.CommandLineOption.Flag+		dsnFlag	= "dsn"++		defaultDSN :: String+		defaultDSN	= progName+#else+		_x :: [Input.CommandLineOption.Flag]+		_x@[dataServerHostFlag, dataServerPortFlag, dataServerUserIdFlag, dataServerPasswordFlag, databaseNameFlag]	= ["dataServerHost", "dataServerPort", "dataServerUserId", "dataServerPassword", "databaseName"]++		defaultDataServerUserId, defaultDatabaseName :: String+		defaultDataServerUserId	= "root"+		defaultDatabaseName	= progName+#endif+		_y :: [Input.CommandLineOption.Flag]+		_y@[databaseUserIdFlag, databasePasswordFlag, databaseProjectNameFlag]	= ["databaseUserId", "databasePassword", "databaseProjectName"]++		mandatoryDBFlags :: [Input.CommandLineOption.Flag]+		mandatoryDBFlags@[databaseUserIdFlag', databaseProjectNameFlag']	= map (showString Input.CommandLineOption.longFlagPrefix) [databaseUserIdFlag, databaseProjectNameFlag]+#endif /* USE_HDBC */+		odbcPackageName :: String+		odbcPackageName		= "HDBC-odbc"+		mySQLPackageName :: String+		mySQLPackageName	= "HDBC-mysql"+{-+	Define all permissible command-line options.+	This specification is fairly complicated:+		Each command-line option is categorised as one of:+			an "IO-action", which is subsequently sequenced with other IO-actions, before exiting;+			a "Config-location Parameter", which if specified, locates a file or database containing more options;+			an "Options-mutator", which if specified, defines a function used to transform 'Input.CommandLineOption.CommandLineOption'.++		Additionally, the command-line options are recorded as they're processed, to enable display of the command-line in the results;+		if one merely displays 'args', then security-sensitive details may be revealed, & it's difficult to find & remove such options, since the associated flag may be truncated to a minimum unique string.+-}+		optDescrList :: [+			G.OptDescr (+				Maybe (String {-flag-}, Maybe String {-optional value-}),	-- Record command-line specifications.+				Input.CommandLineOption.CommandLineOption Options		-- Defines the action to take on receipt of a command-line option.+			) -- Pair.+		 ]+		optDescrList	= [+			G.Option "?"	["help"] (+				G.NoArg (Nothing {-N/A-}, Input.CommandLineOption.mkIOAction printHelp)+			) $ showString infoString "print this help, & then exit.",+			G.Option "v"	["version"] (+				G.NoArg (Nothing {-N/A-}, Input.CommandLineOption.mkIOAction printVersion)+			) $ showString infoString "print version-information, & then exit.",+			G.Option "i"	[inputConfigFilePathFlag] (+				G.ReqArg (Just . (,) inputConfigFilePathFlag . Just &&& Input.CommandLineOption.mkConfigLocationParameter inputConfigFilePathFlag) $ mkTypeString filePathString+			) (+				showString inputString $ showString "define the path to an XML-file from which the configuration can be read"+#ifdef USE_HDBC+				. showString ", as an alternative to " $ shows mandatoryDBFlags+#endif+				"."+			),+#ifdef USE_HDBC+#ifdef USE_HDBC_ODBC+			G.Option ""	[dsnFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter dsnFlag) $ mkTypeString stringString+			) . showString inputString . showString "define the data-source name from which to read ODBC DBMS connection-parameters; default " $ shows defaultDSN ".",+#else+			G.Option ""	[dataServerHostFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter dataServerHostFlag) $ mkTypeString stringString+			) . showString inputString . showString "define the name or IP-address, of the host on which the RDBMS is running; default " $ shows Database.MySQL.defaultHost ".",+			G.Option ""	[dataServerPortFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter dataServerPortFlag) $ mkTypeString intString+			) . showString inputString . showString "define the port on which the RDBMS is listening; default '" $ shows Database.MySQL.defaultPort "'.",+			G.Option ""	[dataServerUserIdFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter dataServerUserIdFlag) $ mkTypeString stringString+			) . showString inputString . showString "define the user-id with which to authenticate with the referenced RDBMS; default " $ shows defaultDataServerUserId ".",+			G.Option ""	[dataServerPasswordFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter dataServerPasswordFlag) $ mkTypeString stringString+			) . showString inputString . showString "define the password common to all users, required for authentication with the referenced RDBMS; cf. " $ shows databasePasswordFlag ".",+			G.Option ""	[databaseNameFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter databaseNameFlag) $ mkTypeString stringString+			) . showString inputString . showString "define the name of the database on the referenced RDBMS; default " $ shows defaultDatabaseName ".",+#endif+			G.Option ""	[databaseProjectNameFlag] (+				G.ReqArg (Just . (,) databaseProjectNameFlag . Just &&& Input.CommandLineOption.mkConfigLocationParameter databaseProjectNameFlag) $ mkTypeString stringString+			) $ showString inputString "define the name of the project in the database from which to read the configuration.",+			G.Option ""	[databaseUserIdFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter databaseUserIdFlag) $ mkTypeString stringString+			) $ showString inputString "used to identify a user's configuration amongst all those in the database; typically one's email-address, since this is naturally unique.",+			G.Option ""	[databasePasswordFlag] (+				G.ReqArg ((,) Nothing {-security-sensitive-} . Input.CommandLineOption.mkConfigLocationParameter databasePasswordFlag) $ mkTypeString stringString+			) $ showString inputString "define the password required to grant access to the user's personal configuration in the database.",+#endif /* USE_HDBC */+			G.Option ""	[ExecutionConfiguration.EvolutionStrategies.fecundityDecayRatioTag] (+				G.ReqArg (Just . (,) ExecutionConfiguration.EvolutionStrategies.fecundityDecayRatioTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setFecundityDecayRatio) $ mkTypeString floatString+			) . showString executionString $ "define the factor (in the closed unit-interval) by which the fecundity of the breeding-program for future generations, is multiplied (& thus reduced), when the population-diversity ratio falls beneath " ++ show ExecutionConfiguration.EvolutionStrategies.minimumPopulationDiversityRatioTag ++ "; default '" ++ Text.Printf.printf "%.*f" defaultNDecimalDigits (+				ExecutionConfiguration.EvolutionStrategies.getFecundityDecayRatio defaultEvolutionStrategies+			) ++ "'.",+			G.Option ""	[ExecutionConfiguration.ExecutionOptions.inputStudentViewTimetableTag] (+				G.ReqArg (Just . (,) ExecutionConfiguration.ExecutionOptions.inputStudentViewTimetableTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setInputStudentViewTimetableFilePath) $ mkTypeString filePathString+			) $ showString executionString "define the path to a file, from which an initial timetable (viewed from the perspective of student-bodies, & formatted in XML), can be read.",+			G.Option ""	[ExecutionConfiguration.EvolutionStrategies.minimumPopulationDiversityRatioTag] (+				G.ReqArg (Just . (,) ExecutionConfiguration.EvolutionStrategies.minimumPopulationDiversityRatioTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setMinimumPopulationDiversityRatio) $ mkTypeString floatString+			) . showString executionString $ "define the population-diversity ratio (in the closed unit-interval), beneath which a reduction in the fecundity of the breeding-program for future generations, by a factor of " ++ show ExecutionConfiguration.EvolutionStrategies.fecundityDecayRatioTag ++ ", is triggered; default '" ++ Text.Printf.printf "%.*f" defaultNDecimalDigits (+				ExecutionConfiguration.EvolutionStrategies.getMinimumPopulationDiversityRatio defaultEvolutionStrategies+			) ++ "'.",+			G.Option ""	[ExecutionConfiguration.EvolutionStrategies.nInitialScoutsTag] (+				G.OptArg (Just . (,) ExecutionConfiguration.EvolutionStrategies.nInitialScoutsTag &&& Input.CommandLineOption.mkOptionsMutator . setNInitialScouts) $ mkTypeString intString+			) $ showString executionString "define the initial number of candidates to select from each generation in the evolution of the timetable; if the argument is unspecified then the number of scouts varies depending on the quality of the candidates; which is also the default.",+			G.Option ""	[ExecutionConfiguration.OptimiseLessonCriteriaWeights.tag] (+				G.ReqArg (Just . (,) ExecutionConfiguration.OptimiseLessonCriteriaWeights.tag . Just &&& Input.CommandLineOption.mkOptionsMutator . setOptimiseLessonCriteriaWeights) "<Quadruple>"+			) . showString executionString $ "optimise the weights of lesson-criteria, using the weighted mean over timetable-criteria, over all specified raster-scans of the initial deterministic timetable; default '" ++ show (+				let+					defaultOptimiseLessonCriteriaWeights	= ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights defaultExecutionOptions+				in ExecutionConfiguration.OptimiseLessonCriteriaWeights.mkOptimiseLessonCriteriaWeights (+					ExecutionConfiguration.OptimiseLessonCriteriaWeights.getNTrials defaultOptimiseLessonCriteriaWeights+				) (+					realToFrac $ ExecutionConfiguration.OptimiseLessonCriteriaWeights.getChangeMagnitude defaultOptimiseLessonCriteriaWeights	:: FractionalIOFormat+				) (+					realToFrac $ ExecutionConfiguration.OptimiseLessonCriteriaWeights.getReductionFactor defaultOptimiseLessonCriteriaWeights+				) (+					ExecutionConfiguration.OptimiseLessonCriteriaWeights.getUseMeanOverRasterScans defaultOptimiseLessonCriteriaWeights+				)+			) ++ "'.",+			G.Option ""	[ExecutionConfiguration.ExecutionOptions.permitTemporaryStudentBodyMergerTag] (+				G.OptArg (Just . (,) ExecutionConfiguration.ExecutionOptions.permitTemporaryStudentBodyMergerTag &&& Input.CommandLineOption.mkOptionsMutator . setPermitTemporaryStudentBodyMerger) $ mkTypeString boolString+			) . showString executionString . showString "permit a temporary merger between student-bodies, to permit a teacher & location to be shared for the duration of a course; default '" $ shows (+				ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger defaultExecutionOptions+			) "'. If the argument is unspecified, then 'True' will be inferred.",+			G.Option "r"	[ExecutionConfiguration.ExecutionOptions.randomSeedTag] (+				G.OptArg (Just . (,) ExecutionConfiguration.ExecutionOptions.randomSeedTag &&& Input.CommandLineOption.mkOptionsMutator . setRandomSeed) $ mkTypeString intString+			) . showString executionString . showString "seed the pseudo-random number-generator with the specified integer, to produce a repeatable sequence; if this option is unspecified then the seed is unpredictable, but if only its argument is unspecified then the seed defaults to '" $ shows defaultRandomSeed "'.",+			G.Option ""	[ExecutionConfiguration.ExecutionOptions.reduceStudentBodyRegisterTag] (+				G.OptArg (Just . (,) ExecutionConfiguration.ExecutionOptions.reduceStudentBodyRegisterTag &&& Input.CommandLineOption.mkOptionsMutator . setReduceStudentBodyRegister) $ mkTypeString boolString+			) . showString executionString . showString "permit a permanent merger between student-bodies with identical profiles, to reduce the number of independently schedulable entities; default '" $ shows (+				ExecutionConfiguration.ExecutionOptions.getReduceStudentBodyRegister defaultExecutionOptions+			) "'. If the argument is unspecified, then 'True' will be inferred.",+			G.Option ""	[ExecutionConfiguration.ExecutionOptions.removeRedundantCoursesTag] (+				G.OptArg (Just . (,) ExecutionConfiguration.ExecutionOptions.removeRedundantCoursesTag &&& Input.CommandLineOption.mkOptionsMutator . setRemoveRedundantCourses) $ mkTypeString boolString+			) . showString executionString . showString "define whether to automatically remove any courses which aren't required by any student-body; default '" $ shows (+				ExecutionConfiguration.ExecutionOptions.getRemoveRedundantCourses defaultExecutionOptions+			) "'. If the argument is unspecified, then 'True' will be inferred.",+			G.Option ""	[OutputConfiguration.Verbosity.tag] (+				G.ReqArg (Just . (,) OutputConfiguration.Verbosity.tag . Just &&& Input.CommandLineOption.mkOptionsMutator . setVerbosity) "<Verbosity>"+			) . showString outputString . showString "define the log-level; default '" $ shows (OutputConfiguration.Options.getVerbosity defaultOutputOptions) "'.",+			let+				tag :: String+				tag	= "displayRuntimeLog"+			in G.Option ""	[tag] (+				G.OptArg (Just . (,) tag &&& Input.CommandLineOption.mkOptionsMutator . setDisplayRuntimeInformation) $ mkTypeString boolString+			) . showString outputString . showString "requests that the runtime-log is rendered in all XHTML output-streams; default '" $ shows (OutputConfiguration.Style.getDisplayRuntimeInformation defaultStyle) "'. If the argument is unspecified, then 'True' will be inferred.",+			G.Option ""	[OutputConfiguration.Options.nDecimalDigitsTag] (+				G.ReqArg (Just . (,) OutputConfiguration.Options.nDecimalDigitsTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setNDecimalDigits) $ mkTypeString intString+			) . showString outputString . showString "define the precision with which fractional auxiliary data is displayed; default '" $ shows defaultNDecimalDigits "'.",+			G.Option ""	[OutputConfiguration.Options.outputConfigFilePathTag] (+				G.ReqArg (Just . (,) OutputConfiguration.Options.outputConfigFilePathTag . Just &&& Input.CommandLineOption.mkOptionsMutator . setOutputConfigFilePath) $ mkTypeString filePathString+			) $ showString outputString "define the path to a file into which the unprocessed configuration, formatted in XML, should be written.",+			let+				tag :: String+				tag	= "outputStudentViewTimetable"+			in G.Option ""	[tag] (+				G.ReqArg (Just . (,) tag . Just &&& Input.CommandLineOption.mkOptionsMutator . appendOutputStudentViewTimetableFilePath) $ mkTypeString filePathString+			) $ showString outputString "define the path to a file into which the resulting timetable (viewed from the perspective of student-bodies & formatted in XML), should be written.",+			G.Option ""	["printInputOptionsXMLDTD"] (+				G.NoArg (Nothing {-N/A-}, Input.CommandLineOption.mkIOAction printInputOptionsXMLDTD)+			) $ showString outputString "generate a rough Document Type Definition (DTD), defining the XML-format of the configuration-file, & then exit. CAVEAT: it must be manually amended to identify 'IMPLIED', 'ID', & 'IDREF' attributes.",+			G.Option ""	["printTimetableXMLDTD"] (+				G.ReqArg ((,) Nothing {-N/A-} . Input.CommandLineOption.mkIOAction . printTimetableXMLDTD) "<View>"+			) $ showString outputString "generate the Document Type Definition (DTD), defining the XML-format of the resulting timetable viewed from the specified perspective, & then exit."+		 ] where+			mkTypeString :: ShowS+			mkTypeString s	= showChar '<' $ showString s ">"++			boolString, floatString, intString, filePathString, executionString, infoString, inputString, outputString :: String+			boolString	= "Bool"+			floatString	= "Float"+			intString	= "Int"+			filePathString	= "File-path"+			executionString	= "Execution: "+			infoString	= "Info: "+			inputString	= "Input: "+			outputString	= "Output: "+#ifdef USE_HDBC+			stringString :: String+			stringString	= "String"+#endif+			defaultEvolutionStrategies	:: ExecutionConfiguration.EvolutionStrategies.EvolutionStrategies FractionalIOFormat FractionalIOFormat+			defaultExecutionOptions		:: ExecutionOptions+			defaultOutputOptions		:: OutputConfiguration.Options.Options MinimumContrastRatio+			defaultStyle			:: OutputConfiguration.Style.Style MinimumContrastRatio+			((defaultEvolutionStrategies, defaultExecutionOptions), (defaultOutputOptions, defaultStyle))	= Data.Default.def++			defaultRandomSeed :: ExecutionConfiguration.ExecutionOptions.RandomSeed+			defaultRandomSeed	= 0++			defaultNDecimalDigits :: OutputConfiguration.Options.NDecimalDigits+			defaultNDecimalDigits	= OutputConfiguration.Options.getNDecimalDigits defaultOutputOptions++-- Unary options-mutators.+			appendOutputStudentViewTimetableFilePath, setFecundityDecayRatio, setInputStudentViewTimetableFilePath, setMinimumPopulationDiversityRatio, setNDecimalDigits, setOptimiseLessonCriteriaWeights, setOutputConfigFilePath, setVerbosity :: String -> Options -> Options+			appendOutputStudentViewTimetableFilePath	= Input.Options.appendOutputStudentViewTimetableFilePath+			setFecundityDecayRatio				= Input.Options.setFecundityDecayRatio . realToFrac . (Input.CommandLineOption.readArg :: String -> FractionalIOFormat)+			setInputStudentViewTimetableFilePath		= Input.Options.setInputStudentViewTimetableFilePath	-- CAVEAT: this can over-ride a specific raster-scan.+			setMinimumPopulationDiversityRatio		= Input.Options.setMinimumPopulationDiversityRatio . realToFrac . (Input.CommandLineOption.readArg :: String -> FractionalIOFormat)+			setNDecimalDigits				= Input.Options.setNDecimalDigits . Input.CommandLineOption.readBoundedIntegral+			setOptimiseLessonCriteriaWeights		= Input.Options.setOptimiseLessonCriteriaWeights . (+				\optimiseLessonCriteriaWeights -> ExecutionConfiguration.OptimiseLessonCriteriaWeights.mkOptimiseLessonCriteriaWeights (+					ExecutionConfiguration.OptimiseLessonCriteriaWeights.getNTrials optimiseLessonCriteriaWeights+				) (+					realToFrac (ExecutionConfiguration.OptimiseLessonCriteriaWeights.getChangeMagnitude optimiseLessonCriteriaWeights :: FractionalIOFormat)+				) (+					realToFrac (ExecutionConfiguration.OptimiseLessonCriteriaWeights.getReductionFactor optimiseLessonCriteriaWeights :: FractionalIOFormat)+				) (+					ExecutionConfiguration.OptimiseLessonCriteriaWeights.getUseMeanOverRasterScans optimiseLessonCriteriaWeights+				)+			 ) . Input.CommandLineOption.readArg+			setOutputConfigFilePath				= Input.Options.setMaybeOutputConfigFilePath . Just+			setVerbosity					= Input.Options.setVerbosity . Input.CommandLineOption.readArg++			setDisplayRuntimeInformation, setNInitialScouts, setPermitTemporaryStudentBodyMerger, setRandomSeed, setReduceStudentBodyRegister, setRemoveRedundantCourses :: Maybe String -> Options -> Options+			setDisplayRuntimeInformation		= Input.Options.setDisplayRuntimeInformation . Data.Maybe.maybe True {-default-} Input.CommandLineOption.readArg+			setNInitialScouts			= Input.Options.setMaybeNInitialScouts . fmap Input.CommandLineOption.readBoundedIntegral+			setPermitTemporaryStudentBodyMerger	= Input.Options.setPermitTemporaryStudentBodyMerger . Data.Maybe.maybe True {-default-} Input.CommandLineOption.readArg+			setRandomSeed				= Input.Options.setMaybeRandomSeed . Just . Data.Maybe.maybe defaultRandomSeed Input.CommandLineOption.readBoundedIntegral+			setReduceStudentBodyRegister		= Input.Options.setReduceStudentBodyRegister . Data.Maybe.maybe True {-default-} Input.CommandLineOption.readArg+			setRemoveRedundantCourses		= Input.Options.setRemoveRedundantCourses . Data.Maybe.maybe True {-default-} Input.CommandLineOption.readArg++-- Nullary I/O-actions.+			printHelp, printVersion, printInputOptionsXMLDTD :: IO ()+			printHelp	= Control.Monad.void $ Text.Printf.printf "Usage:\t%s\nEBNF argument-format:\n\t%-9s = %-40s%s;\n\t%-9s = %s;\n\t%-9s = %s;\n\t%-9s = %s;\n\t%-9s = %s;\n\t%-9s = %-40s%s;\n\t%-9s = %-40s%s;\n" (+				G.usageInfo progName optDescrList+			 ) boolString (+				ToolShed.Data.List.showListWith listDelimiters [minBound :: Bool .. maxBound] ""+			 ) "(* Case-sensitive *)" filePathString (+				"File-name ('" ++ [System.FilePath.pathSeparator] ++ "' File-name)*"+			 ) floatString "Int ('.' Int)?" "Int" "[0-9]+" "Triple" "'(', Int, ',', Float, ',', Float, ')'" "Verbosity" (+				ToolShed.Data.List.showListWith listDelimiters OutputConfiguration.Verbosity.range ""+			 ) "(* Case-sensitive *)" "View" (+				ToolShed.Data.List.showListWith listDelimiters OutputConfiguration.View.range ""+			 ) "(* Case-sensitive *)" {-CAVEAT: requires increase to default context-stack-} where+				listDelimiters	= ('(', '|', ')')++			printVersion	= putStrLn (+				Data.List.intercalate "\n" [+					s | (True, s) <- [+						(+							True,	packageIdentifier+						), (+							True,+							showString "Compiled by " . shows (+								showString System.Info.compilerName . showChar '-' . Data.List.intercalate "." . map show $ Data.Version.versionBranch System.Info.compilerVersion+							) . showString ", with Cabal-flags " $ shows [+									showChar+#ifdef USE_HDBC_MYSQL+									'+'+#else+									'-'+#endif+									mySQLPackageName,+									showChar+#ifdef USE_HDBC_ODBC+									'+'+#else+									'-'+#endif+									odbcPackageName,+									showChar+#ifdef PRINT_DB_QUERIES+									'+'+#else+									'-'+#endif+									"printDBQueries",+									showChar+#ifdef PRINT_DB_ROWS+									'+'+#else+									'-'+#endif+									"printDBRows",+									showChar+#ifdef QUERY_DB_CONCURRENTLY+									'+'+#else+									'-'+#endif+									"queryDBConcurrently",+									showChar+#ifdef USE_UNIX+									'+'+#else+									'-'+#endif++									"unix"+							] "."+						), (+							True,	showString "Written by " $ shows author "."+						), (+							True,	showString "Copyright (C) 2013-2015 " $ showString author "."+						), (+							True,	"This program comes with ABSOLUTELY NO WARRANTY."+						), (+							False,	"This is free software, and you are welcome to redistribute it under certain conditions."	-- TODO: review.+						)+					]+				] -- List-comprehension.+			 ) >> System.Exit.exitSuccess++			outputSysConfig :: HXT.SysConfigList+			outputSysConfig	= [HXT.withTrace 0 {-valid values in range [0 .. 4]-}]++			printInputOptionsXMLDTD	= Control.Monad.void . HXT.runX $ HXT.constA (+				undefined :: Options+			 ) >>> HXT.xpickleWriteDTD HXT.xpickle outputSysConfig OutputConfiguration.FileFormat.stdoutProxy	-- CAVEAT: this DTD requires manual correction of defaulted attributes, which are erroneously defined as 'REQUIRED' rather than 'IMPLIED'.++-- Unary I/O-actions.+			printTimetableXMLDTD :: String -> IO ()+			printTimetableXMLDTD	= Control.Monad.void . HXT.runX . (+				\view -> case view of+					OutputConfiguration.View.LocationView	-> HXT.constA (+						undefined :: Model.Timetable.Wrapper Identifiers.LocationId.LocationId Identifiers.TimeslotId.TimeslotId (+							LocationView.LessonResourceIds.LessonResourceIds Identifiers.TeacherId.TeacherId+						) Identifiers.Level.Level+					 ) >>> HXT.xpickleWriteDTD HXT.xpickle outputSysConfig OutputConfiguration.FileFormat.stdoutProxy+					OutputConfiguration.View.StudentView	-> HXT.constA (+						undefined :: Model.Timetable.Wrapper Aggregate.StudentBody.StudentBody Identifiers.TimeslotId.TimeslotId (+							StudentView.LessonResourceIds.LessonResourceIds Identifiers.LocationId.LocationId Identifiers.TeacherId.TeacherId+						) Identifiers.Level.Level+					 ) >>> HXT.xpickleWriteDTD HXT.xpickle outputSysConfig OutputConfiguration.FileFormat.stdoutProxy+					OutputConfiguration.View.TeacherView	-> HXT.constA (+						undefined :: Model.Timetable.Wrapper Identifiers.TeacherId.TeacherId Identifiers.TimeslotId.TimeslotId (+							TeacherView.LessonResourceIds.LessonResourceIds Identifiers.LocationId.LocationId+						) Identifiers.Level.Level+					 ) >>> HXT.xpickleWriteDTD HXT.xpickle outputSysConfig OutputConfiguration.FileFormat.stdoutProxy+			 ) . Input.CommandLineOption.readArg+#ifdef USE_UNIX+	SignalHandlers.handleSignals+#endif++-- Use the list of possible options, to process the actual list of arguments, & to record those we want to display in the XHTML-results.+	case G.getOpt G.RequireOrder optDescrList args of+		(commandLineOptions, [{-non-options-}], [{-errors-}])	-> let+			visibleArgs			:: [(String, Maybe String)]+			ioActions			:: [IO ()]+			optionsMutators			:: [Options -> Options]+			configLocationParameters	:: Data.Map.Map Input.CommandLineOption.Flag String+			(visibleArgs, (ioActions, optionsMutators, configLocationParameters))	= Data.Maybe.catMaybes *** Input.CommandLineOption.partition3 $ unzip commandLineOptions	-- Categorise the specified command-line options.+		 in if not $ null ioActions+			then do+				sequence_ ioActions++				if null optionsMutators && Data.Map.null configLocationParameters+					then System.Exit.exitSuccess+					else error "incompatible command-line options."+			else if Data.Map.null configLocationParameters+				then error . shows (Input.CommandLineOption.longFlagPrefix ++ inputConfigFilePathFlag)+#ifdef USE_HDBC+					. showString " or " . shows mandatoryDBFlags+#endif+					$ " must be specified."+				else {-config-location specified-} let+{-+	The strategy is to either parse XML or query the database, for the input-options, then over-ride them with each of the command-line options-mutators,+	but regrettably "verbosity" (a command-line option) is needed while doing so.+	This is resolved by reading the "verbosity" from the command-line first.+-}+					preVerbosity :: Distribution.Verbosity.Verbosity+					preVerbosity+						| null verbosityArgs	= Data.Default.def+						| otherwise		= Input.CommandLineOption.readArg $ head verbosityArgs+						where+							verbosityArgs :: [String]+							verbosityArgs	= Input.CommandLineOption.getArgs (+								map (showString Input.CommandLineOption.longFlagPrefix) . drop 4 {-those prefixes ambiguous with "version"-} $ Data.List.inits OutputConfiguration.Verbosity.tag	-- Generate all unique abbreviations.+							 ) args++					inputSysConfig :: HXT.SysConfigList+					inputSysConfig	= [+						HXT.withRemoveWS	HXT.yes,	-- Remove white-space, e.g. any indentation which might have been introduced by 'HXT.withIndent'.+						HXT.withStrictInput	HXT.yes,	-- Read the input file strictly (cf. lazily), this ensures file-closure even if not completely read.+						HXT.withValidate	HXT.yes		-- Validate against any DTD referenced from the specified XML-file.+					 ]++					processInputOptions :: Options -> IO ()+					processInputOptions inputOptions+						| null configVersion									= error . showString "undefined " $ shows Input.ConfigVersion.tag "."+						| not $ Factory.Data.Interval.elem' configVersion tolerableConfigVersionInterval	= error . showString Input.ConfigVersion.tag . showChar '=' . shows (Input.ConfigVersion.toString configVersion) . showString ", falls outside tolerable bounds " $ shows (Input.ConfigVersion.toString *** Input.ConfigVersion.toString $ tolerableConfigVersionInterval) "."+						| not $ ToolShed.SelfValidate.isValid inputOptions''					= error $ ToolShed.SelfValidate.getFirstError inputOptions''	-- Now that the input-options have been amended according to the command-line options, check that they're valid.+						| otherwise										= do+#ifdef TOOL_VERSION_ghc+							numProcessors	<- GHC.Conc.getNumProcessors++							Control.Monad.when (verbosity /= minBound && numProcessors > 1 && GHC.Conc.numCapabilities == 1) . System.IO.hPutStrLn System.IO.stderr . showString "WARNING:\tthis application would benefit from " . shows numProcessors . showString " CPU-cores; try '" . showString progName . showChar ' ' $ showString (unwords args) " +RTS -N'."+#endif+							Control.Monad.when (verbosity == maxBound) $ fmap (+								showString "INFO:\tconfiguration read after " . (`showString` ".") . show . (`Data.Time.Clock.diffUTCTime` startUTCTime)+							 ) Data.Time.Clock.getCurrentTime >>= System.IO.hPutStrLn System.IO.stderr	-- CAVEAT: this is only meaningful when there's no password-dialogue.++							Control.Monad.when (Data.Maybe.isJust maybeOutputConfigFilePath) $ let+								outputConfigFilePath	= Data.Maybe.fromJust maybeOutputConfigFilePath+							 in Control.Exception.catch (+								writeXMLToFile outputConfigFilePath Input.Options.tag (+									dtdDir </> progName <.> dtdSuffix+								) inputOptions {-the original-}+							 ) $ \e -> System.IO.hPutStrLn System.IO.stderr . showString "WARNING:\tfailed to write the configuration in XML, to " . showString OutputConfiguration.Options.outputConfigFilePathTag . showChar '=' . shows outputConfigFilePath . showString "; " $ shows (e :: Control.Exception.SomeException) "."	-- This error isn't fatal, so continue.++							Control.Monad.unless (verbosity == minBound) $ mapM_ (System.IO.hPutStrLn System.IO.stderr) warnings	-- Issue any warnings regarding inputOptions'.+-- Construct an initial deterministic timetable.+							let maybeHint	= ExecutionConfiguration.ExecutionOptions.getMaybeHint executionOptions++							maybeStudentViewTimetables	<- Data.Maybe.maybe (+								return {-to IO-monad-} [Nothing]	-- Neither a traversalOrder nor an input-filePath were specified.+							 ) (+								const (+									return {-to IO-monad-} [Nothing]	-- A traversalOrder was specified.+								) `either` (+									\studentViewTimetableFilePath -> HXT.runX $ HXT.xunpickleDocument HXT.xpickle (+										HXT.withTrace (fromEnum verbosity `min` 2) : inputSysConfig	-- CAVEAT: the maximum trace-level is actually 4; but that's VERY verbose.+									) studentViewTimetableFilePath >>> HXT.arrIO (+										\wrapper -> let+											studentViewTimetable	= Model.Timetable.deconstruct wrapper+											maybeErrorMessage	= Dynamic.StudentViewTimetableUtilities.isTimetableValid problemParameters executionOptions problemAnalysis studentViewTimetable+										in Data.Maybe.maybe (+											return {-to IO-monad-} $ Just studentViewTimetable+										) (+											error . shows studentViewTimetableFilePath . showString " failed validation; "+										) maybeErrorMessage+									)+								)+							 ) maybeHint++							randomGen <- Data.Maybe.maybe (+								do+									Control.Monad.when (verbosity > Data.Default.def) $ System.IO.hPutStrLn System.IO.stderr "WARNING:\tseeding the pseudo-random number-generator from the operating-system; the result will not typically be repeatable."++									System.Random.getStdGen+							 ) (+								return {-to IO-monad-} . System.Random.mkStdGen	-- Seed the pseudo-random number-generator with the specified integer.+							 ) $ ExecutionConfiguration.ExecutionOptions.getMaybeRandomSeed executionOptions++							if null maybeStudentViewTimetables+								then error . showString "failed to parse a StudentView-timetable from " . showString ExecutionConfiguration.ExecutionOptions.inputStudentViewTimetableTag . showChar '=' $ show maybeHint+								else let+									deterministicStudentViewTimetableSelection :: OutputFormat.DeterministicStudentViewTimetableSelection.DeterministicStudentViewTimetableSelection CriterionValue CriterionWeight Identifiers.Level.Level Identifiers.LocationId.LocationId Mean StandardDeviation Identifiers.TeacherId.TeacherId Identifiers.TimeslotId.TimeslotId WeightedMean+									(+										(executionOptions', deterministicStudentViewTimetableSelection),+										optimiseLessonCriteriaWeightsResults+									 ) = Control.Monad.Writer.runWriter $ Implementation.EvolutionaryAlgorithm.optimiseLessonCriteriaWeights problemParameters executionOptions problemAnalysis (+										head {-it's a singleton-} maybeStudentViewTimetables+									 ) randomGen {-used if ExecutionConfiguration.OptimiseLessonCriteriaWeights.isRequired-}++									deterministicStudentViewTimetable	= OutputFormat.DeterministicStudentViewTimetableSelection.getStudentViewTimetable deterministicStudentViewTimetableSelection	-- Access.++									evolutionStrategyStatisticsList :: [OutputFormat.EvolutionStrategyStatistics.EvolutionStrategyStatistics WeightedMean CriterionValue]+									(studentViewTimetable, evolutionStrategyStatisticsList)	= Control.Monad.Writer.runWriter $ Implementation.EvolutionaryAlgorithm.evolveStudentViewTimetable randomGen problemParameters executionOptions' problemAnalysis deterministicStudentViewTimetable	-- Evolve the initial deterministic timetable.++-- Analyse the results.+								in do+									if verbosity == Data.Default.def	-- Print either a progress-bar or the 'runtimeLog'.+										then let+											stagingPost :: Char+											stagingPost	= '.'+										in System.IO.hPutStrLn System.IO.stderr $ seq deterministicStudentViewTimetable stagingPost : map (+											(`seq` stagingPost) . OutputFormat.EvolutionStrategyStatistics.getWeightedMeanOfTimetableCriteria+										) evolutionStrategyStatisticsList	-- Print progress-bar.+										else Control.Monad.when (verbosity > Data.Default.def) . mapM_ (System.IO.hPutStrLn System.IO.stderr) $ (+											"INFO:\t" ++ Data.Maybe.maybe "a variable number of" (+												(++ " initial") . show+											) (+												ExecutionConfiguration.EvolutionStrategies.getMaybeNInitialScouts $ ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions	-- CAVEAT: unnecessary use of "executionOptions'" here, will block output until it's evaluated.+											) ++ " scouts will be dispatched during evolution."+										) : map (+											\(key, value)	-> key ++ ": " ++ value+										) (+											OutputFormat.EvolutionStrategyStatistics.composeRuntimeLog executionOptions' nDecimalDigits (+												ExecutionConfiguration.ExecutionOptions.hintWasSpecified executionOptions {- CAVEAT: unnecessary use of executionOptions' here, will block output until it's evaluated-}+											) (+												ExecutionConfiguration.EvolutionStrategies.areAllZero $ ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions+											) lessonCriteriaWeights (+												ExecutionConfiguration.OptimiseLessonCriteriaWeights.getUseMeanOverRasterScans $ ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights executionOptions	-- CAVEAT: unnecessary use of executionOptions' here, will block output until it's evaluated.+											) optimiseLessonCriteriaWeightsResults deterministicStudentViewTimetableSelection evolutionStrategyStatisticsList . snd {-[Maybe timetableCriterion]-} . Control.Arrow.first (+												\x -> x :: WeightedMean	-- Define the type of the discarded datum.+											) . Control.Monad.Writer.runWriter $ Implementation.TimetableFitness.evaluateFitness problemParameters executionOptions' problemAnalysis studentViewTimetable+										)++-- Present the 'timetable' in each of the requested output-formats.+									mapM_ (+										\fileFormat -> let+											filePath	= OutputConfiguration.FileFormat.getFilePath fileFormat+										in Control.Exception.catch (+											case OutputConfiguration.FileFormat.getFormat fileFormat of+												OutputConfiguration.Format.XHTML style	-> let+													description, documentTitle :: String+													description	= "The proposed solution to the specified school-timetable problem"+													documentTitle	= unwords $ progName : map (+														uncurry showString . (+															showString Input.CommandLineOption.longFlagPrefix *** Data.Maybe.maybe "" (showString "='" . (`showString` "'"))+														)+													 ) visibleArgs+												 in do+													Control.Monad.when (verbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . showString "INFO:\tdataDir=" . shows dataDir . showString ", appUserDataDir=" $ shows appUserDataDir "."++													maybeCSSURL	<- Data.Maybe.maybe (+														let+															cssFileName :: System.FilePath.FilePath+															cssFileName	= progName <.> Text.CSS.cssSuffix	-- The default CSS-filename.+															searchPath	= [+																".",					-- CWD.+																appUserDataDir </> Text.CSS.cssSuffix,	-- Under the user's home-directory.+																dataDir </> Text.CSS.cssSuffix		-- Under the installation-directory defined during 'cabal configure'.+															 ] -- CAVEAT: not "css/", i.e. relative to the root of the source-tree, which one wouldn't typically install.+														in ToolShed.System.File.locate cssFileName searchPath >>= Data.Maybe.maybe (+															do+																Control.Monad.unless (verbosity == minBound) . System.IO.hPutStrLn System.IO.stderr . showString "WARNING:\tthe default CSS-filename " . shows cssFileName . showString ", wasn't found in any of " . (`showString` ".") $ show searchPath++																return {-to IO-monad-} Nothing+														) (+															\cssFilePath -> do+																Control.Monad.when (verbosity > Data.Default.def) . System.IO.hPutStrLn System.IO.stderr . showString "INFO:\twriting the CSS-filepath " $ shows cssFilePath " into the XHTML-output."++																return {-to IO-monad-} $ Just cssFilePath+														) . Data.Maybe.listToMaybe+													 ) (+														return {-to IO-monad-} . Just+													 ) $ OutputConfiguration.Style.getMaybeCSSURL style++													Control.Exception.catch (+														(+															\document -> if filePath == OutputConfiguration.FileFormat.stdoutProxy+																then putStrLn document+																else System.IO.withFile filePath System.IO.WriteMode (`System.IO.hPutStrLn` document)+														) . OutputFormat.XHTMLFormat.renderDocument maybeCSSURL author description (+															Data.List.intercalate ", " [packageIdentifier, "Timetable", "Haskell", "Evolutionary algorithm"]	-- Key-words.+														) progName documentTitle $ OutputFormat.XHTMLFormat.composeBody problemParameters executionOptions' outputOptions problemAnalysis (+															if OutputConfiguration.Style.getDisplayRuntimeInformation style+																then Just (+																	warnings,+																	OutputFormat.EvolutionStrategyStatistics.toHtml executionOptions' nDecimalDigits lessonCriteriaWeights optimiseLessonCriteriaWeightsResults deterministicStudentViewTimetableSelection evolutionStrategyStatisticsList+																)+																else Nothing+														) (+															OutputConfiguration.Style.getDisplayViews style+														) (+															OutputConfiguration.Style.getDisplaySupplementaryInformation style+														) (+															OutputConfiguration.Style.getMergeDuplicateTimeslots style+														) (+															OutputConfiguration.Style.getDisplayAxisLabels style+														) (+															OutputConfiguration.Style.getWeekend style+														) (+															OutputConfiguration.Style.getMaybeGenerateLessonColour style+														) studentViewTimetable+													 ) $ \e -> System.IO.hPutStrLn System.IO.stderr . showString "WARNING:\tfailed to render the results in XHTML; \"" $ shows (e :: Control.Exception.SomeException) "\"."	-- There may be other file-formats to process, so continue.++												OutputConfiguration.Format.XML view	-> let+													permitTemporaryStudentBodyMerger :: Bool+													permitTemporaryStudentBodyMerger	= ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions'+												 in Control.Exception.catch (+													(+														case view of+															OutputConfiguration.View.LocationView	-> writeXMLToFile filePath Model.Timetable.tag (+																dtdDir </> OutputFormat.XHTMLFormatLocationViewTimetable.locationViewTimetableTag <.> dtdSuffix	-- Reference the corresponding packaged DTD.+															 ) . Model.Timetable.MkWrapper . LocationView.Timetable.fromStudentViewTimetable permitTemporaryStudentBodyMerger (ProblemConfiguration.ProblemAnalysis.getFreeLocationViewTimetable problemAnalysis)+															OutputConfiguration.View.StudentView	-> writeXMLToFile filePath Model.Timetable.tag (+																dtdDir </> OutputFormat.XHTMLFormatStudentViewTimetable.studentViewTimetableTag <.> dtdSuffix	-- Reference the corresponding packaged DTD.+															 ) . Model.Timetable.MkWrapper+															OutputConfiguration.View.TeacherView	-> writeXMLToFile filePath Model.Timetable.tag (+																dtdDir </> OutputFormat.XHTMLFormatTeacherViewTimetable.teacherViewTimetableTag <.> dtdSuffix	-- Reference the corresponding packaged DTD.+															 ) . Model.Timetable.MkWrapper . TeacherView.Timetable.fromStudentViewTimetable permitTemporaryStudentBodyMerger (ProblemConfiguration.ProblemAnalysis.getFreeTeacherViewTimetable problemAnalysis)+													 ) studentViewTimetable+												 ) $ \e -> System.IO.hPutStrLn System.IO.stderr . showString "WARNING:\tfailed to write the solution in XML, to path=" . shows filePath . showString "; \"" $ shows (e :: Control.Exception.SomeException) "\"."	-- There may be other file-formats to process, so continue.++										) $ \e -> System.IO.hPutStrLn System.IO.stderr . showString "WARNING:\tfailed to process " . shows fileFormat . showString "; \"" $ shows (e :: Control.Exception.SomeException) "\"."	-- There may be other file-formats to process, so continue.+									 ) outputFileFormats++									Control.Monad.when (verbosity == maxBound) $ fmap (+										showString "INFO:\ttotal elapsed time " . (`showString` ".") . show . (`Data.Time.Clock.diffUTCTime` startUTCTime)+									 ) Data.Time.Clock.getCurrentTime >>= System.IO.hPutStrLn System.IO.stderr+						where+							configVersion :: Input.ConfigVersion.ConfigVersion+							configVersion	= Input.ConfigVersion.normalise $ Input.Options.getConfigVersion inputOptions++							tolerableConfigVersionInterval :: Factory.Data.Interval.Interval Input.ConfigVersion.ConfigVersion+							tolerableConfigVersionInterval	= Factory.Data.Interval.precisely $ Input.ConfigVersion.normalise [1, 0]	-- Only version "1.0" is tolerable.++							inputOptions' :: Options+							inputOptions'	= foldr ($) inputOptions {-initial value-} optionsMutators	-- Sequentially mutate the configuration, using each of the options-mutators specified on the command-line.++							outputOptions	= Input.Options.getOutputOptions inputOptions'	-- Deconstruct.+							nDecimalDigits	= OutputConfiguration.Options.getNDecimalDigits outputOptions++-- Amend the problemParameters according to the executionOptions, logging any changes.+							problemParameters			:: ProblemParameters+							mergedStudentBodies			:: [[Aggregate.StudentBody.StudentBody]]+							pointlessGroupIds, unsubscribedGroupIds	:: [Data.Group.Id]+							redundantKnowledgeByTeacherId		:: [(Identifiers.TeacherId.TeacherId, Data.Subject.Knowledge Identifiers.Level.Level)]+							disabledProblemValidationSwitches	:: [String]+							(((((problemParameters, mergedStudentBodies), pointlessGroupIds), unsubscribedGroupIds), redundantKnowledgeByTeacherId), disabledProblemValidationSwitches)	= Control.Arrow.first (+								Control.Arrow.first (+									Control.Arrow.first (+										Control.Arrow.first (+											Control.Monad.Writer.runWriter . (+												if ExecutionConfiguration.ExecutionOptions.getReduceStudentBodyRegister e+													then ProblemConfiguration.ProblemParameters.reduceStudentBodyRegister (OutputConfiguration.Options.getStudentBodyMnemonicSeparator outputOptions)	-- Which returns a Writer.+													else return {-to Writer-monad-}+											) . ProblemConfiguration.ProblemParameters.mergeConstraintsOnSynchronisedCourses+										) . Control.Monad.Writer.runWriter . (+											if ExecutionConfiguration.ExecutionOptions.getRemovePointlessGroups e+												then ProblemConfiguration.ProblemParameters.removePointlessGroups	-- Which returns a Writer.+												else return {-to Writer-monad-}+										)+									) . Control.Monad.Writer.runWriter . (+										if ExecutionConfiguration.ExecutionOptions.getRemoveUnsubscribedGroups e+											then ProblemConfiguration.ProblemParameters.removeUnsubscribedGroups	-- Which returns a Writer.+											else return {-to Writer-monad-}+									)+								) . Control.Monad.Writer.runWriter . (+									if ExecutionConfiguration.ExecutionOptions.getRemoveRedundantCourses e+										then ProblemConfiguration.ProblemParameters.removeRedundantCourses	-- Which returns a Writer.+										else return {-to Writer-monad-}+								)+							 ) . Control.Monad.Writer.runWriter . (+								if ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger e+									then ProblemConfiguration.ProblemParameters.disableAnyValidationInappropriateForTemporaryStudentBodyMerger	-- Which returns a Writer.+									else return {-to Writer-monad-}+							 ) $ Input.Options.getProblemParameters inputOptions' where+								e	= Input.Options.getExecutionOptions inputOptions'++-- Amend the executionOptions according to the problemParameters, gathering the list of changes & concatenating it with other warnings.+							(executionOptions, warnings)	= let+								showListWithQuotesAndSpaces :: Show a => [a] -> String+								showListWithQuotesAndSpaces	= Data.List.intercalate ", " . map show+							 in Control.Arrow.second (+								\((maybeLessonCriteriaWeightsWarning, maybeTimetableCriteriaWeightsWarning), maybeEvolutionStrategyFecundityWarnings) -> map (+									showString "WARNING:\t" . (`showString` ".")+								) $ Data.Maybe.catMaybes [+									maybeLessonCriteriaWeightsWarning,+									maybeTimetableCriteriaWeightsWarning,+									maybeEvolutionStrategyFecundityWarnings+								] ++ Configuration.issueWarnings inputOptions' ++ [+									msg | (True, msg) <- [+										(+											not $ null disabledProblemValidationSwitches,+											"the following problem-validation switches are inappropriate when temporary student-body mergers are permissible, & have been disabled; " ++ showListWithQuotesAndSpaces disabledProblemValidationSwitches+										), (+											not $ null redundantKnowledgeByTeacherId,+											"those subjects for which there's zero demand have been removed; " ++ show (+												Control.Arrow.second Data.Set.toList `map` redundantKnowledgeByTeacherId+											)+										), (+											not $ null unsubscribedGroupIds,+											"those groups to which neither student-bodies nor teachers have subscribed, have been removed from the group-catalogue; " ++ showListWithQuotesAndSpaces unsubscribedGroupIds+										), (+											not $ null pointlessGroupIds,+											"those groups for which zero meetings have been scheduled, have been removed from the group-catalogue; " ++ showListWithQuotesAndSpaces pointlessGroupIds+										), (+											not $ null mergedStudentBodies,+											"those student-bodies whose profiles are identical, have been merged; " ++ showListWithQuotesAndSpaces (+												map Aggregate.StudentBody.getMnemonic `map` mergedStudentBodies+											)+										),+										case (+											ExecutionConfiguration.ExecutionOptions.getMaybeHint $ Input.Options.getExecutionOptions inputOptions',+											ExecutionConfiguration.ExecutionOptions.getMaybeHint executionOptions {-lazy evaluation-}+										) of+											(Just hint, Just hint')	-> (+												hint /= hint',+												showString "the command-line specification of '" . showString ExecutionConfiguration.ExecutionOptions.inputStudentViewTimetableTag . showChar '=' . either shows shows hint' . showString "', overrides the configured " $ either (+													showString "raster-scan " . show+												) (+													showString "input student-view timetable " . show+												) hint+											 ) -- Pair.+											_			-> (False, undefined)+									]+								] -- List-comprehension.+							 ) . (+								\e -> let+									maybeFormatTags :: String -> [String] -> Maybe String+									maybeFormatTags _ []	= Nothing+									maybeFormatTags s l	= Just $ s ++ showListWithQuotesAndSpaces l++									composeZeroedWeightsStatement :: String -> [String] -> Maybe String+									composeZeroedWeightsStatement s	= maybeFormatTags $ "the following " ++ s ++ "-criteria are inappropriate for the specified problem-parameters, & consequently their weights have been zeroed; "+								in Control.Arrow.second (+									(+										composeZeroedWeightsStatement "lesson" *** composeZeroedWeightsStatement "timetable"+									) *** maybeFormatTags "the following evolution-strategies are inappropriate for the specified problem-parameters, & consequently their fecundities have been zeroed; "+								) $ Input.Options.zeroInappropriateExecutionOptions (ExecutionConfiguration.ExecutionOptions.getZeroInappropriateOptions e) problemParameters e	-- CAVEAT: actions aren't printed until after checking the validity of the resulting structure.+							 ) $ Input.Options.getExecutionOptions inputOptions'++							lessonCriteriaWeights	= ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights executionOptions++							problemAnalysis :: ProblemAnalysis+							problemAnalysis	= ProblemConfiguration.ProblemAnalysis.mkProblemAnalysis problemParameters++							inputOptions'' :: Options+							inputOptions''	= inputOptions' {+								Input.Options.getExecutionOptions	= executionOptions,	-- CAVEAT: not including any optimisation of lesson-criteria weights in executionOptions'.+								Input.Options.getProblemParameters	= problemParameters+							} -- Re-integrate the amended configuration-parameters.++							dtdSuffix, dtdDir :: System.FilePath.FilePath+							dtdSuffix	= "dtd"+							dtdDir		= dataDir </> dtdSuffix {-name the directory the same as the file-suffixes it contains-}++							maybeOutputConfigFilePath	= OutputConfiguration.Options.getMaybeOutputConfigFilePath outputOptions+							outputFileFormats		= OutputConfiguration.Options.getFileFormats outputOptions+							verbosity			= OutputConfiguration.Options.getVerbosity outputOptions+				in case Data.Map.lookup inputConfigFilePathFlag configLocationParameters of	-- Determine whether the configuration is filed locally, or in a database.+					Just inputConfigFilePath	-> do+						fileExists	<- System.Directory.doesFileExist inputConfigFilePath++						if not fileExists+							then error . showString "no such file " $ shows inputConfigFilePath "."	-- This error would be trapped by HXT.xunpickleDocument, but it doesn't set the exit-status.+							else let+								maximumTraceLevel :: Int+								maximumTraceLevel	= 2	-- CAVEAT: HXT trace-levels 3 & 4 are too verbose.+							in Control.Monad.void {-discard the return-value of processInputOptions-} . HXT.runX $ HXT.setTraceLevel (+								fromEnum preVerbosity `min` maximumTraceLevel+							) >>> HXT.xunpickleDocument HXT.xpickle inputSysConfig inputConfigFilePath >>> HXT.traceMsg maximumTraceLevel "XML-configuration parsed" >>> HXT.arrIO processInputOptions+#ifdef USE_HDBC+					_ {-connect to the RDBMS-}	-> case Data.Map.lookup databaseUserIdFlag configLocationParameters of+						Nothing			-> error . showString "command-line option " $ shows databaseUserIdFlag' ", must be specified."+						Just databaseUserId	-> case Data.Map.lookup databaseProjectNameFlag configLocationParameters of+							Nothing				-> error . showString "command-line option " $ shows databaseProjectNameFlag' ", must be specified."+							Just databaseProjectName	-> let+								verbose :: Bool+								verbose	= preVerbosity > Data.Default.def++								withEcho :: Bool -> IO a -> IO a+								withEcho echo action = do+									oldPolicy	<- System.IO.hGetEcho System.IO.stdin++									Control.Exception.bracket_ (System.IO.hSetEcho System.IO.stdin echo) (System.IO.hSetEcho System.IO.stdin oldPolicy) action++								readPassword :: String -> IO String+								readPassword prompt	= do+									Control.Monad.unless (+										preVerbosity == minBound	-- This might appear to make the process hang, but might be useful when the passwords have already been piped into stdin.+									 ) . System.IO.hPutStr System.IO.stderr . showString "Enter the " $ shows prompt ": "++									line	<- withEcho False getLine++									System.IO.hPutChar System.IO.stderr '\n'++									return {-to IO-monad-} line+							 in+#ifdef USE_HDBC_MYSQL /* This seems to increase the speed of ODBC, but isn't essential */+							 Database.MySQL.withRTSSignalsBlocked	-- CAVEAT: MySQL doesn't re-start actions after interruption.+#endif+							 (+								do+#ifdef USE_HDBC_ODBC+									dbConnection		<- Database.HDBC.ODBC.connectODBC . Database.ODBC.buildConnectionString Nothing {-ServerName-} Nothing {-Port-} Nothing {-UId-} Nothing {-Data-server password-} Nothing {-Database-} . Data.Maybe.fromMaybe defaultDSN $ Data.Map.lookup dsnFlag configLocationParameters+#elif USE_HDBC_MYSQL+									dataServerPassword	<- Data.Maybe.maybe (readPassword dataServerPasswordFlag) return {-to IO-monad-} $ Data.Map.lookup dataServerPasswordFlag configLocationParameters+									dbConnection		<- Database.MySQL.connect (+										Data.Maybe.fromMaybe Database.MySQL.defaultHost $ Data.Map.lookup dataServerHostFlag configLocationParameters+									 ) (+										Data.Maybe.maybe Database.MySQL.defaultPort read $ Data.Map.lookup dataServerPortFlag configLocationParameters+									 ) (+										Data.Maybe.fromMaybe defaultDataServerUserId $ Data.Map.lookup dataServerUserIdFlag configLocationParameters+									 ) dataServerPassword (+										Data.Maybe.fromMaybe defaultDatabaseName $ Data.Map.lookup databaseNameFlag configLocationParameters+									 )+#else /* Currently there aren't any alternative DBMS-interfaces */+									dbConnection		<- error "unknown HDBC-backend."+#endif+									Control.Monad.when verbose . System.IO.hPutStrLn System.IO.stderr . showString "INFO:\tconnection authorised; database-client=" . shows (+										showString (Database.HDBC.proxiedClientName dbConnection) . showChar '-' $ Database.HDBC.proxiedClientVer dbConnection+									 ) . showString ", version of database-server=" $ shows (Database.HDBC.dbServerVer dbConnection) "."++									let+										executableColumnName, emailAddressColumnName, saltColumnName, saltedPasswordHashColumnName, userIdColumnName :: Database.Selector.ColumnName+										executableColumnName		= "executable"+										emailAddressColumnName		= "emailAddress"+										saltColumnName			= "salt"+										saltedPasswordHashColumnName	= "saltedPasswordHash"+										userIdColumnName		= "userId"++										userTableName :: Database.Selector.TableName+										userTableName	= Database.Selector.tablePrefix ++ "user"++									Control.Exception.catch (+										do+-- Retrieve security-details from the RDBMS.+											userRows	<- Database.Selector.select dbConnection [+												userIdColumnName,+												saltColumnName,+												saltedPasswordHashColumnName,+												executableColumnName+											 ] [userTableName] [+												(+													emailAddressColumnName,+													Database.HDBC.toSql (databaseUserId :: String)+												) -- CAVEAT: this column is defined as an email-address in the database (to ensure uniqueness), but merely as 'databaseUserId' here.+											 ]+-- Authenticate the user.+											case userRows of+												[]		-> error . showString databaseUserIdFlag . showChar '(' . showString emailAddressColumnName . showString ")=" $ shows databaseUserId " wasn't found in the database."+												[userRow]	-> case userRow of+													[userSql, saltSql, saltedPasswordHashSql, executableSql]	-> do+														authorised	<- case either (+															error . showString "failed to parse the value for " . shows saltedPasswordHashColumnName . showString " read from the database; " . show+														 ) id $ Database.HDBC.safeFromSql saltedPasswordHashSql of	-- Retrieve the recorded raw binary hash, for comparison.+															Nothing				-> return {-to IO-monad-} True	-- A salted password-hash hasn't been recorded.+															Just recordedSaltedPasswordHash	-> do+																saltedPasswordHash	<- (+																	Crypto.Hash.hash . (+																		either (+																			error . showString "ERROR:\tfailed to parse the value for " . shows saltColumnName . showString " read from the database; " . show+																		) id (+																			Database.HDBC.safeFromSql saltSql+																		) `Data.ByteString.append`+																	) . Data.ByteString.Char8.pack+																 ) `fmap` Data.Maybe.maybe (+																	readPassword databasePasswordFlag+																 ) return {-to IO-monad-} (+																	Data.Map.lookup databasePasswordFlag configLocationParameters+																 ) -- Generate a salted password-hash for comparison with the recorded value.++																System.IO.hClose System.IO.stdin	-- Any passwords required, have now been read.++																Control.Monad.when (preVerbosity == maxBound) . System.IO.hPutStrLn System.IO.stderr . showString "INFO:\thash generated from salted " . shows databasePasswordFlag . showString "; 0x" $ shows saltedPasswordHash "."++																return {-to IO-monad-} $ Data.Byteable.toBytes (saltedPasswordHash :: Crypto.Hash.Digest Crypto.Hash.SHA512) == recordedSaltedPasswordHash	-- Authenticate by comparing a hash of the concatenated recorded binary salt & the specified ASCII password, against the recorded binary hash.++														if not authorised+															then error . showString "incorrect " . shows databasePasswordFlag . showString " for " . showString databaseUserIdFlag . showChar '=' $ shows databaseUserId "; database-access denied."+															else {-authorised-} let+																userId :: Int	-- Arbitrarily.+																userId	= either (+																	error . showString "ERROR:\tfailed to parse the value for " . shows userIdColumnName . showString " read from the database; " . show+																 ) id $ Database.HDBC.safeFromSql userSql+															in do+																Control.Monad.when verbose $ fmap (+																	showString "INFO:\tauthenticated as " . showString progName . showChar '-' . showString userIdColumnName . showChar '=' . shows userId . showString ", after " . (`showString` ".") . show . (`Data.Time.Clock.diffUTCTime` startUTCTime)+																 ) Data.Time.Clock.getCurrentTime >>= System.IO.hPutStrLn System.IO.stderr++-- Query the RDBMS to confirm that the user is active.+																if either (+																	error . showString "ERROR:\tfailed to parse the value for " . shows executableColumnName . showString " read from the database; " . show+																 ) not $ Database.HDBC.safeFromSql executableSql+																	then error . showString "the account for " . showString databaseUserIdFlag . showChar '(' . showString emailAddressColumnName . showString ")=" $ shows databaseUserId " isn't executable."+																	else {-executable-} let+																		projectNameColumnName :: Database.Selector.ColumnName+																		projectNameColumnName	= "projectName"++																		projectsTableName :: Database.Selector.TableName+																		projectsTableName	= showString Database.Selector.tablePrefix "project"+																	in do+-- Query the database to construct the input-options.+																		projectIdRows	<- map head {-select the single column requested from each row-} `fmap` Database.Selector.select dbConnection [+																			Database.Selector.projectIdColumnName+																		 ] [projectsTableName] [+																			(userIdColumnName,	userSql),+																			(projectNameColumnName,	Database.HDBC.toSql databaseProjectName)+																		 ]++																		case projectIdRows of+																			[]		-> error . showString projectNameColumnName . showChar '=' . shows databaseProjectName . showString " wasn't found, where " . showString databaseUserIdFlag . showChar '(' . showString emailAddressColumnName . showString ")=" $ show databaseUserId+																			[projectIdSql]	-> let+																				projectId :: Int	-- Arbitrarily.+																				projectId	= either (+																					error . showString "ERROR:\tfailed to parse the value for " . shows Database.Selector.projectIdColumnName . showString " read from the database; " . show+																				 ) id $ Database.HDBC.safeFromSql projectIdSql+																			 in do+																				Control.Monad.when verbose . System.IO.hPutStrLn System.IO.stderr . showString "INFO:\t" . showString Database.Selector.projectIdColumnName . showChar '=' $ shows projectId " selected."++																				inputOptions	<- Database.Selector.fromDatabase dbConnection projectIdSql++																				Control.Monad.when verbose . System.IO.hPutStrLn System.IO.stderr $ "INFO:\tproject-configuration read from database."+																				Database.HDBC.disconnect dbConnection++																				return {-to IO-monad-} inputOptions+																			_		-> error . showString "unexpected number of rows=" . shows (length projectIdRows) . showString " selected, where " . showString userIdColumnName . showChar '=' . shows userId . showString " & " . showString projectNameColumnName . showChar '=' $ showString databaseProjectName "."+													_				-> error . showString "unexpected number of columns=" . shows (length userRow) . showString " selected, where " . showString databaseUserIdFlag . showChar '(' . showString emailAddressColumnName . showString ")=" $ showString databaseUserId "."+												_		-> error . showString "unexpected number of rows=" . shows (length userRows) . showString " selected, where " . showString databaseUserIdFlag . showChar '(' . showString emailAddressColumnName . showString ")=" $ showString databaseUserId "."+									 ) $ \e -> do+										Database.HDBC.disconnect dbConnection++										System.IO.hPutStrLn System.IO.stderr "ERROR:\tfailed to read all the required configuration from the database."++										Control.Exception.throwIO (e :: Control.Exception.SomeException)+							 ) >>= processInputOptions+#else /* no HDBC */+					_ {-connect to the RDBMS-}	-> error . showString "one or more of the database-backend Haskell packages " $ shows [odbcPackageName, mySQLPackageName] " must be installed before database-connectivity can be established."+#endif /* USE_HDBC */+		(_, nonOptions, [])	-> error . showString "unexpected command-line arguments; " $ shows nonOptions "."+		(_, _, errors)		-> error $ concat errors+
+ src-exe/WeekDaze/Database/MySQL.hs view
@@ -0,0 +1,96 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Encapsulates the module "MySQL".+-}++module WeekDaze.Database.MySQL(+	MySQL.withRTSSignalsBlocked,	-- Re-export to shield the caller from the source module.+-- * Constants+	defaultHost,+	defaultPort,+-- * Functions+	connect+) where++import qualified	Database.HDBC.MySQL	as MySQL	-- CAVEAT: there may be issues compiling the required package in Windows , where typically one would use "HDBC.ODBC".+import qualified	Data.List+--import qualified	System.IO++-- | The default host-name.+defaultHost :: String+defaultHost	= MySQL.mysqlHost MySQL.defaultMySQLConnectInfo++-- | The default port on which to connect.+defaultPort :: Int+defaultPort	= MySQL.mysqlPort MySQL.defaultMySQLConnectInfo++instance Show MySQL.MySQLConnectInfo where+	showsPrec _ MySQL.MySQLConnectInfo {+		MySQL.mysqlHost		= host,+		MySQL.mysqlPort		= port,+		MySQL.mysqlUser		= user,+--		MySQL.mysqlPassword	= password,+		MySQL.mysqlDatabase	= database+	} = foldr (.) (+		showChar ')'	-- Initial value.+	 ) . Data.List.intersperse (+		showString ", "	-- Separator.+	 ) $ map (+		\(k, v)	-> showString k . v+	 ) [+		(+			"(host=",	shows host+		), (+			"port=",	shows port+		), (+			"user=",	shows user+{-+		), (+			"password=",	shows password+-}+		), (+			"database=",	shows database+		)+	 ]++-- | Connects to the specified MySQL-database.+connect+	:: String	-- ^ Data-server's Host-name.+	-> Int		-- ^ Port.+	-> String	-- ^ User-name on Data-server.+	-> String	-- ^ Password for Data-server.+	-> String	-- ^ Database-name.+	-> IO MySQL.Connection+connect hostName port dataServerUserName dataServerPassword databaseName	= do+	let mySQLConnectInfo	= MySQL.defaultMySQLConnectInfo {+		MySQL.mysqlHost		= hostName,+		MySQL.mysqlPort		= port,+		MySQL.mysqlUser		= dataServerUserName,+		MySQL.mysqlPassword	= dataServerPassword,+		MySQL.mysqlDatabase	= databaseName+	}++--	System.IO.hPutStrLn System.IO.stderr $ "INFO:\tattempting connection to the data-server; " ++ show mySQLConnectInfo ++ "."	-- CAVEAT: the executable may be running on a web-server, so don't reveal connection-details to web-clients.++	MySQL.connectMySQL mySQLConnectInfo+
+ src-exe/WeekDaze/Database/ODBC.hs view
@@ -0,0 +1,61 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Supports ODBC-connection to a DBMS.+-}+module WeekDaze.Database.ODBC(+-- * Functions+	buildConnectionString+) where++import qualified	Data.List++{- |+	* Constructs an ODBC connection-string according to the syntax defined in <http://www.unixodbc.org/odbcinst.html> or <https://dev.mysql.com/doc/connector-odbc/en/>.++	* CAVEAT: despite ODBC's aim of abstracting the connection-process, the field-names defined here are MySQL-specific.+-}+buildConnectionString+	:: Maybe String	-- ^ The optional host-name on which the data-server is running.+	-> Maybe Int	-- ^ The optional port on which the data-server is listening.+	-> Maybe String	-- ^ The optional user-name on the above data-server.+	-> Maybe String	-- ^ The optional password by which to authenticate with the above data-server.+	-> Maybe String	-- ^ The optional database-name.+	-> String	-- ^ A DSN by which to select the remaining connection-parameters from one's previously filed data-sources; e.g. from "~/.odbc.ini".+	-> String+buildConnectionString maybeDataServerName maybeDataServerPort maybeDataServerUserName maybeDataServerPassword maybeDatabaseName dsn	= Data.List.intercalate ";" [+	showString key $ showChar '=' value | (key, Just value) <- [+		(+			"SERVER",	maybeDataServerName	-- PostgreSQL uses 'Servername' here.+		), (+			"PORT",		fmap show maybeDataServerPort+		), (+			"UID",		maybeDataServerUserName	-- AKA 'User'. PostgreSQL uses 'UserName' here.+		), (+			"PASSWORD",	maybeDataServerPassword+		), (+			"DATABASE",	maybeDatabaseName+		), (+			"DSN",		Just dsn+		)+	]+ ] -- List-comprehension.+
+ src-exe/WeekDaze/Dynamic/HumanViewTimetable.hs view
@@ -0,0 +1,134 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Encapsulates the /timetable/ as seen from both /human-resource/ views;+	i.e. from the /student-body/'s point-of-view & from the /teacher/'s.+-}++module WeekDaze.Dynamic.HumanViewTimetable(+-- * Types+-- ** Data-types+	TimetablePair(+--		MkTimetablePair,+		getStudentViewTimetable,+		getTeacherViewTimetable+	),+-- * Functions+-- ** Constructor+	mkTimetablePair,+-- ** Mutators+	book,+	bookAtomically+) where++import			Control.Arrow((&&&))+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	WeekDaze.Dynamic.TeacherViewTimetableUtilities		as Dynamic.TeacherViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.TeacherView.Timetable				as TeacherView.Timetable++-- | Couples the two /human-resource/ views of a /timetable/, to facilitate synchronised changes.+data TimetablePair timeslotId locationId teacherId level	= MkTimetablePair {+	getStudentViewTimetable	:: StudentView.Timetable.Timetable timeslotId locationId teacherId level,	-- ^ The /timetable/ as seen from the /student-body/'s point-of-view.+	getTeacherViewTimetable	:: TeacherView.Timetable.Timetable teacherId timeslotId locationId level	-- ^ The /timetable/ as seen from the /teacher/'s point-of-view.+}++-- | Constructor.+mkTimetablePair :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> TimetablePair timeslotId locationId teacherId level+mkTimetablePair executionOptions problemAnalysis	= uncurry ($) . (MkTimetablePair &&& Dynamic.TeacherViewTimetableUtilities.fromStudentViewTimetable executionOptions problemAnalysis)++{- |+	* Book a /student-view lesson/ in both human views of the /timetable/.++	* CAVEAT: doesn't check whether there's already a /lesson/ at the specified /coordinates/, which it may overwrite.+-}+book :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.PermitTemporaryStudentBodyMerger+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level	-- ^ The booked from the /student/'s point-of-view.+	-> TimetablePair timeslotId locationId teacherId level+	-> TimetablePair timeslotId locationId teacherId level+book permitTemporaryStudentBodyMerger studentViewBooking	= uncurry MkTimetablePair . (+	Model.Timetable.defineTimeslot (Model.Timetable.toGeneralisedBooking studentViewBooking) . getStudentViewTimetable &&& TeacherView.Timetable.bookStudentViewLesson permitTemporaryStudentBodyMerger studentViewBooking . getTeacherViewTimetable+ )++{- |+	* Sequentially make the specified /booking/s, in the specified order, until either they're exhausted or the supplied predicate fails.++	* Returns either the /TimetablePair/ including all the required /booking/s, or 'Nothing' on failure.++	* CAVEAT: doesn't perform any native checks,+	so it up to the caller to check whether the required bookings have already been made;+	or whether to overwrite existing /booking/s.+-}+bookAtomically :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Foldable.Foldable	foldable,+	Eq			level,+	Eq			locationId,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.PermitTemporaryStudentBodyMerger+	-> (+		TimetablePair timeslotId locationId teacherId level+		-> StudentView.Timetable.Booking timeslotId locationId teacherId level+		-> Bool+	)											-- ^ Predicate based on a /TimetablePair/ & /booking/.+	-> TimetablePair timeslotId locationId teacherId level					-- ^ The initial /timetable/ on which to operate, as seen from the perspective of both /student/s & /teacher/s.+	-> foldable (StudentView.Timetable.Booking timeslotId locationId teacherId level)	-- ^ The ordered bookings to be placed.+	-> Maybe (TimetablePair timeslotId locationId teacherId level)				-- ^ Returns a /timetable-pair/ iff the /booking/s were completed.+bookAtomically permitTemporaryStudentBodyMerger predicate timetablePair	= Data.Foldable.foldl' (+	\maybeTimetablePair studentViewBooking	-> maybeTimetablePair >>= \timetablePair' -> if predicate timetablePair' studentViewBooking+		then Just $ book permitTemporaryStudentBodyMerger studentViewBooking timetablePair'+		else Nothing+ ) (Just timetablePair)
+ src-exe/WeekDaze/Dynamic/LocationViewTimetableUtilities.hs view
@@ -0,0 +1,59 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Contains utilities dependent on both the static data derived from either configuration or command-line options,+	& on the dynamic state of the current 'LocationView.Timetable.Timetable'.+-}++module WeekDaze.Dynamic.LocationViewTimetableUtilities(+-- * Functions+-- ** Translation+	fromStudentViewTimetable+) where++import qualified	Data.Array.IArray+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.LocationView.Timetable				as LocationView.Timetable+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable++-- | A convenient interface to 'LocationView.Timetable.fromStudentViewTimetable'.+fromStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			teacherId,+	Ord			locationId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level							-- ^ The /timetable/ to invert.+	-> LocationView.Timetable.Timetable locationId timeslotId teacherId level+fromStudentViewTimetable executionOptions problemAnalysis	= LocationView.Timetable.fromStudentViewTimetable (+	ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions+ ) $ ProblemConfiguration.ProblemAnalysis.getFreeLocationViewTimetable problemAnalysis+
+ src-exe/WeekDaze/Dynamic/StudentViewTimetableForWeekUtilities.hs view
@@ -0,0 +1,167 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Contains utilities dependent on both the static data derived from either configuration or command-line options,+	& on the dynamic state of the current 'StudentView.TimetableForWeek.TimetableForWeek'.+-}++module WeekDaze.Dynamic.StudentViewTimetableForWeekUtilities(+-- * Functions+	calculateUtilisationRatio,+	countUnbookedLessons,+	countUnbookedByLesson,+--	completelyBookedByLesson,+	findIncompletelyBookedKnowledgeRequirementsFor,+-- ** Predicates+	isSufficientlyBooked+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import			Data.Set((\\))+import qualified	Data.Array.IArray+import qualified	Data.Map+import qualified	Data.Set+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.Aggregate.StudentBody				as Aggregate.StudentBody+import qualified	WeekDaze.Data.Course					as Data.Course+import qualified	WeekDaze.Data.Student					as Data.Student+import qualified	WeekDaze.Model.Lesson					as Model.Lesson+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size						as Size+import qualified	WeekDaze.StudentView.Lesson				as StudentView.Lesson+import qualified	WeekDaze.StudentView.TimetableForWeek			as StudentView.TimetableForWeek++-- | The number of /lesson/s in a given /subject/, which are still to be booked, according to the weekly requirement for the /course/ to which it belongs.+countUnbookedLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> StudentView.TimetableForWeek.TimetableForWeek timeslotId locationId teacherId level								-- ^ The current /timetable/ for this /student-body/.+	-> StudentView.Lesson.Lesson locationId teacherId level												-- ^ The /lesson/ we want to book.+	-> Size.NTimeslots+countUnbookedLessons problemParameters timetableForWeek	= uncurry (-) . (+	Data.Course.getRequiredLessonsPerWeek . ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters &&& (`Model.TimetableForWeek.countSubjectWorkload` timetableForWeek) . Model.Lesson.getSubject+ )++{- |+	* True if enough /lesson/s in a given /subject/ have been booked according to the weekly requirement for the /course/ to which it belongs.++	* CAVEAT: an excessive number of /booking/s also qualifies.+-}+isSufficientlyBooked :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> StudentView.TimetableForWeek.TimetableForWeek timeslotId locationId teacherId level								-- ^ The current /timetable/ for this /student-body/.+	-> StudentView.Lesson.Lesson locationId teacherId level												-- ^ The /lesson/ we want to book.+	-> Bool+isSufficientlyBooked problemParameters timetableForWeek	= (<= 0) . countUnbookedLessons problemParameters timetableForWeek++{- |+	* The number of each type of /lesson/ still to be booked, according to the weekly requirement for the /course/ to which it belongs.++	* CAVEAT: only those /lesson/s which have been booked in the /timetable/ are counted;+	since only these have a well-defined /course/ & consequently a known /requiredLessonsPerWeek/.++	* CAVEAT: incorrect unless one can guarantee that all /lesson/s for a given /subject/ are identical;+	otherwise the /workload/ returned for a /subject/ could be split amongst different /lesson/s.+-}+countUnbookedByLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> StudentView.TimetableForWeek.TimetableForWeek timeslotId locationId teacherId level								-- ^ The current /timetable/ for this /student-body/.+	-> Data.Map.Map (StudentView.Lesson.Lesson locationId teacherId level) Size.NTimeslots+countUnbookedByLesson problemParameters	= Data.Map.mapWithKey (+	\studentViewLesson -> (Data.Course.getRequiredLessonsPerWeek (ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson) -)+ ) . Model.TimetableForWeek.countWorkloadByLesson++{- |+	* Identifies /lesson/s which have been sufficiently booked according to the weekly requirements for the corresponding /course/.++	* CAVEAT: if none of a particular /lesson/ has been booked, then there won't be any matching key in the map, even though the available /course/s are unbooked.++	* CAVEAT: an excessive number of /booking/s also qualifies.+-}+completelyBookedByLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> StudentView.TimetableForWeek.TimetableForWeek timeslotId locationId teacherId level								-- ^ The current /timetable/ for this /student-body/.+	-> Data.Map.Map (StudentView.Lesson.Lesson locationId teacherId level) Bool+completelyBookedByLesson problemParameters	= Data.Map.map (<= 0) . countUnbookedByLesson problemParameters++{- |+	* The number of /lesson/s booked for the specified /student-body/, relative to the portion of the week for which they're supposed to be taught.++	* This factors into the denominator, both the 'Temporal.Availability.Availability' of the /student-body/,+	& the ratio of that working-time for which they're required to be taught rather than for free-study.+-}+calculateUtilisationRatio :: (+	Data.Array.IArray.Ix	timeslotId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Aggregate.StudentBody.StudentBody+	-> StudentView.TimetableForWeek.TimetableForWeek timeslotId locationId teacherId level+	-> teachingRatio+calculateUtilisationRatio problemParameters problemAnalysis studentBody	= Model.TimetableForWeek.calculateUtilisationRatio (+	ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis+ ) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters ! studentBody++{- |+	* Finds those /knowledge-requirement/s for the specified /student/, which haven't been completely booked (including subjects which haven't been booked at all).++	* CAVEAT: it doesn't represent the extent to which a /course/ is unbooked, nor could it guarantee to able to define this extent,+	because completely unbooked /knowledge-requirement/s don't have a well-defined /course/ & therefore may have an unknown /requiredLessonsPerWeek/.+-}+findIncompletelyBookedKnowledgeRequirementsFor :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> StudentView.TimetableForWeek.TimetableForWeek timeslotId locationId teacherId level+	-> Data.Student.Profile level stream teachingRatio+	-> Data.Student.KnowledgeRequirements level+findIncompletelyBookedKnowledgeRequirementsFor problemParameters timetableForWeek	= ToolShed.Data.Pair.mirror (+	\\ Data.Set.map Model.Lesson.getSubject (+		Data.Set.filter (completelyBookedByLesson problemParameters timetableForWeek !) $ Model.TimetableForWeek.extractDistinctLessons timetableForWeek+	) -- Remove fully-booked subjects.+ ) . Data.Student.getKnowledgeRequirements+
+ src-exe/WeekDaze/Dynamic/StudentViewTimetableUtilities.hs view
@@ -0,0 +1,954 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Contains utilities dependent on both the static data derived from either configuration or command-line options,+	& on the dynamic state of the current 'StudentView.Timetable.Timetable'.+-}++module WeekDaze.Dynamic.StudentViewTimetableUtilities(+-- * Types+-- ** Type-synonyms+	BookAtomically,+-- * Functions+	calculateAverageAbsoluteDeviationFromIdealTimeslotRequest,+--	calculateRemainingPlaces,+--	calculateUtilisationRatioByStudentBody,+	calculateWeightedMeanUtilisationRatio,+	countFreeLessons,+	countInterCampusMigrations,+	countInterCampusMigrationsByStudentBody,+	findMeanRatioOfIncompletelyBookedKnowledgeRequirements,+	findIncompletelyBookedKnowledgeRequirementsByStudentBody,+	calculateMeanFreePeriodCompliance,+	findExcessiveLessonRunlengthsByTimeByStudentBody,+	findShortLessonRunlengthsByTimeByStudentBody,+	locateLessonsBySynchronisationId,+	locateUnallocatedAvailableUnreservedCoordinates,+-- ** Mutators+	bookAtomicallyNothing,+--	bookAtomicallyMinimumConsecutiveLessons,+	bookAtomicallyWithRamifications,+-- ** Predicates+	isSuitableBooking,+	isTimetableValid+) where++import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import			Data.Set((\\))+import qualified	Control.Arrow+import qualified	Data.Array.Base+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Data.Set+import qualified	Data.Tuple+import qualified	Factory.Data.Interval+import qualified	Factory.Math.Statistics+import qualified	ToolShed.Data.List.Runlength+import qualified	ToolShed.Data.Pair+import qualified	ToolShed.Data.Triple+import qualified	WeekDaze.Aggregate.GroupCatalogue				as Aggregate.GroupCatalogue+import qualified	WeekDaze.Aggregate.StudentBody					as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentClass					as Aggregate.StudentClass+import qualified	WeekDaze.Data.Course						as Data.Course+import qualified	WeekDaze.Data.HumanResource					as Data.HumanResource+import qualified	WeekDaze.Data.Location						as Data.Location+import qualified	WeekDaze.Data.Requirements					as Data.Requirements+import qualified	WeekDaze.Data.Resource						as Data.Resource+import qualified	WeekDaze.Data.Student						as Data.Student+import qualified	WeekDaze.Dynamic.HumanViewTimetable				as Dynamic.HumanViewTimetable+import qualified	WeekDaze.Dynamic.StudentViewTimetableForWeekUtilities		as Dynamic.StudentViewTimetableForWeekUtilities+import qualified	WeekDaze.Dynamic.TeacherViewTimetableForWeekUtilities		as Dynamic.TeacherViewTimetableForWeekUtilities+import qualified	WeekDaze.Dynamic.TeacherViewTimetableUtilities			as Dynamic.TeacherViewTimetableUtilities+import qualified	WeekDaze.Dynamic.TimetableForWeekUtilities			as Dynamic.TimetableForWeekUtilities+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions		as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.LinearModel.Timetable					as LinearModel.Timetable+import qualified	WeekDaze.Model.Lesson						as Model.Lesson+import qualified	WeekDaze.Model.ResourceUser					as Model.ResourceUser+import qualified	WeekDaze.Model.Timetable					as Model.Timetable+import qualified	WeekDaze.Model.TimetableCoordinates				as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForDay					as Model.TimetableForDay+import qualified	WeekDaze.Model.TimetableForWeek					as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis			as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters			as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.ProblemConfiguration.TimetableValidationSwitches	as ProblemConfiguration.TimetableValidationSwitches+import qualified	WeekDaze.Size							as Size+import qualified	WeekDaze.StudentView.LessonResourceIds				as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable					as StudentView.Timetable+import qualified	WeekDaze.StudentView.TimetableCoordinates			as StudentView.TimetableCoordinates+import qualified	WeekDaze.StudentView.TimetableForWeek				as StudentView.TimetableForWeek+import qualified	WeekDaze.TeacherView.Timetable					as TeacherView.Timetable+import qualified	WeekDaze.Temporal.Day						as Temporal.Day+import qualified	WeekDaze.Temporal.Time						as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest				as Temporal.TimeslotRequest++{- |+	* Determines the remainder of the /knowledge-requirement/, of each /student-body/, yet to be booked (including ssubjects which haven't been booked at all).++	* CAVEAT: any element of the map returned, may be 'Data.Set.empty'.+-}+findIncompletelyBookedKnowledgeRequirementsByStudentBody :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			locationId,+	Ord			level,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Data.Map.Map Aggregate.StudentBody.StudentBody (Data.Student.KnowledgeRequirements level)+findIncompletelyBookedKnowledgeRequirementsByStudentBody problemParameters timetable	= Data.Map.mapWithKey (+	\studentBody -> Dynamic.StudentViewTimetableForWeekUtilities.findIncompletelyBookedKnowledgeRequirementsFor problemParameters (timetable ! studentBody)+ ) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters++{- |+	* Gets the average (weighted by /student-body/-size) over all /student-bodies/,+	of the ratio of core & optional /subject/s which are incompletely booked, to all /subject/-requirements.++	* CAVEAT: this calculation values all incomplelely booked /course/s equally,+	rather than preferring partially booked ones to completely unbooked ones.+	This dubious decision, is forced because of the difficulty in finding the extent to which a completely unbooked /knowledge-requirement/ falls short of the /course/'s /requiredLessonsPerWeek/,+	when the /course/ which satisfies this /knowledge-requirement/ hasn't yet been defined.++	* CAVEAT: the ratio of both missing core & missing optional /subject/s, is obtained by dividing by the total number of /subject/s required,+	since were core /subject/s normalised wrt to the total number of core /subject/s required,+	& optional /subject/s normalised wrt the total number of optional /subject/s required,+	one of these denominators could be zero (resulting in infinity), but the sum can't.+-}+findMeanRatioOfIncompletelyBookedKnowledgeRequirements :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		f,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Data.Requirements.Requirements f+findMeanRatioOfIncompletelyBookedKnowledgeRequirements problemParameters problemAnalysis timetable+	| nStudents == 0	= error "WeekDaze.Dynamic.StudentViewTimetableUtilities.findMeanRatioOfIncompletelyBookedKnowledgeRequirements:\tattempt to divide by zero (students)."+	| otherwise		= ToolShed.Data.Pair.mirror (+		(+			/ fromIntegral nStudents	-- Normalise wrt the total number of students.+		) . sum+	) . unzip . map (+		\(studentBody, studentProfile)	-> let+			nSubjectRequirements	= Data.Set.size $ Data.Student.deriveAmalgamatedKnowledgeRequirement studentProfile+		in if nSubjectRequirements == 0+			then error "WeekDaze.Dynamic.StudentViewTimetableUtilities.findMeanRatioOfIncompletelyBookedKnowledgeRequirements:\tattempt to divide by zero (subject-requirements)."+			else ToolShed.Data.Pair.mirror (+				(+					/ fromIntegral nSubjectRequirements	-- Normalise wrt the size of the amalgamated knowledge-requirement; which can't be zero.+				) . fromIntegral . (+					* Aggregate.StudentBody.getSize studentBody	-- Each student in the student-body has the same missing subject-requirement.+				) . Data.Set.size+			) $ Dynamic.StudentViewTimetableForWeekUtilities.findIncompletelyBookedKnowledgeRequirementsFor problemParameters (timetable ! studentBody) studentProfile+	) . Data.Map.toList $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+	where+		nStudents	= ProblemConfiguration.ProblemAnalysis.getNStudents problemAnalysis++{- |+	* Determines whether the specified /lesson/ can be booked in the /timetable/, at the specified /coordinates/.++	* Observes hard constraints; soft constraints are dealt with elsewhere, by measuring /lesson-criteria/.++	* CAVEAT: the caller should ensure that the the requested /lesson/ hasn't already been booked, since otherwise the required /resource/s will appear to be booked & 'False' will be returned.++	* CAVEAT: doesn't check whether there's already a /lesson/ booked at the specified coordinates, which may be overwritten,+	potentially disasterously if the overwritten /lesson/ had either a non-trivial /minimumConsecutiveLessons/ or was a member of a /synchronised course/.++	* CAVEAT: assumes that the /resource/s required for the proposed /lesson/, are regularly /available/ on the specified /day/;+	since this can be statically determined, it's more efficient to check externally.++	* CAVEAT: the order in which the checks are performed, significantly affects performance.+-}+isSuitableBooking :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level	-- ^ The /student/-view & /teacher/-view of the same /timetable/, prior to the proposed /booking/.+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level			-- ^ The proposed /lesson/ & the /coordinates/ at which it is to be booked.+	-> Bool+isSuitableBooking problemParameters executionOptions problemAnalysis timetablePair studentViewBooking@((studentBody, time), studentViewLesson)	= and [+	not $ ProblemConfiguration.ProblemAnalysis.areAnyResourcesBookedForGroupMeeting problemAnalysis time studentBody locationId teacherId,	-- Performing this check first, significantly reduces the number of viable bookings.+	not (+		StudentView.Timetable.areBookedResourcesAt studentViewTimetableForWeekBooking studentViewTimetable	-- Check whether either the location or the teacher, is already booked at the same time.+	) || and [+		permitTemporaryStudentBodyMerger,+		Model.Timetable.areMergeableWith studentViewTimetableForWeekBooking studentViewTimetable,	-- Check whether each of the current bookings are either identical or use neither of the required resources.+		Aggregate.StudentBody.getSize studentBody <= calculateRemainingPlaces problemParameters studentViewTimetable studentViewTimetableForWeekBooking,	-- Check whether both the location & the teacher, can cope with another student-body.+		Data.Student.getStream (studentBodyRegister ! studentBody) `Data.Set.member` Data.Set.map (+			Data.Student.getStream . (studentBodyRegister !)	-- There should only be no more than one stream in a single student-class.+		) (+			StudentView.Timetable.extractStudentClassAt studentViewTimetableForWeekBooking studentViewTimetable+		) -- Check that the student-body to be booked, has the same ability as the student-class into which it's to be merged.+	],+	not $ Dynamic.StudentViewTimetableForWeekUtilities.isSufficientlyBooked problemParameters studentViewTimetableForWeek studentViewLesson,	-- Check that insufficient lessons have been booked, to satisfy the course-requirements.+	not $ StudentView.Timetable.breaksRoutine studentViewTimetable studentBody studentViewLesson,	-- Check this booking doesn't break any routine established for the student-body, with either the location or the teacher.+	Dynamic.StudentViewTimetableForWeekUtilities.calculateUtilisationRatio problemParameters problemAnalysis studentBody (+		Model.TimetableForWeek.defineTimeslot (time, Just studentViewLesson) studentViewTimetableForWeek	-- Derive the proposed student-view timetable for the week.+	) <= 1,	-- Check that the student-body won't become overloaded.+	Dynamic.TeacherViewTimetableForWeekUtilities.calculateUtilisationRatio problemParameters problemAnalysis teacherId (+		TeacherView.Timetable.bookStudentViewLesson permitTemporaryStudentBodyMerger studentViewBooking teacherViewTimetable ! teacherId	-- Derive the proposed teacher-view timetable for the week.+	) <= 1,	-- Check that the teacher won't become overloaded.+	uncurry (||) . (+		not . Data.Course.isRigid &&& Data.Course.isASpecifiedTime time	-- By definition, a rigid course can only book at one of the fully specified times.+	) $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson+ ] where+	studentViewTimetableForWeekBooking		= Control.Arrow.first Model.TimetableCoordinates.getTime studentViewBooking+	studentBodyRegister				= ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+	permitTemporaryStudentBodyMerger		= ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions+	(studentViewTimetable, teacherViewTimetable)	= Dynamic.HumanViewTimetable.getStudentViewTimetable &&& Dynamic.HumanViewTimetable.getTeacherViewTimetable $ timetablePair	-- Deconstruct.+	studentViewTimetableForWeek			= studentViewTimetable ! studentBody+	(locationId, teacherId)				= StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId $ Model.Lesson.getResourceIds studentViewLesson	-- Deconstruct.++{- |+	* Validates a /timetable/, as required when it has been read from file.++	* Only the first error is returned, since it may compromise the stability of subsequent tests.+-}+isTimetableValid :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			synchronisationId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			synchronisationId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			teachingRatio,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The studentViewTimetable to validate.+	-> Maybe String								-- ^ Any error-message; 'Nothing' represents success.+isTimetableValid	problemParameters executionOptions problemAnalysis studentViewTimetable	= Data.Maybe.listToMaybe $ Data.Maybe.catMaybes [+-- Confirm the number of timeslots per day.+		let+			nTimeslotPerDay				= ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis+			incorrectNTimeslotsByStudentBodyByDay	= Data.Map.filter (not . null) $ Data.Map.map (+				filter (+					(/= nTimeslotPerDay) . snd {-numElements-}+				) . Data.Array.IArray.assocs . Data.Array.IArray.amap Data.Array.Base.numElements+			 ) studentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckTimeslotsPerDay timetableValidationSwitches) || Data.Map.null incorrectNTimeslotsByStudentBodyByDay+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkTimeslotsPerDayTag ++ ": the days for some student-bodies, have been subdivided into a different number of time-slots to that configured (i.e. " ++ show nTimeslotPerDay ++ "); " ++ show (Control.Arrow.first Aggregate.StudentBody.getMnemonic `map` Data.Map.toList incorrectNTimeslotsByStudentBodyByDay),++-- Confirm existance of all resources.+		let+			nonExistentLocationIds	= Data.Set.fromList locationIds \\ Data.Map.keysSet locationCatalogue+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckExistenceOfLocationIds timetableValidationSwitches) || Data.Set.null nonExistentLocationIds+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkExistenceOfLocationIdsTag ++ ": some referenced location-ids don't exist; " ++ show (Data.Set.toList nonExistentLocationIds),+		let+			nonExistentStudentBodies	= Data.Set.map Aggregate.StudentBody.toPair (Data.Map.keysSet studentViewTimetable) \\ Data.Set.map Aggregate.StudentBody.toPair (Data.Map.keysSet studentBodyRegister)	-- CAVEAT: avoid 'instance Eq StudentBody', which for efficiency only uses the mnemonic.+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckExistenceOfStudentBodies timetableValidationSwitches) || Data.Set.null nonExistentStudentBodies+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkExistenceOfStudentBodiesTag ++ ": some referenced student-bodies don't exist (or have different members); " ++ show (Control.Arrow.second Data.Set.toList `map` Data.Set.toList nonExistentStudentBodies),+		let+			nonExistentTeacherIds	= Data.Set.fromList teacherIds \\ Data.Map.keysSet teacherRegister+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckExistenceOfTeacherIds timetableValidationSwitches) || Data.Set.null nonExistentTeacherIds+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkExistenceOfTeacherIdsTag ++ ": some referenced teacher-ids don't exist; " ++ show (Data.Set.toList nonExistentTeacherIds),+-- Check availability of all booked resources.+		let+			unavailableResourcesByDay	= Data.Map.fromListWith (+				\(ll, sl, tl) (lr, sr, tr)	-> (+					ll `Data.Set.union` lr,+					sl `Data.Set.union` sr,+					tl `Data.Set.union` tr+				) -- Triple.+			 ) [+				(+					day,+					(unavailableLocationIds, unavailableStudentBodies, unavailableTeacherIds) -- Triple.+				) |+					(studentBody, studentViewTimetableForWeek)	<- Data.Map.toList studentViewTimetable,+					(day, studentViewTimetableForDay)		<- Data.Array.IArray.assocs studentViewTimetableForWeek,+					let+						bookedLessons	= Data.Maybe.catMaybes $ Data.Array.IArray.elems studentViewTimetableForDay++						(unavailableLocationIds, unavailableTeacherIds)	= (+							Data.Set.fromList . filter (+								not . Data.Resource.isAvailableOn day . (locationCatalogue !)+							) *** Data.Set.fromList . filter (+								not . Data.Resource.isAvailableOn day . (teacherRegister !)+							)+						 ) . unzip $ map (+							(StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId) . Model.Lesson.getResourceIds+						 ) bookedLessons++						unavailableStudentBodies+							| null bookedLessons || Data.Resource.isAvailableOn day (studentBodyRegister ! studentBody)	= Data.Set.empty+							| otherwise											= Data.Set.singleton studentBody,+					not $ Data.Set.null unavailableLocationIds && Data.Set.null unavailableStudentBodies && Data.Set.null unavailableTeacherIds+			 ] -- List-comprehension.+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckResourceAvailability timetableValidationSwitches) || Data.Map.null unavailableResourcesByDay+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkResourceAvailabilityTag ++ ": some resources have been booked on days when they're unavailable; " ++ show (+				Data.Map.toList $ Data.Map.map (+					\(l, s, t) -> (+						Data.Set.toList l,+						map Aggregate.StudentBody.getMnemonic $ Data.Set.toList s,+						Data.Set.toList t+					) -- Triple.+				) unavailableResourcesByDay+			),++-- Check that all booked subjects are supported by a service.+		let+			unsupportedSubjectsByTeacherId	= Data.Map.fromListWith Data.Set.union . map (+				StudentView.LessonResourceIds.getTeacherId . Model.Lesson.getResourceIds &&& Data.Set.singleton . Model.Lesson.getSubject+			 ) . filter (+				Data.Maybe.isNothing . ProblemConfiguration.ProblemAnalysis.lookupCourseFor problemParameters+			 ) $ map Model.Timetable.getBookedLesson linearStudentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckBookedSubjectsHaveService timetableValidationSwitches) || Data.Map.null unsupportedSubjectsByTeacherId+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkBookedSubjectsHaveServiceTag ++ ": some lessons are not supported by any service; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList unsupportedSubjectsByTeacherId),++-- Check for overloading of human-resources.+		let+			overloadedStudents	= Data.Map.filter (> 1) $ Data.Map.mapWithKey (+				Dynamic.StudentViewTimetableForWeekUtilities.calculateUtilisationRatio problemParameters problemAnalysis+			 ) studentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckForOverloadedStudentBodies timetableValidationSwitches) || Data.Map.null overloadedStudents+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkForOverloadedStudentBodiesTag ++ ": some student-bodies are overloaded; " ++ show (Control.Arrow.first Aggregate.StudentBody.getMnemonic `map` Data.Map.toList overloadedStudents),+		let+			overloadedTeachers	= Data.Map.filter (> 1) $ Data.Map.mapWithKey (+				Dynamic.TeacherViewTimetableForWeekUtilities.calculateUtilisationRatio problemParameters problemAnalysis+			 ) $ Dynamic.TeacherViewTimetableUtilities.fromStudentViewTimetable executionOptions problemAnalysis studentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckForOverloadedTeachers timetableValidationSwitches) || Data.Map.null overloadedTeachers+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkForOverloadedTeachersTag ++ ": some teachers are overloaded; " ++ show (Data.Map.toList overloadedTeachers),+-- Check that student-bodies have a requirement for all subjects which have been booked.+		let+			unrequiredSubjectsByStudentBody	= Data.Map.filter (not . Data.Set.null) . Data.Map.mapWithKey (+				\studentBody distinctSubjects	-> distinctSubjects \\ Data.Student.deriveAmalgamatedKnowledgeRequirement (studentBodyRegister ! studentBody)+			 ) $ Data.Map.map (+				Data.Set.map Model.Lesson.getSubject . Model.TimetableForWeek.extractDistinctLessons+			 ) studentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckBookedSubjectsAreRequired timetableValidationSwitches) || Data.Map.null unrequiredSubjectsByStudentBody+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkBookedSubjectsAreRequiredTag ++ ": some student-bodies are booked for subjects which they don't require; " ++ show (+				map (Aggregate.StudentBody.getMnemonic *** Data.Set.toList) $ Data.Map.toList unrequiredSubjectsByStudentBody+			),++-- Check that student-bodies aren't overbooked in any subject.+		let+			nOverbookedBySubjectByStudentBody	= Data.Map.filter (not . Data.Map.null) $ Data.Map.map (+				\studentViewTimetableForWeek -> Data.Map.fromList . filter ((> 0) . snd) . map (+					Model.Lesson.getSubject &&& negate . Dynamic.StudentViewTimetableForWeekUtilities.countUnbookedLessons problemParameters studentViewTimetableForWeek+				) . Data.Set.toList $ Model.TimetableForWeek.extractDistinctLessons studentViewTimetableForWeek+			 ) studentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckForOverbookedSubjects timetableValidationSwitches) || Data.Map.null nOverbookedBySubjectByStudentBody+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkForOverbookedSubjectsTag ++ ": some student-bodies are overbooked in some subjects; " ++ show (+				map (Aggregate.StudentBody.getMnemonic *** Data.Map.toList) $ Data.Map.toList nOverbookedBySubjectByStudentBody+			),++-- Check for clashes between bookings & meetings.+		let+			bookingsAtMeetingTime	= filter (+				\booking -> uncurry (+					uncurry (+						ProblemConfiguration.ProblemAnalysis.areAnyResourcesBookedForGroupMeeting problemAnalysis+					) . (+						Model.TimetableCoordinates.getTime &&& Model.TimetableCoordinates.getObserverId+					) $ Model.Timetable.getBookedCoordinates booking+				) . (+					StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId+				) . Model.Lesson.getResourceIds $ Model.Timetable.getBookedLesson booking+			 ) linearStudentViewTimetable+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckForBookingMeetingClash timetableValidationSwitches) || null bookingsAtMeetingTime+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkForBookingMeetingClashTag ++ ": some bookings have been made when some of their resources are required for a meeting; " ++ show (+				Control.Arrow.first (Control.Arrow.first Aggregate.StudentBody.getMnemonic) `map` bookingsAtMeetingTime+			),++-- Check for resource-conflicts.+		let+			timesWithIncompatibleBookings	= [+				time |+					day		<- Temporal.Day.range,+					timeslotId	<- ProblemConfiguration.ProblemAnalysis.getTimeslotIdRange problemAnalysis,+					let time = Temporal.Time.mkTime day timeslotId,+					not . Model.ResourceUser.areMutuallyMergeable $ Model.Timetable.extractSynchronousLessonsAt time studentViewTimetable+			 ] -- List-comprehension.+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckForResourceConflicts timetableValidationSwitches) || null timesWithIncompatibleBookings+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkForResourceConflictsTag ++ ": the lessons booked at some times have incompatible resource-requirements; " ++ show timesWithIncompatibleBookings,++-- Check for lessons booked at locations lacking either adequate capacity or facilities for their course.+		let+			misplacedLessonsByLocationId	= Data.Map.fromList [+				(locationId, (teacherId, Model.Lesson.getSubject lesson)) |+					booking@(_, lesson)	<- map (Model.TimetableCoordinates.getTime . Model.Timetable.getBookedCoordinates &&& Model.Timetable.getBookedLesson) linearStudentViewTimetable,+					let (locationId, teacherId)	= StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId $ Model.Lesson.getResourceIds lesson,	-- Deconstruct.+					not . Data.Location.isSuitable (+						Aggregate.StudentClass.getSize $ StudentView.Timetable.extractStudentClassAt booking studentViewTimetable+					) (+						Data.Course.getRequiredFacilityNames $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters lesson+					) $ locationCatalogue ! locationId+			 ] -- List-comprehension.+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckForMisplacedLessons timetableValidationSwitches) || Data.Map.null misplacedLessonsByLocationId+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkForMisplacedLessonsTag ++ ": some lessons have been booked at locations lacking either adequate capacity or the required facilities for their course; " ++ show (Data.Map.toList misplacedLessonsByLocationId),++-- Check the synchronisation of the lessons booked for synchronisedCourses.+		let+			teacherIdsBySynchronisationId			= Data.Map.map Data.Map.keysSet $ ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis+			timesSynchronisationIdAndMissingTeacherIds	= [+				(time, synchronisationId, Data.Set.toList missingTeacherIds) |+					day						<- Temporal.Day.range,+					timeslotId					<- ProblemConfiguration.ProblemAnalysis.getTimeslotIdRange problemAnalysis,+					let time = Temporal.Time.mkTime day timeslotId,+					(Just synchronisationId, synchronisedTeacherIds)	<- Data.Map.toList . Data.Map.fromListWith Data.Set.union . map (+						Data.Course.getMaybeSynchronisationId . ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters &&& Data.Set.singleton . StudentView.LessonResourceIds.getTeacherId . Model.Lesson.getResourceIds+					 ) $ Model.Timetable.extractSynchronousLessonsAt time studentViewTimetable,+					let missingTeacherIds = teacherIdsBySynchronisationId ! synchronisationId \\ synchronisedTeacherIds,+					not $ Data.Set.null missingTeacherIds+			 ] -- List-comprehension.+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckSynchronisedCourses timetableValidationSwitches) || null timesSynchronisationIdAndMissingTeacherIds+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkSynchronisedCoursesTag ++ ": there are times when some teachers of a set of synchronised courses haven't a lesson booked; " ++ show timesSynchronisationIdAndMissingTeacherIds,++-- Check minimumConsecutiveLessons.+		let+			coordinatesOfShortRunlengths	= [+				coordinates |+					booking		<- linearStudentViewTimetable,+					let+						(coordinates, course)			= Model.Timetable.getBookedCoordinates &&& ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . Model.Timetable.getBookedLesson $ booking+						(studentBody, (day, timeslotId))	= Model.TimetableCoordinates.getObserverId &&& (Temporal.Time.getDay &&& Temporal.Time.getTimeslotId) . Model.TimetableCoordinates.getTime $ coordinates,	-- Deconstruct.+					Data.Course.requiresConsecutiveLessons course,+					let findGeneralisedLessonRunlengthsByTimeslotId	= Model.Timetable.findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId studentViewTimetable ! studentBody Data.Array.IArray.! day,+					runlengthCode	<- map snd {-runlengthCode-} $ filter ((== timeslotId) . fst {-startingTimeslotId-}) findGeneralisedLessonRunlengthsByTimeslotId,+					ToolShed.Data.List.Runlength.getLength runlengthCode < Data.Course.getMinimumConsecutiveLessons course+			 ] -- List-comprehension.+		in if not (ProblemConfiguration.TimetableValidationSwitches.getCheckMinimumConsecutiveLessons timetableValidationSwitches) || null coordinatesOfShortRunlengths+			then Nothing+			else Just $ show ProblemConfiguration.TimetableValidationSwitches.checkMinimumConsecutiveLessonsTag ++ ": some lessons have been booked in shorter runlengths than required by their course; " ++ show (Control.Arrow.first Aggregate.StudentBody.getMnemonic `map` coordinatesOfShortRunlengths)+ ] where+	timetableValidationSwitches	= ProblemConfiguration.ProblemParameters.getTimetableValidationSwitches problemParameters+	locationCatalogue		= ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters+	studentBodyRegister		= ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+	teacherRegister			= ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters+	linearStudentViewTimetable	= LinearModel.Timetable.fromTimetable studentViewTimetable+	(locationIds, teacherIds)	= unzip $ map (+		(StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId) . Model.Lesson.getResourceIds . Model.Timetable.getBookedLesson+	 ) linearStudentViewTimetable++-- | The type of a function used to attempt to atomically book any /lesson/s associated with that specified, returning 'Nothing' if any were unsuccessful.+type BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+	= ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Data.Course.Course synchronisationId level timeslotId					-- ^ The /course/ to which the specified /lesson/ belongs.+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level				-- ^ The /lesson/, & the /coordinates/ at which it has been booked in the /timetable/.+	-> Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level		-- ^ The initial /timetable/ on which to operate, as seen from the perspective of both /student/s & /teacher/s.+	-> Maybe (Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level)	-- ^ Returns a /timetable-pair/ if the associated /booking/s were completed.++-- | Use when no bookings are required.+bookAtomicallyNothing :: BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+bookAtomicallyNothing _ _ _ _ _	= Just++{- |+	* If the runlength of the specified /lesson/ (assumed to have already been booked), is shorter than the /minimum consecutive lessons/ for the /course/,+	then book duplicates in any available adjacent undefined /time-slot/s, until this requirement is met.++	* 'bookAtomicallyWithRamifications' books all specific time requests, & then for each one, calls this function to satisfy /minimumConsecutiveLessons/.+	This function can therefore satisfy /minimumConsecutiveLessons/, not only by booking lessons into undefined timeslots, but by merging with identical lessons.++	* Given a choice between adjacent undefined /time-slot/s, prefer those which have been specifically requested,+	& failing that, those which are closer to any /ideal timeslot/ requested for the /course/.++	* If insufficient adjacent undefined /time-slot/s (or defined with the required /lesson/s) are available to grow a runlength of the required length,+	or any of the sequence of /booking/s, sequentially applied to the /timetable/, fails 'isSuitableBooking',+	then return 'Nothing'.++	* After successfully booking all these /lesson/s, calls the specified /continuation/-function to book any /synchronised course/s.+-}+bookAtomicallyMinimumConsecutiveLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			synchronisationId,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			timeslotId,+	Show			teacherId+ )+	=> BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Continuation.+	-> BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+bookAtomicallyMinimumConsecutiveLessons continuation problemParameters executionOptions problemAnalysis course studentViewBooking {-already booked-} timetablePair+	| minimumConsecutiveLessons == 1 || consecutiveLessonShortage <= 0	= continuation problemParameters executionOptions problemAnalysis course studentViewBooking timetablePair	-- Shortage may be negative, if consecutive specified time-slots exceeds 'Data.Course.getMinimumConsecutiveLessons'.+	| otherwise	= Data.Maybe.listToMaybe {-select the most suitable timetable-} . Data.Maybe.mapMaybe (+		(+			\requiredAdjacentBookings -> foldr (+				(=<<) . continuation problemParameters executionOptions problemAnalysis course	-- Take the Booking & the Maybe TimetablePair & pass them to the continuation; if the latter is 'Nothing' then that's merely academic.+			) (+				Dynamic.HumanViewTimetable.bookAtomically (+					ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions+				) (+					isSuitableBooking problemParameters executionOptions problemAnalysis	-- Partially apply the predicate; it now merely requires a TimetablePair & Booking.+				) timetablePair requiredAdjacentBookings	-- Construct an initial TimetablePair, by validating & booking the required adjacent lessons. Returns 'Nothing' if any booking fails the predicate.+			) $ studentViewBooking : requiredAdjacentBookings	-- Forward all the required bookings including the original, to the continuation.+		) . map (+			flip (,) studentViewLesson . (,) studentBody . Temporal.Time.mkTime day	-- Construct a booking from each undefined timeslotId.+		) . filter (+			Data.Maybe.isNothing . (studentViewTimetableForDay Data.Array.IArray.!)	-- There's no need to account for any bookings with which this runlength was merged.+		) . map fst {-timeslotIds-}+	) . Data.List.sortBy (+		Data.Ord.comparing $ (+			\(primarySortCriterion, secondarySortCriterion, tertiarySortCriterion)	-> (+				length $ filter not primarySortCriterion,	-- Minimise the number of unspecified times included in the span, & therefore the number of additional bookings required (since any specified times have already been booked by 'bookAtomicallyWithRamifications').+				sum secondarySortCriterion,			-- Minimise blocking of synchronous synchronised courses in which we're interested.+				maximum tertiarySortCriterion			-- Minimise the maximum distance from any ideal timeslotId; 'Nothing' compares less than 'Just'.+			) -- Triple.+		) . unzip3 . map snd {-sort-criteria-}+	) . map (+		take consecutiveLessonShortage	-- Take the required length from the start of each tail, which includes the booked coordinates, so there's no gap.+	) . take (+		succ {-fence-post-} $ length adjacentSuitableTimeslotIds - consecutiveLessonShortage	-- Take the shrinking tails until they're insufficiently long to satisfy the shortage.+	) . Data.List.tails $ map (+		\adjacentSuitableTimeslotId -> (+			adjacentSuitableTimeslotId,+			let+				adjacentSuitableTime	= Temporal.Time.mkTime day adjacentSuitableTimeslotId+			in (+				Temporal.TimeslotRequest.isASpecifiedTime adjacentSuitableTime timeslotRequest,									-- Primary sort-criterion.+				length {-count-} . filter (+					Data.Set.member studentBody . (+						ProblemConfiguration.ProblemAnalysis.getStudentBodiesBySynchronisationId problemAnalysis !+					) -- Select synchronous synchronised courses in which we've an interest.+				) . Data.Maybe.catMaybes . filter (+					/= Data.Course.getMaybeSynchronisationId course	-- We're looking for problems, so a match for the current course can be ignored.+				) . map (+					Data.Course.getMaybeSynchronisationId . ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters+				) $ Model.Timetable.extractSynchronousLessonsAt adjacentSuitableTime studentViewTimetable,							-- Secondary sort-criterion.+				Temporal.Time.calculateAbsoluteDistance adjacentSuitableTimeslotId `fmap` Temporal.TimeslotRequest.getMaybeIdealTimeslotId timeslotRequest	-- Tertiary sort-criterion.+			) -- Triple of sort-criteria.+		) -- Pair.+	) adjacentSuitableTimeslotIds+	where+		((studentBody, (day, timeslotId)), studentViewLesson)	= (+			Model.TimetableCoordinates.getObserverId &&& (+				Temporal.Time.getDay &&& Temporal.Time.getTimeslotId+			) . Model.TimetableCoordinates.getTime+		 ) . Model.Timetable.getBookedCoordinates &&& Model.Timetable.getBookedLesson $ studentViewBooking	-- Deconstruct.++		studentViewTimetable		= Dynamic.HumanViewTimetable.getStudentViewTimetable timetablePair	-- Access.+		studentViewTimetableForDay	= studentViewTimetable ! studentBody Data.Array.IArray.! day	-- Lookup.+		adjacentSuitableTimeslotIds	= uncurry (++) . Control.Arrow.first reverse {-chronological order-} . ToolShed.Data.Pair.mirror (+			map Model.TimetableForDay.getTimeslotId . take consecutiveLessonShortage {-ensure that the new runlength reaches the booked lesson-} . takeWhile (+				Data.Maybe.maybe True {-undefined-} (+					== studentViewLesson	-- We could merge the current runlength with a separated span of identical lessons.+				) . Model.TimetableForDay.getMaybeLesson	-- Find space into which the required runlength can be grown.+			) . dropWhile (+				(== Just studentViewLesson) . Model.TimetableForDay.getMaybeLesson	-- Traverse any adjacent runlength.+			)+		 ) $ Model.TimetableForDay.bisectAt timeslotId studentViewTimetableForDay {-extract generalised bookings in two halves surrounding a gap @ the pre-booked coordinates-}++		minimumConsecutiveLessons, consecutiveLessonShortage :: Size.NTimeslots+		(minimumConsecutiveLessons, timeslotRequest)	= Data.Course.getMinimumConsecutiveLessons &&& Data.Course.getTimeslotRequest $ course	-- Deconstruct.+		consecutiveLessonShortage			= minimumConsecutiveLessons - Model.TimetableForDay.countRunlengthAt timeslotId studentViewTimetableForDay++{- |+	* Makes the specified /booking/.++	* If the /course/ to which the proposed /lesson/ belongs, defines any specified /time/s (even if it's not the proposed /lesson/ itself), then it attempts to book them all also.++	* Then having made the originally booking, with similar /lesson/s at any specifically requested times, calls 'bookAtomicallyMinimumConsecutiveLessons' for each /booking/ (including the original),+	to account for the possibility that the /course/ they share, mandates a non-trivial 'Data.Course.getMinimumConsecutiveLessons'.++	* If any of the /booking/s (including the original), sequentially applied to the /timetable/, fails 'isSuitableBooking', then return 'Nothing'.++	* CAVEAT: it is assumed that no /lesson/ is booked at the specified /coordinates/, since this will be obliterated;+	otherwise an existing run of identical /lesson/s used to meet /minimumConsecutiveLessons/ may be compromised.++	* CAVEAT: any additional /lesson/s required at /specified time/s, may result in deletion of previous /booking/s (even those for /synchronised course/s),+	on the grounds that there's no alternative /coordinate/ at which to book them.++	* TODO: All specifically requested times booked before forwarding the resulting timetable to bookAtomicallyMinimumConsecutiveLessons,+	which then finds it can't book thre required minimumConsecutiveLessons since it bumps into some of those just made, even though they're of the correct type (which it doesn't check).+	The reason it doesn't check is that joining with an existing /lesson/ may result in too long a span.+-}+bookAtomicallyWithRamifications :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Continuation.+	-> BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+bookAtomicallyWithRamifications continuation problemParameters executionOptions problemAnalysis course studentViewBooking timetablePair+	| Data.Foldable.any (+		uncurry (||) . (+			not . (+				$ (+					(+						ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters !+					) . Model.TimetableCoordinates.getObserverId {-studentBody-} . Model.Timetable.getBookedCoordinates &&& (+						ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters !+					) . StudentView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds . Model.Timetable.getBookedLesson+				) studentViewBooking -- The original booking requires a resource which is unavailable on a specified day; there's no need to check the teacher who's offering the course, since they must be available on all specified days.+			) . Data.Resource.isAvailableOn . Temporal.Time.getDay . Model.TimetableCoordinates.getTime &&& (+				`Model.Timetable.isDefinedTimeslot` studentViewTimetable+			) -- A different lesson has already been booked @ one of the specified times; & it can't easily be removed, since it may have a non-trivial minimumConsecutiveLessons or be from a synchronised course. By not booking any of the specified times, an alternative course is still an option.+		) . Model.Timetable.getBookedCoordinates {-discard the booked lesson-}+	) specifiedBookings		= Nothing+	| otherwise			= let+		requiredBookings	= Data.Set.insert studentViewBooking specifiedBookings	-- Include the original booking (if it hasn't already been), which is assumed to be currently unbooked.+	in Data.Set.foldr (+		(=<<) . bookAtomicallyMinimumConsecutiveLessons continuation problemParameters executionOptions problemAnalysis course -- Attempt to book the minimum consecutive lessons.+	) (+		Dynamic.HumanViewTimetable.bookAtomically (+			ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions+		) (+			isSuitableBooking problemParameters executionOptions problemAnalysis	-- Partially apply the predicate; it now merely requires a TimetablePair & Booking.+		) timetablePair requiredBookings	-- Construct an initial TimetablePair, from the original booking copied to any times specified by the course. Returns 'Nothing' is any booking fails 'isSuitableBooking'.+	) requiredBookings+	where+		studentViewTimetable	= Dynamic.HumanViewTimetable.getStudentViewTimetable timetablePair	-- Access.+		specifiedBookings	= Data.Set.filter (+			not . (`Model.Timetable.isBookedWith` studentViewTimetable)	-- Ignore any of the times specified for the course, @ which the required booking has already been made.+		 ) . Data.Set.map (+			\time -> Control.Arrow.first {-coordinates-} (+				Control.Arrow.second $ const time	-- Replace the booking-time with the one specified for the course. Books with the same teacher, into the same location, to avoid breaking routine, since this is required by 'isSuitableBooking'.+			) studentViewBooking+		 ) . Temporal.TimeslotRequest.getSpecifiedTimes $ Data.Course.getTimeslotRequest course++-- | The number of places still available for /student/s, at the specified time, in the /location/ & by the /teacher/, defined by the specified /lesson/.+calculateRemainingPlaces :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.TimetableForWeek.Booking timeslotId locationId teacherId level	-- ^ The proposed /booking/.+	-> Size.NStudents+calculateRemainingPlaces problemParameters timetable studentViewTimetableForWeekBooking	= ProblemConfiguration.ProblemAnalysis.countStudentPlaces problemParameters (+	ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson+ ) (+	StudentView.LessonResourceIds.getLocationId $ Model.Lesson.getResourceIds studentViewLesson+ ) - Aggregate.StudentClass.getSize (StudentView.Timetable.extractStudentClassAt studentViewTimetableForWeekBooking timetable) where+	studentViewLesson	= Model.TimetableForWeek.getBookedLesson studentViewTimetableForWeekBooking++{- |+	* For all /lesson/-definitions, finds the /average absolute deviation/ (<https://en.wikipedia.org/wiki/Absolute_deviation#Average_absolute_deviation>),+	between the /time-slot/ at which they were booked, & any /ideal timeslot-request/ for the /course/.++	* Finds the /average/, by weighting each time-difference by the size of the /student-body/ for whom it was booked,+	& dividing by the total number of /student/s involved.++	* If the /course/ corresponding to the /lesson/ at the specified /time-slot/, also specifies a /minimum consecutive lesson/, then one cannot simultaneously satisfy both criteria.+	Under these circumstances one measures the /average signed deviation/ of the runlength of consecutive /lesson/s from the /ideal timeslot-request/, & applies it to each member of the runlength.+	This results in a lower value than the /average absolute deviation/ when the runlength bridges the /ideal timeslot-request/, because some deviations cancel those at the opposite end of the span.+	E.g. if the /minimum consecutive lessons/ is 3, & the /ideal time-slot/ is in the middle of the observed runlength,+	the the deviation attributed to each member is /[0, 0, 0]/, rather than /[1, 0, 1]/.++	* Instead of measuring the signed deviation from the /ideal timeslot-request/,+	one actually measures the signed deviation from the closest to the ideal than can be achieved given the specified /minimum consecutive lessons/.+	This avoids disadvantaging booking of /lesson/s in /course/s whose /ideal timeslot-request/ can't be achieved as an average of the /lesson/s in the runlength required by the /minimum consecutive lessons/.+	E.g. if @timeslotIdBounds = (0,4)@, @idealTimeslotId = 0@, & @minimumConsecutiveLessons = 3@, then measure the deviation wrt one rather than zero.+-}+calculateAverageAbsoluteDeviationFromIdealTimeslotRequest :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			locationId,+	Fractional		deviation,+	Ord			level,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> deviation+calculateAverageAbsoluteDeviationFromIdealTimeslotRequest problemParameters problemAnalysis timetable+	| Data.Set.null (+		ProblemConfiguration.ProblemAnalysis.getSubjectsWithAnIdealTimeslotRequest problemAnalysis+	) || denominator == 0	= 0					-- Zero student-bodies are affected by deviations from ideal timeslot-requests, so there's zero significance.+	| denominator == 0	= error "WeekDaze.Dynamic.StudentViewTimetableUtilities.calculateAverageAbsoluteDeviationFromIdealTimeslotRequest:\tattempt to divide by zero (lessons)."+	| otherwise		= numerator / fromIntegral denominator	-- Average over all courses which request an ideal timeslot-request.+	where+		(minTimeslotIdBound, maxTimeslotIdBound)	= Factory.Data.Interval.getMinBound &&& Factory.Data.Interval.getMaxBound $ ProblemConfiguration.ProblemParameters.getTimeslotIdBounds problemParameters+		(numerator, denominator)			= Data.Map.foldrWithKey (+			\studentBody studentViewTimetableForWeek	-> let+				nStudents :: Size.NStudents+				nStudents	= Aggregate.StudentBody.getSize studentBody+			in uncurry (***) . (+				(+) . (* fromIntegral nStudents) *** (+) . (* nStudents)	-- Independently accumulate the numerator & denominator, each weighted by the size of the student-body.+			) $ Data.Foldable.foldr (+				\studentViewTimetableForDay total	-> foldr (+					\(timeslotId, maybeStudentViewLesson) total'	-> let+						(minimumConsecutiveLessons, maybeIdealTimeslot)	= Data.Course.getMinimumConsecutiveLessons &&& Temporal.TimeslotRequest.getMaybeIdealTimeslotId . Data.Course.getTimeslotRequest $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters $ Data.Maybe.fromJust maybeStudentViewLesson+						(runlengthBounds, runLengthSpan)		= Model.TimetableForDay.measureRunlengthAt timeslotId studentViewTimetableForDay+					in Data.Maybe.maybe total' (+						\idealTimeslotId -> (+							(+								if minimumConsecutiveLessons > 1+									then (+										/ fromIntegral runLengthSpan	-- Divide the discrepancy evenly over all lessons in the observed runlength.+									) . fromIntegral . (+										floor {-fractional improvements can't be achieved-} :: Rational -> Size.NTimeslots+									) . abs . (+										+ (+											negate . max (+												(/ 2) . fromIntegral $ pred {-fence-post-} (fromEnum minTimeslotIdBound * 2) + minimumConsecutiveLessons	-- The mid-point of a span of minimumConsecutiveLessons starting at the first timeslot.+											) . min (+												(/ 2) . fromIntegral $ succ {-fence-post-} (fromEnum maxTimeslotIdBound * 2) - minimumConsecutiveLessons	-- The mid-point of a span of minimumConsecutiveLessons ending at the last timeslot.+											) . fromIntegral $ fromEnum idealTimeslotId+										) -- Measure the signed distance from, the closest to the ideal timeslot-request that can actually be achieved given the specified minimumConsecutiveLessons.+									) . (+										/ 2	-- Find the mid-point of the observed runlength.+									) . fromIntegral . uncurry (+) $ ToolShed.Data.Pair.mirror fromEnum runlengthBounds+									else fromIntegral $ Temporal.Time.calculateAbsoluteDistance idealTimeslotId timeslotId+							) ++						) *** succ {-count lessons whose course specifies an ideal timeslotId-} $ total'+					) maybeIdealTimeslot+				) total . filter (+					Data.Maybe.maybe False (+						(`Data.Set.member` ProblemConfiguration.ProblemAnalysis.getSubjectsWithAnIdealTimeslotRequest problemAnalysis) . Model.Lesson.getSubject	-- Include only those lessons for which there's a possibility that the corresponding course has an ideal timeslot-request.+					) . snd {-maybe lesson-}+				) $ Data.Array.IArray.assocs studentViewTimetableForDay+			) (0, 0) studentViewTimetableForWeek	-- One could select only those days on which the studentBody is available, but is saves no time.+		 ) (0, 0) timetable++{- |+	The number of /lesson/s booked for each /student-body/, relative to the required limit of their maximum workload;+	based on 'Model.Timetable.calculateUtilisationRatioByObserverId'.+-}+calculateUtilisationRatioByStudentBody+	:: (Data.Array.IArray.Ix timeslotId, RealFrac teachingRatio)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Data.Map.Map Aggregate.StudentBody.StudentBody teachingRatio+calculateUtilisationRatioByStudentBody problemParameters problemAnalysis	= Model.Timetable.calculateUtilisationRatioByObserverId (ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters) (ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis)++-- | The weighted mean over all /student-bodies/, of the number of /lesson/s booked, relative to the required limit of their maximum workload.+calculateWeightedMeanUtilisationRatio+	:: (Data.Array.IArray.Ix timeslotId, RealFrac teachingRatio)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> teachingRatio+calculateWeightedMeanUtilisationRatio problemParameters problemAnalysis timetable	= Factory.Math.Statistics.getWeightedMean . map (+	Data.Tuple.swap . Control.Arrow.first Aggregate.StudentBody.getSize {-weight this result-}+ ) . Data.Map.toList $ calculateUtilisationRatioByStudentBody problemParameters problemAnalysis timetable++{- |+	* Counts the total number of unallocated /time-slot/s for all /student/s in one week;+	discounting /day/s on which the /student-body/ is un/available/, & also /time-slot/s which are allocated to either free-study or /meeting/s.++	* The results for each /student-body/ are multiplied by the number of /student/s in the body.+-}+countFreeLessons+	:: (Data.Array.IArray.Ix timeslotId, RealFrac teachingRatio)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Size.NTimeslots+countFreeLessons problemParameters problemAnalysis = Data.Map.foldrWithKey (+	\studentBody -> let+		studentProfile	= ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters ! studentBody+	in (+) . (+		* Aggregate.StudentBody.getSize studentBody	-- Weight according to the number of students affected.+	) . subtract (+		Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching (ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis) studentProfile	-- Includes both free study & meetings.+	) . Model.TimetableForWeek.countUnallocatedAvailableTimeslots studentProfile+ ) 0++-- | Counts the total number of times /student/s must change /campus/ within a /day/, during the /week/.+countInterCampusMigrations :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			campus,+	Ord			locationId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Size.NTimeslots+countInterCampusMigrations problemParameters	= Data.Foldable.sum . countInterCampusMigrationsByStudentBody problemParameters++-- | Constructs a map indexed by /student-body/ of the number of inter-/campus/ migrations of /student/s, within a /day/, during the week.+countInterCampusMigrationsByStudentBody :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			campus,+	Ord			locationId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.Timetable.InterCampusMigrationsByStudentBody+countInterCampusMigrationsByStudentBody problemParameters studentViewTimetable	= Data.Map.mapWithKey (+	\studentBody studentProfile	-> Aggregate.StudentBody.getSize studentBody * Dynamic.TimetableForWeekUtilities.countInterCampusMigrations problemParameters studentProfile StudentView.LessonResourceIds.getLocationId (studentViewTimetable ! studentBody)+ ) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters++{- |+	Calculates the mean, over those /day/s on which the /student-body/ is /available/,+	of the ratio of those free (neither booked with a /lesson/, not reserved for a /meeting/) /time-slots/ which comply with the specified preference,+	to the total number of free /time-slot/s.+-}+calculateMeanFreePeriodCompliance :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		ratio,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> ratio+calculateMeanFreePeriodCompliance problemParameters	= Model.Timetable.calculateMeanFreePeriodCompliance (+	ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+ ) (+	Aggregate.GroupCatalogue.getMeetingTimes (ProblemConfiguration.ProblemParameters.getGroupCatalogue problemParameters) . Data.HumanResource.getGroupMembership+ )++{- |+	* Find sessions of identical consecutive /lesson/s which are longer than the /idealConsecutiveLessons/, for the /course/ to which they belong.++	* Sessions which are longer than /minimumConsecutiveLessons/ are necessary when /requiredLessonsPerWeek/ isn't an integral multiple,+	but sessions longer than the rounded-up value of /idealConsecutiveLessons/ are neither necessary nor desirable.++	* CAVEAT: sessions which are longer than /minimumConsecutiveLessons/ are also necessary when the required /resource/s are simultaneously /available/ on fewer /day/s+	than @ requiredLessonsPerWeek / minimumConsecutiveLessons @,+	but that isn't addressed here.+-}+findExcessiveLessonRunlengthsByTimeByStudentBody :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.Timetable.LessonRunlengthByStudentBody timeslotId locationId teacherId level+findExcessiveLessonRunlengthsByTimeByStudentBody problemParameters	= Data.Map.map (+	\generalisedLessonRunlengthsByTimeslotIdByDay -> [+		(Temporal.Time.mkTime day startingTimeslotId, (runlength, studentViewLesson)) |+		(day, generalisedLessonRunlengthsByTimeslotId)			<- Data.Array.IArray.assocs generalisedLessonRunlengthsByTimeslotIdByDay,+		(startingTimeslotId, (runlength, Just studentViewLesson))	<- generalisedLessonRunlengthsByTimeslotId,	-- Select bookings.+		runlength > 1,	-- Select runlengths which might be too long.+		let+			idealConsecutiveLessons :: Rational+			idealConsecutiveLessons	= Data.Course.calculateIdealConsecutiveLessons $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson,+		runlength > ceiling {-round up-} idealConsecutiveLessons+	] -- List-comprehension.+ ) . Model.Timetable.findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId++{- |+	* Find sessions of identical consecutive /lesson/s which are shorter than the /minimumConsecutiveLessons/, for the /course/ to which they belong.++	* CAVEAT: if this occurs, then there's a coding-error.+-}+findShortLessonRunlengthsByTimeByStudentBody :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.Timetable.LessonRunlengthByStudentBody timeslotId locationId teacherId level+findShortLessonRunlengthsByTimeByStudentBody problemParameters	= Data.Map.map (+	\generalisedLessonRunlengthsByTimeslotIdByDay -> [+		(Temporal.Time.mkTime day startingTimeslotId, (runlength, studentViewLesson)) |+		(day, generalisedLessonRunlengthsByTimeslotId)			<- Data.Array.IArray.assocs generalisedLessonRunlengthsByTimeslotIdByDay,+		(startingTimeslotId, (runlength, Just studentViewLesson))	<- generalisedLessonRunlengthsByTimeslotId,	-- Select bookings.+		runlength < Data.Course.getMinimumConsecutiveLessons (ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson)+	] -- List-comprehension.+ ) . Model.Timetable.findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId++{- |+	* Locate any /lesson/s booked for /synchronised course/s.++	* CAVEAT: doesn't reference /synchronised course/s for which nothing has been booked.+-}+locateLessonsBySynchronisationId :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Ord			synchronisationId,+	Ord			teacherId+ )	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Data.Map.Map synchronisationId (StudentView.TimetableCoordinates.Vector timeslotId)+locateLessonsBySynchronisationId problemParameters studentViewTimetable	= Data.Map.fromListWith (++) [+	(synchronisationId, [bookedCoordinates]) |+		(Just synchronisationId, bookedCoordinates)	<- map (+			Data.Course.getMaybeSynchronisationId . ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . Model.Timetable.getBookedLesson &&& Model.Timetable.getBookedCoordinates+		) $ LinearModel.Timetable.fromTimetable studentViewTimetable+ ] -- List-comprehension.++{- |+	Locates unallocated /coordinates/ in the specified /timetable/,+	omitting any /day/s on which the /student-body/ is un/available/, & any /coordinate/ reserved by the /student-body/ for a /meeting/.+-}+locateUnallocatedAvailableUnreservedCoordinates+	:: Data.Array.IArray.Ix timeslotId+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.TimetableCoordinates.Vector timeslotId+locateUnallocatedAvailableUnreservedCoordinates problemParameters problemAnalysis	= Model.Timetable.locateUnallocatedAvailableUnreservedCoordinates (+	Data.Map.map ToolShed.Data.Triple.getSecond {-discard the sets of locationIds & teacherIds which are booked for meetings-} $ ProblemConfiguration.ProblemAnalysis.getMeetingResourcesByTime problemAnalysis+ ) (+	ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+ )
+ src-exe/WeekDaze/Dynamic/TeacherViewTimetableForWeekUtilities.hs view
@@ -0,0 +1,59 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Contains utilities dependent on both the static data derived from either configuration or command-line options,+	& on the dynamic state of the current 'TeacherView.TimetableForWeek.TimetableForWeek'.+-}++module WeekDaze.Dynamic.TeacherViewTimetableForWeekUtilities(+-- * Functions+	calculateUtilisationRatio+) where++import			Data.Map((!))+import qualified	Data.Array.IArray+import qualified	WeekDaze.Model.TimetableForWeek			as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis	as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters	as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.TeacherView.TimetableForWeek		as TeacherView.TimetableForWeek++{- |+	* The number of /lesson/s booked for the specified /teacher/, relative to the portion of the week for which they're contracted to teach.++	* This factors into the denominator, both the 'Temporal.Availability.Availability' of the /teacher/ (who may be part-time),+	& the ratio of that working-time for which they're contracted to teach rather than administer.+-}+calculateUtilisationRatio :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> teacherId+	-> TeacherView.TimetableForWeek.TimetableForWeek timeslotId locationId level+	-> teachingRatio+calculateUtilisationRatio problemParameters problemAnalysis teacherId	= Model.TimetableForWeek.calculateUtilisationRatio (+	ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis+ ) $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters ! teacherId+
+ src-exe/WeekDaze/Dynamic/TeacherViewTimetableUtilities.hs view
@@ -0,0 +1,348 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Contains utilities dependent on both the static data derived from either configuration or command-line options,+	& on the dynamic state of the current 'TeacherView.Timetable.Timetable'.+-}++module WeekDaze.Dynamic.TeacherViewTimetableUtilities(+-- * Functions+	calculateUtilisationRatioByTeacherId,+	calculateAverageAbsoluteDeviationInUtilisationRatio,+	countFreeLessons,+	countInterCampusMigrations,+	countInterCampusMigrationsByTeacherId,+	calculateMeanFreePeriodCompliance,+	findUnbookedSpecifiedTimesByTeacherId,+	calculateRatioOfAsynchronousLessonsInSynchronisedCourses,+	calculateMeanRatioOfStudentClassSizeToLocationCapacity,+-- ** Translation+	fromStudentViewTimetable+) where++import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import			Data.Set((\\))+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Set+import qualified	Factory.Math.Statistics+import qualified	WeekDaze.Aggregate.GroupCatalogue			as Aggregate.GroupCatalogue+import qualified	WeekDaze.Aggregate.StudentClass				as Aggregate.StudentClass+import qualified	WeekDaze.Data.Course					as Data.Course+import qualified	WeekDaze.Data.HumanResource				as Data.HumanResource+import qualified	WeekDaze.Data.Location					as Data.Location+import qualified	WeekDaze.Data.Teacher					as Data.Teacher+import qualified	WeekDaze.Dynamic.TimetableForWeekUtilities		as Dynamic.TimetableForWeekUtilities+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.LinearModel.TimetableForWeek			as LinearModel.TimetableForWeek+import qualified	WeekDaze.Model.Lesson					as Model.Lesson+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size						as Size+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.TeacherView.LessonResourceIds			as TeacherView.LessonResourceIds+import qualified	WeekDaze.TeacherView.Timetable				as TeacherView.Timetable+import qualified	WeekDaze.Temporal.TimeslotRequest			as Temporal.TimeslotRequest++-- | A convenient interface to 'TeacherView.Timetable.fromStudentViewTimetable'.+fromStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level							-- ^ The /timetable/ to invert.+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+fromStudentViewTimetable executionOptions problemAnalysis	= TeacherView.Timetable.fromStudentViewTimetable (+	ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions+ ) $ ProblemConfiguration.ProblemAnalysis.getFreeTeacherViewTimetable problemAnalysis++{- |+	The number of /lesson/s booked for each /teacher/, relative to the contractual limit of their teaching-time;+	based on 'Model.Timetable.calculateUtilisationRatioByObserverId'.+-}+calculateUtilisationRatioByTeacherId :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+	-> Data.Map.Map teacherId teachingRatio+calculateUtilisationRatioByTeacherId problemParameters problemAnalysis	= Model.Timetable.calculateUtilisationRatioByObserverId (ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters) (ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis)++-- | Measures the /average absolute deviation/ (<https://en.wikipedia.org/wiki/Absolute_deviation#Average_absolute_deviation>) in the relative /workload/ amongst /teacher/s.+calculateAverageAbsoluteDeviationInUtilisationRatio :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		average,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Static configuration-data.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level									-- ^ The natural view from which to extract the required results.+	-> average+calculateAverageAbsoluteDeviationInUtilisationRatio problemParameters problemAnalysis	= Factory.Math.Statistics.getAverageAbsoluteDeviation . calculateUtilisationRatioByTeacherId problemParameters problemAnalysis++{- |+	Counts the total number of unallocated /time-slot/s for all /teacher/s in one week,+	discounting /day/s on which the /teacher/ is unavailable, & also /time-slot/s which are allocated to either administration or /meeting/s.+-}+countFreeLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+	-> Size.NTimeslots+countFreeLessons problemParameters problemAnalysis = Data.Map.foldrWithKey (+	\teacherId -> let+		teacherProfile	= ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters ! teacherId+	in (+) . subtract (+		Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching (ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis) teacherProfile	-- Includes both administration & meetings.+	) . Model.TimetableForWeek.countUnallocatedAvailableTimeslots teacherProfile+ ) 0++-- | Counts the total number of times /teacher/s must change /campus/ within a /day/, during the /week/.+countInterCampusMigrations :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			campus,+	Ord			locationId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+	-> Size.NTimeslots+countInterCampusMigrations problemParameters	= Data.Foldable.sum . countInterCampusMigrationsByTeacherId problemParameters++-- | Constructs a map indexed by /teacher-id/ of the number of inter-/campus/ migrations of /teacher/s, within a /day/, during the week.+countInterCampusMigrationsByTeacherId :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			campus,+	Ord			locationId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+	-> TeacherView.Timetable.InterCampusMigrationsByTeacherId teacherId+countInterCampusMigrationsByTeacherId problemParameters teacherViewTimetable	= Data.Map.mapWithKey (+	\teacherId teacherProfile	-> Dynamic.TimetableForWeekUtilities.countInterCampusMigrations problemParameters teacherProfile TeacherView.LessonResourceIds.getLocationId $ teacherViewTimetable ! teacherId+ ) $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters++{- |+	Calculates the mean, over those /day/s on which the /teacher/ is available,+	of the ratio of those free (neither booked with a /lesson/, not reserved for a /meeting/) /time-slot/s which comply with the specified preference,+	to the total number of free /time-slot/s.+-}+calculateMeanFreePeriodCompliance :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		ratio,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level	-- ^ The /timetable/ as seen from the /teacher/'s perspective.+	-> ratio+calculateMeanFreePeriodCompliance problemParameters	= Model.Timetable.calculateMeanFreePeriodCompliance (+	ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters+ ) (+	Aggregate.GroupCatalogue.getMeetingTimes (ProblemConfiguration.ProblemParameters.getGroupCatalogue problemParameters) . Data.HumanResource.getGroupMembership+ )++-- | Map by /teacherId/, the /time/s specified by the /course/, which haven't been booked, for /course/s which have.+findUnbookedSpecifiedTimesByTeacherId :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+	-> TeacherView.Timetable.TimesByTeacherId teacherId timeslotId+findUnbookedSpecifiedTimesByTeacherId problemParameters teacherViewTimetable	= Data.Map.mapWithKey (+	\teacherId -> Data.Set.foldr (+		\course s	-> let+			bookedTimes	= map Model.TimetableForWeek.getBookedTime . filter (+				(== Data.Course.getSubject course) . Model.Lesson.getSubject . Model.TimetableForWeek.getBookedLesson+			 ) . LinearModel.TimetableForWeek.fromTimetableForWeek $ teacherViewTimetable ! teacherId+		in if null bookedTimes+			then s	-- The course hasn't been booked at all.+			else Data.Set.union s $ Temporal.TimeslotRequest.getSpecifiedTimes (Data.Course.getTimeslotRequest course) \\ Data.Set.fromList bookedTimes+	) Data.Set.empty . Data.Teacher.getService+ ) $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters++{- |+	* It is desirable that the /student-class/es for the /lesson/s booked for a /course/, are composed consistently from the same /student-bodies/.++	* When /synchronised course/s exist, an additional associated problem arises; though all the /synchronised course/s may be free from /student-body/-combinations,+	the synchronous /lesson/s, don't necessarily have a consistent set of /student-class/es.+	As a result, should one /student-body/ decide to migrate to another /course/ within a synchronised set,+	they'll find, as required, that the /booking-time/s for the new /course/ match those of the old /course/,+	but the /student-class/ into which they'll temporarily merge, depends on the /booking-time/; i.e. a /student-body combination/ has been formed.++	* Returns the ratio of those /booking/s for /synchronised course/s, which aren't consistently synchronised; to all such /booking/s.++	* Since a solitary /booking/ can't be inconsistently synchronised, the first /booking/ doesn't factor in the ratio.++	* E.g. for 4 /student-bodies/;+	S1 & S3 who require two /lesson/s in /Course a/, offered by /Teacher 1/;+	S2 & S4 who require the synchronised /Course b/, offered by /Teacher 2/.++> E.g. 1:			Time 1	Time 2	Time 3+>				======	======	======+>	(Teacher 1,Course a)	{S1,S3}	{S1,S3}+>	(Teacher 2,Course b)	{S2,S4}		{S2,S4}+>				======================+>				[+>					{(Teacher 1,{S1,S3}), (Teacher 2,{S2,S4})},+>					{(Teacher 1,{S1,S3})},+>					{(Teacher 2,{S2,S4})}+>				] => (pred 3 / pred 4) == 2/3.+>				If either S2 or S4 were to transfer to Course a, then a student-body combination would result.+>+> E.g. 2:			Time 1	Time 2	Time 3	Time 4+>				======	======	======	======+>	(Teacher 1,Course a)	{S1,S3}	{S1,S3}+>	(Teacher 2,Course b)	{S2}	{S4}	{S2}	{S4}+>				==============================+>				[+>					{(Teacher 1,{S1,S3}), (Teacher 2,{S2})},+>					{(Teacher 1,{S1,S3}), (Teacher 2,{S4})},+>					{(Teacher 2,{S2})},+>					{(Teacher 2,{S4})}+>				] => (pred 4 / pred 6) == 3/5.+>				If either S2 or S4 were to transfer to Course a, then a student-body combination would result.+>+> E.g. 3:			Time 1	Time 2	Time 3	Time 4+>				======	======	======	======+>	(Teacher 1,Course a)	{S1,S3}		{S1,S3}+>	(Teacher 2,Course b)		{S2,S4}		{S2,S4}+>				==============================+>				[+>					{(Teacher 1,{S1,S3})},+>					{(Teacher 2,{S2,S4})}+>				] => (pred 2 / pred 4) == 1/3.+>+> E.g. 4:			Time 1	Time 2+>				======	======+>	(Teacher 1,Course a)	{S1}	{S3}	{S1}	{S3}+>	(Teacher 2,Course b)	{S2}	{S4}	{S2}	{S4}+>				==============+>				[+>					{(Teacher 1,{S1}), (Teacher 2,{S2})},+>					{(Teacher 1,{S3}), (Teacher 2,{S4})}+>				] => (pred 2 / pred 8) == 1/7.+>+> E.g. 5:			Time 1	Time 2+>				======	======+>	(Teacher 1,Course a)	{S1,S3}	{S1,S3}+>	(Teacher 2,Course b)	{S2,S4}	{S2,S4}+>				==============+>				[+>					{(Teacher 1,{S1,S3}), (Teacher 2,{S2,S4})}+>				] => (pred 1 / pred 4) == 0.++	* CAVEAT: neither this function nor the above examples, aim to measure either;+	incomplete /booking/s of a /course/, by a /student-body/ (see 'WeekDaze.Dynamic.StudentViewTimetableUtilities.findMeanRatioOfIncompletelyBookedKnowledgeRequirements');+	or /student-body combinations/ (see 'calculateRatioOfStudentClassCombinationsPerSynchronisedLesson');+	since these can be measured independently.+-}+calculateRatioOfAsynchronousLessonsInSynchronisedCourses :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Fractional		ratio,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level	-- ^ The /timetable/ as seen from the /teacher/'s perspective.+	-> ratio+calculateRatioOfAsynchronousLessonsInSynchronisedCourses problemAnalysis teacherViewTimetable+	| denominator == 0	= 0	-- Zero lessons were booked for synchronised courses, & therefore none can be booked asynchronously.+	| otherwise		= fromIntegral numerator / fromIntegral denominator+	where+		(numerator, denominator)	= Data.Map.foldr (+			uncurry (***) . (+				(+) . pred {-one is the minimum-} . Data.Set.size . Data.Set.fromList {-construct set of sets of pairs-} . Data.Map.elems {-discard booking-time-} &&& (+) . pred {-one is the minimum-} . Data.Map.size	-- Independently accumulate the numerator & denominator.+			)+		 ) (0, 0) . Data.Map.filter (+			(> 1) . Data.Map.size	-- Select synchronised courses with more than one booking-time, & therefore the potential to lack synchronisation.+		 ) . Data.Map.map (+			\synchronisedCoursesByTeacherId -> Data.Map.fromListWith Data.Set.union {-of (teacherId,student-class)-} [+				(+					Model.TimetableForWeek.getBookedTime teacherViewBooking,+					Data.Set.singleton (+						teacherId,+						TeacherView.LessonResourceIds.getStudentClass $ Model.Lesson.getResourceIds teacherViewLesson+					) -- Pair.+				) |+					(teacherId, synchronisedCourse)	<- Data.Map.toList synchronisedCoursesByTeacherId,	-- For this synchronisationId, identify the course offered by each teacher.+					teacherViewBooking		<- LinearModel.TimetableForWeek.fromTimetableForWeek $ teacherViewTimetable ! teacherId,+					let teacherViewLesson	= Model.TimetableForWeek.getBookedLesson teacherViewBooking,+					Model.Lesson.getSubject teacherViewLesson == Data.Course.getSubject synchronisedCourse	-- Select bookings in the synchronised course under investigation.+			] -- List-comprehension.+		 ) $ ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis	-- Assess each synchronisationId independently.++{- |+	* Finds the mean over all /booking/s, of the ratio of the /student-class/' size, to the /location/'s /capacity/.++	* CAVEAT: /location/s which are unbooked don't affect the result.++	* CAVEAT: no weighting is applied; so a ratio composed from @(100 / 200)@ is no more significant than one composed from @(1 / 2)@.+-}+calculateMeanRatioOfStudentClassSizeToLocationCapacity :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		averageRatio,+	Ord			locationId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level	-- ^ The /timetable/ as seen from the /teacher/'s perspective.+	-> averageRatio+calculateMeanRatioOfStudentClassSizeToLocationCapacity problemParameters teacherViewTimetable+	| Data.Map.null studentClassesByLocationId	= 0	-- All locations have zero classes booked.+	| otherwise					= Factory.Math.Statistics.getMean [+		toRational (+			Aggregate.StudentClass.getSize studentClass+		) / fromIntegral (+			Data.Location.getCapacity $ ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters ! locationId+		) |+			(locationId, studentClasses)	<- Data.Map.toList studentClassesByLocationId,+			studentClass			<- studentClasses+	] -- List-comprehension.+	where+		studentClassesByLocationId	= TeacherView.Timetable.findStudentClassesByLocationId teacherViewTimetable+
+ src-exe/WeekDaze/Dynamic/TimetableForWeekUtilities.hs view
@@ -0,0 +1,139 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Contains utilities dependent on both the static data derived from either configuration or command-line options,+	& on the dynamic state of the current /timetable/.+-}++module WeekDaze.Dynamic.TimetableForWeekUtilities(+-- * Functions+--	getMaybeCampus,+	countInterCampusMigrations,+	extractTemporallyAdjacentCampuses+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	Data.Array.IArray+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.Data.Group				as Data.Group+import qualified	WeekDaze.Data.HumanResource			as Data.HumanResource+import qualified	WeekDaze.Data.Location				as Data.Location+import qualified	WeekDaze.Data.Resource				as Data.Resource+import qualified	WeekDaze.Model.Lesson				as Model.Lesson+import qualified	WeekDaze.Model.TimetableForDay			as Model.TimetableForDay+import qualified	WeekDaze.Model.TimetableForWeek			as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters	as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size					as Size+import qualified	WeekDaze.Temporal.Day				as Temporal.Day+import qualified	WeekDaze.Temporal.Time				as Temporal.Time++-- | Extracts the /campus/ of any /location/, for either the specified /lesson/ or any /meeting/ at the specified /time/.+getMaybeCampus :: (+	Data.HumanResource.HumanResource	resource,+	Ord					locationId,+	Ord					timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> resource+	-> (resourceIds -> locationId)	-- ^ Accessor.+	-> Temporal.Day.Day+	-> Model.TimetableForDay.Association timeslotId resourceIds level+	-> Maybe campus+getMaybeCampus problemParameters resource getLocationId day (timeslotId, maybeLesson)	= (+	Data.Location.getCampus . (locationCatalogue !)+ ) `fmap` Data.Maybe.maybe (+	Data.Maybe.listToMaybe . Data.Maybe.mapMaybe Data.Group.getMaybeLocationId . filter (+		Data.Set.member (Temporal.Time.mkTime day timeslotId) . Data.Group.getMeetingTimes+	) . map (+		groupCatalogue !+	) . Data.Set.toList $ Data.HumanResource.getGroupMembership resource+ ) (+	Just . getLocationId . Model.Lesson.getResourceIds+ ) maybeLesson where+	(locationCatalogue, groupCatalogue)	= ProblemConfiguration.ProblemParameters.getLocationCatalogue &&& ProblemConfiguration.ProblemParameters.getGroupCatalogue $ problemParameters++{- |+	* Counts the total number of times the specified /human-resource/ changes /campus/ within a day, during the /week/.++	* Accounts for /meeting/s which designate a /location/.++	* CAVEAT: a /campus/-migration which occurs over a /day/-boundary isn't counted since the proximity of the /human-resource/'s home to any /campus/ is unknown.++	* If a /day/ is either completely unbooked the number of migrations is zero, since the /human-resource/ can stay at home.+	If a /day/ is entirely booked within one /campus/, then the number of migrations is also counted as zero,+	since though each /human-resource/ must at migrate to and from home at either end of the /day/, their home may be on-/campus/.+	As an aside, this philosophy prevents an unbooked /day/ being considered superior to a /day/ booked entirely within one /campus/, though that shouldn't be considered here.+-}+countInterCampusMigrations :: (+	Data.Array.IArray.Ix			timeslotId,+	Data.HumanResource.HumanResource	resource,+	Data.Resource.Resource			resource,+	Eq					campus,+	Ord					locationId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> resource			-- ^ Actually a /human-resource/; either a /student/ or a /teacher/.+	-> (resourceIds -> locationId)	-- ^ Accessor.+	-> Model.TimetableForWeek.TimetableForWeek timeslotId resourceIds level+	-> Size.NTimeslots+countInterCampusMigrations problemParameters resource getLocationId	= foldr (+	\(day, timetableForDay)	-> if Data.Resource.isAvailableOn day resource	-- Only required for efficiency.+		then (+			(+				max 0 {-an unbooked day requires zero migration-} . pred {-a day spent on just one campus requires zero migration-} . length . Data.List.group . Data.Maybe.mapMaybe (+					getMaybeCampus problemParameters resource getLocationId day+				) $ Data.Array.IArray.assocs timetableForDay+			) ++		) -- Section.+		else id	-- The resource is unavailable today.+ ) 0 . Data.Array.IArray.assocs++{- |+	* Extracts the /campus/ of any /location/, for either the /booking/ or /meeting/, which is nearest before & after the specified /time/.++	* CAVEAT: the information about whether the /location/ was required for the /meeting/ of a /group/ or for a /lesson/, is abandoned.+-}+extractTemporallyAdjacentCampuses :: (+	Data.Array.IArray.Ix			timeslotId,+	Data.HumanResource.HumanResource	resource,+	Ord					locationId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> resource			-- ^ Actually a /human-resource/; either a /student/ or a /teacher/.+	-> (resourceIds -> locationId)	-- ^ Accessor.+	-> Temporal.Time.Time timeslotId+	-> Model.TimetableForWeek.TimetableForWeek timeslotId resourceIds level+	-> (Maybe campus, Maybe campus) -- Pair.+extractTemporallyAdjacentCampuses problemParameters resource getLocationId time	= ToolShed.Data.Pair.mirror (+	Data.Maybe.listToMaybe . Data.Maybe.mapMaybe (+		getMaybeCampus problemParameters resource getLocationId day+	)+ ) . Model.TimetableForDay.bisectAt timeslotId . (+	Data.Array.IArray.! day+ ) where+	(day, timeslotId)	= Temporal.Time.getDay &&& Temporal.Time.getTimeslotId $ time	-- Deconstruct.+
+ src-exe/WeekDaze/Implementation/DeterministicConstructor.hs view
@@ -0,0 +1,708 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Find a /timetable/ based on the one supplied, by /booking/ unallocated /time-slot/s,+	with /lesson/s which match the /problem-parameters/,+	using a purely deterministic algorithm.++	* Defines the /fitness function/ of an /evolutionary algorithm/; <https://en.wikipedia.org/wiki/Evolutionary_algorithm>.+-}++module WeekDaze.Implementation.DeterministicConstructor(+-- * Types+-- ** Type-synonyms+--	HumanViewTimetablePairFitness,+	LessonCriteriaStatistics,+-- * Functions+--	bookAtomicallySynchronisedLessons,+--	bookAtomicallyAndEvaluateFitness,+--	getHumanViewTimetableFitnessFromSuitableAvailableLessonCombinations,+--	mutator,+	mutateStudentViewTimetable,+-- ** Accessors+--	getWriter,+--	getWeightedMean,+	getLessonCriteriaStatistics,+--	getLessonCriterionBounds+) where++import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import qualified	Control.Arrow+import qualified	Control.Monad.Writer	-- The lazy instance.+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Data.Set+import qualified	Factory.Math.Statistics+import qualified	WeekDaze.Aggregate.LocationCatalogue			as Aggregate.LocationCatalogue+import qualified	WeekDaze.Aggregate.StudentBody				as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentClass				as Aggregate.StudentClass+import qualified	WeekDaze.Data.Course					as Data.Course+import qualified	WeekDaze.Data.Location					as Data.Location+import qualified	WeekDaze.Data.Requirements				as Data.Requirements+import qualified	WeekDaze.Data.Resource					as Data.Resource+import qualified	WeekDaze.Data.Student					as Data.Student+import qualified	WeekDaze.Data.Subject					as Data.Subject+import qualified	WeekDaze.Data.Teacher					as Data.Teacher+import qualified	WeekDaze.Dynamic.HumanViewTimetable			as Dynamic.HumanViewTimetable+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities		as Dynamic.StudentViewTimetableUtilities+import qualified	WeekDaze.Dynamic.TimetableForWeekUtilities		as Dynamic.TimetableForWeekUtilities+import qualified	WeekDaze.ExecutionConfiguration.Criterion		as ExecutionConfiguration.Criterion+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.ExecutionConfiguration.LessonCriteriaWeights	as ExecutionConfiguration.LessonCriteriaWeights+import qualified	WeekDaze.Model.Lesson					as Model.Lesson+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableCoordinates			as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForDay				as Model.TimetableForDay+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size						as Size+import qualified	WeekDaze.StudentView.LessonResourceIds			as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.StudentView.TimetableCoordinates		as StudentView.TimetableCoordinates+import qualified	WeekDaze.TeacherView.LessonResourceIds			as TeacherView.LessonResourceIds+import qualified	WeekDaze.Temporal.Availability				as Temporal.Availability+import qualified	WeekDaze.Temporal.Time					as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest			as Temporal.TimeslotRequest++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<*>))+#endif++{- |+	A /writer/ based on a /human-view timetable-pair/ including a specific /booking/ (which logs the associated /lesson-criteria/ values),+	paired with the /weighted mean/ over all /lesson-criteria/, as a measure of the fitness of that /booking/.+-}+type HumanViewTimetablePairFitness criterionValue timeslotId locationId teacherId level weightedMean	= (+	Control.Monad.Writer.Writer [Maybe criterionValue] (Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level),+	weightedMean+ ) -- Pair.++-- | Accessor.+getWriter :: HumanViewTimetablePairFitness criterionValue timeslotId locationId teacherId level weightedMean -> Control.Monad.Writer.Writer [Maybe criterionValue] (Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level)+getWriter	= fst++-- | Accessor. Gets the weighted mean over all /lesson-criteria/ for a specific /booking/.+getWeightedMean :: HumanViewTimetablePairFitness criterionValue timeslotId locationId teacherId level weightedMean -> weightedMean+getWeightedMean	= snd++{- |+	* If the specified /lesson/ (which is assumed to have already been booked), is a member of a set of /synchronised courses/,+	then where required, attempt to book synchronous /lesson/s for the other /teacher/s.++	* The /subject/ & /teacher/ of any additional /lesson/s is defined by their respective synchronised /course/s.+	The /locationId/ & /student-body/ for any additional /lesson/s are selected to maximise the mean over all /lesson-criteria/.++	* CAVEAT: any additional /booking/s are delegated to 'bookAtomicallyAndEvaluateFitness',+	which accounts for further ramifications; e.g. other /time/s specified by the /course/, & non-trivial /minimum consecutive lessons/.++	* CAVEAT: before changing, review the namesake 'Implementation.RandomConstructor.bookAtomicallySynchronisedLessons'.+-}+bookAtomicallySynchronisedLessons :: forall campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId. (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			campus,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ ) => Dynamic.StudentViewTimetableUtilities.BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+bookAtomicallySynchronisedLessons problemParameters@ProblemConfiguration.ProblemParameters.MkProblemParameters {+	ProblemConfiguration.ProblemParameters.getLocationCatalogue	= locationCatalogue,+	ProblemConfiguration.ProblemParameters.getStudentBodyRegister	= studentBodyRegister,+	ProblemConfiguration.ProblemParameters.getTeacherRegister	= teacherRegister+} executionOptions problemAnalysis course studentViewBooking {-already booked-} humanViewTimetablePair	= Data.Maybe.maybe (+	Just humanViewTimetablePair	-- Since it's not a synchronised course, & the original booking has already been made, no further action is required.+ ) slave $ Data.Course.getMaybeSynchronisationId course where+	studentViewTimetableCoordinates			= Model.Timetable.getBookedCoordinates studentViewBooking	-- Access.+	(bookedStudentBody, time)			= Model.TimetableCoordinates.getObserverId &&& Model.TimetableCoordinates.getTime $ studentViewTimetableCoordinates	-- Deconstruct.+	day						= Temporal.Time.getDay time	-- The day on which to book a lesson, for each synchronised course.+	(studentViewTimetable, teacherViewTimetable)	= Dynamic.HumanViewTimetable.getStudentViewTimetable &&& Dynamic.HumanViewTimetable.getTeacherViewTimetable $ humanViewTimetablePair	-- Deconstruct.++	isAvailable :: Data.Resource.Resource resource => resource -> Bool+	isAvailable	= Data.Resource.isAvailableOn day	-- Partially apply.++	slave :: synchronisationId -> Maybe (Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level)+	slave synchronisationId+		| or [+			any (+				\(teacherId, synchronisedCourse)	-> Model.Timetable.hasMatchingLessonAt (+					(/= Data.Course.getSubject synchronisedCourse) . Model.Lesson.getSubject	-- Check for an incompatible booking.+				) (teacherId, time) {-coordinates-} teacherViewTimetable+			) $ Data.Map.toList synchronisedCoursesByTeacherId,	-- Some of the teachers of this set of synchronised courses, have booked a lesson at the required time, but in the wrong subject.+			not $ all isAvailable synchronisedTeacherProfiles,	-- Some of the required teachers of this set of synchronised courses, are unavailable on the required day.+			any (+				Data.Foldable.any (Data.Course.isASpecifiedTime time) . Data.Set.filter (+					(/= Just synchronisationId) . Data.Course.getMaybeSynchronisationId	-- Consider only other courses.+				) . Data.Teacher.getService+			) synchronisedTeacherProfiles,	-- Some of the required teachers of this set of synchronised courses, are already committed at the required time; even if it's not yet booked.+			not . Data.Foldable.all isAvailable $ Data.Map.filter (+				Data.Student.requiresAnySubjectBy (+					`Data.Foldable.elem` Data.Map.map Data.Course.getSubject requiredSynchronisedCoursesByTeacherId+				)+			) studentBodyRegister	-- Some interested student-bodies are unavailable. TODO: inessential; since not all student-bodies must attend each lesson simultaneously with all other bodies.+		]							= Nothing			-- Some of the resources are unavailable or otherwise committed.+		| Data.Map.null requiredSynchronisedCoursesByTeacherId	= Just humanViewTimetablePair	-- Lessons for all the synchronised courses have already been booked at the required time.+		| null humanViewTimetablePairFitnessList		= Nothing			-- No viable timetable result from booking a lesson for each of the synchronised courses.+		| otherwise						= Just . fst {-timetable-pair-} . Control.Monad.Writer.runWriter . getWriter $ Data.List.maximumBy (+			Data.Ord.comparing getWeightedMean	-- Select the fittest timetable-pair according to the weighted mean over lesson-criteria.+		) humanViewTimetablePairFitnessList+		where+			synchronisedCoursesByTeacherId		= ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis ! synchronisationId	-- Extract this set of synchronised courses.++			requiredSynchronisedCoursesByTeacherId	= Data.Map.filterWithKey (+				\teacherId _	-> not $ Model.Timetable.isDefinedTimeslot (teacherId, time) teacherViewTimetable+			 ) synchronisedCoursesByTeacherId	-- We've checked that teachers who offer one of this set of synchronised courses, & who're booked at this time, must be teaching the correct subject; find those who're unbooked.+			synchronisedTeacherProfiles		= map (teacherRegister !) $ Data.Map.keys requiredSynchronisedCoursesByTeacherId+{-+	Starting from a singleton constructed from the original timetable-pair,+	book one lesson, in the synchronised course offered by each of the other teachers, thus maintaining the synchronisation required.+	Returns all viable permutations, along with an evaluation of their fitness.++	CAVEAT:+		This algorithm only books ONE of the student-bodies interested in each of the required synchronised courses.+		This is sufficient but suboptimal; since student-body S1 can't be split, S2 & S3 MUST merge if they're to book a second lesson:++					Time 1	Time 2+					======	======+		(Teacher 1,Course a)	S1	S1+		(Teacher 2,Course b)	S2	S3++		So, if after booking S1, S1 xor S2 is booked,+		then when the requirement for the other is discovered, the booking can only be made, by merging with the previous booking,+		even though all the teachers at that time are already, as minimally required, booked.+-}+			humanViewTimetablePairFitnessList :: [HumanViewTimetablePairFitness Rational timeslotId locationId teacherId level Rational]+			humanViewTimetablePairFitnessList	= Data.Map.foldr (+				\unaryBookingFunctions -> Data.Maybe.catMaybes {-forward viable permutations to the next teacher-} . (+					unaryBookingFunctions <*>	-- Generate permutations of the list of unary functions applied to the list of possible Human-view TimetablePairs.+				) . map (+					fst {-timetable-pair-} . Control.Monad.Writer.runWriter . getWriter	-- Retrieve the Human-view Timetable-pair.+				)+			 ) [+				(+					return {-to Writer-monad-} humanViewTimetablePair,+					undefined	-- The initial fitness isn't used.+				) -- HumanViewTimetablePairFitness.+			 ] {-Initial value-} $ Data.Map.mapWithKey (+				\teacherId synchronisedCourse	-> [+					bookAtomicallyAndEvaluateFitness Dynamic.StudentViewTimetableUtilities.bookAtomicallyNothing {-continuation. CAVEAT: don't call 'bookAtomicallySynchronisedLessons' recursively, which would book lessons, that this call has identified as required-} problemParameters executionOptions problemAnalysis synchronisedStudentViewBooking |	-- Construct a unary booking-function by partial application.+						let subject	= Data.Course.getSubject synchronisedCourse,	-- Find the single subject offered by this teacher of one of the synchronised courses.+						studentBody	<- Data.Map.keys $ Data.Map.filter (+							Data.Set.member subject . Data.Student.deriveAmalgamatedKnowledgeRequirement+						) studentBodyRegister,	-- Find the student-bodies requiring the subject offered by this teacher of the synchronised courses.+						studentBody /= bookedStudentBody,	-- The synchronised lessons can't involve the same studentBody as the original 'studentViewBooking'.+						not . uncurry (||) . (+							Model.TimetableForWeek.isDefinedTimeslot time {-check the student-body isn't already booked-} &&& Model.TimetableForDay.isSubjectBooked subject . (Data.Array.IArray.! day)+						) $ studentViewTimetable ! studentBody,+						not $ ProblemConfiguration.ProblemAnalysis.doAllCoursesSatifyingAnotherKnowledgeRequirementSpecifyThisTime problemParameters problemAnalysis subject studentViewTimetableCoordinates,	-- Avoid booking-times specified by all courses that match one of the other knowledge-requirements of this student-body. TODO: what if they're already booked ?+						locationId	<- Data.Map.keys $ Aggregate.LocationCatalogue.findSuitableLocations (+							Aggregate.StudentBody.getSize studentBody+						) (+							Data.Course.getRequiredFacilityNames synchronisedCourse+						) $ Data.Map.filter isAvailable locationCatalogue,	-- Identify suitable locations.+						(/= locationId) . StudentView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds $ Model.Timetable.getBookedLesson studentViewBooking, -- The synchronised lessons can't occupy the same location as the original 'studentViewBooking'.+						let synchronisedStudentViewBooking	= ((studentBody, time), Model.Lesson.MkLesson (StudentView.LessonResourceIds.MkLessonResourceIds locationId teacherId) subject),+						Dynamic.StudentViewTimetableUtilities.isSuitableBooking problemParameters executionOptions problemAnalysis humanViewTimetablePair synchronisedStudentViewBooking	-- Remove any which are unsuitable in the context of the specified timetable.+				] -- List-comprehension: to generate a list of viable student-view bookings for this teacher.+			 ) requiredSynchronisedCoursesByTeacherId++{- |+	* Makes the proposed /booking/ in the /timetable/.++	* Occasionally additional /lesson/s may also be booked as mandated by the corresponding /course/.+	e.g. when @ Data.Course.requiresConsecutiveLessons || Data.Course.specifiesTimes || Data.Course.isSynchronised @.+	If any of the additional /booking/s can't be made, then 'Nothing' is returned.++	* Evaluates the fitness of the proposed /booking/, according to the weighted mean over heterogeneous /lesson-criteria/.++	* Returns the resulting /timetable/, & also writes the value of each /lesson-criterion/, to facilitate subsequent analysis.+-}+bookAtomicallyAndEvaluateFitness :: forall campus criterionValue criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId weightedMean. (+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Fractional		criterionValue,+	Fractional		weightedMean,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> Dynamic.StudentViewTimetableUtilities.BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Continuation.+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level						-- ^ The proposed /booking/.+	-> Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level				-- ^ The original /timetable/ on which to operate, as seen from two points of view.+	-> Maybe (HumanViewTimetablePairFitness criterionValue timeslotId locationId teacherId level weightedMean)	-- ^ The resulting /timetable/ including the /booking/, & the value each /lesson-criterion/; paired with weighted mean over all /lesson-criteria/.+bookAtomicallyAndEvaluateFitness continuation problemParameters@ProblemConfiguration.ProblemParameters.MkProblemParameters {+	ProblemConfiguration.ProblemParameters.getLocationCatalogue	= locationCatalogue,+	ProblemConfiguration.ProblemParameters.getStudentBodyRegister	= studentBodyRegister,+	ProblemConfiguration.ProblemParameters.getTeacherRegister	= teacherRegister+} executionOptions problemAnalysis studentViewBooking@((studentBody, time), studentViewLesson) humanViewTimetablePair	= (+	\proposedHumanViewTimetable -> let+		proposedStudentClass :: Aggregate.StudentClass.StudentClass+		proposedStudentClass	= StudentView.Timetable.extractStudentClassAt (time, studentViewLesson) $ Dynamic.HumanViewTimetable.getStudentViewTimetable proposedHumanViewTimetable++		studentClassSize :: Size.NStudents+		studentClassSize	= Aggregate.StudentClass.getSize proposedStudentClass++		wastedResources :: Data.Location.WastedResources+		wastedResources	= Data.Location.calculateWaste studentClassSize (Data.Course.getRequiredFacilityNames course) locationProfile++		(relativeCapacityUtilisation, relativeFacilityUtilisation)	= Data.Location.calculateRelativeUse locationProfile wastedResources++		nTeachers :: Size.NTeachers+		nTeachers	= ProblemConfiguration.ProblemAnalysis.getNTeachers problemAnalysis++-- Calculate the weighted mean over all lesson-criteria, & log the unweighted values of lesson-criteria.+		(weightedMean, lessonCriteriaValues)	= Control.Monad.Writer.runWriter $ ExecutionConfiguration.LessonCriteriaWeights.calculateWeightedMean (+			ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights executionOptions+		 ) (+{-+	The question is whether or not the proposed lesson can be temporarily merged to form a student-class with any of the incumbent synchronous lessons,+	rather than how big the resulting student-class is; so the criterion-value has a binary rather than a linear range.+-}+			ExecutionConfiguration.Criterion.mkCriterionFrom $ studentViewLesson `elem` Model.Timetable.extractSynchronousLessonsAt time studentViewTimetable {-original-}	-- areResourcesReused.+		 ) (+			if nTimeslotsPerDay == 1+				then minBound	-- The concept is voidm & would evaluate to 0/0.+				else ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfGreatestMinimumConsecutiveLessonsTag . (+					/ fromIntegral (pred nTimeslotsPerDay)	-- The booking-difficulty, is inversely proportional to the number of timeslots per day.+				) . fromIntegral $ pred {-the fewest is one-} minimumConsecutiveLessons+		 ) (+			let+				simultaneousAvailability	= Data.Resource.getAvailability (teacherProfile, studentProfile)	-- Find the days on which both student-body & teacher are available.+			in if Temporal.Availability.isUnavailable simultaneousAvailability+				then error $ "WeekDaze.Implementation.DeterministicConstructor.bookAtomicallyAndEvaluateFitness:\tstudent-body & teacher are never simultaneously available for the tuition of a subject; " ++ shows (studentBody, studentViewLesson) "."+				else ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfGreatestRemainingCourseLessonsTag . min 1 $ (+					fromIntegral (+						(+							Data.Course.getRequiredLessonsPerWeek course - Model.TimetableForWeek.countSubjectWorkload subject studentViewTimetableForWeek {-original-}+						) `div` minimumConsecutiveLessons -- The number of sessions still to be booked.+					) / fromIntegral (+						Data.Set.size . Data.Set.filter (+							not . Model.TimetableForDay.isSubjectBooked subject . (+								studentViewTimetableForWeek Data.Array.IArray.!+							)+						) $ Temporal.Availability.deconstruct simultaneousAvailability+					) -- The number of days on which this subject isn't booked; which must include today or we wouldn't be here.+				)+		 ) (+			Data.Maybe.maybe minBound (+				ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfGreatestSynchronisedCourseSetSizeTag . (+					/ fromIntegral (pred nTeachers) -- Normalise; each teacher can offer one course in each synchronised set.+				) . fromIntegral . pred {-the fewest teachers is two-} . Data.Map.size {-number of teachers-} . (+					ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis !+				)+			 ) $ Data.Course.getMaybeSynchronisationId course+		 ) (+			ExecutionConfiguration.Criterion.mkCriterionFrom . Data.Set.member subject . Data.Requirements.getCore $ Data.Student.getKnowledgeRequirements studentProfile	-- isCoreKnowledgeRequirement.+		 ) (+			ExecutionConfiguration.Criterion.mkCriterionFrom $ Data.Teacher.isSpecialistIn (Data.Subject.getTopic subject) teacherProfile	-- isSpecialistInTopic.+		 ) (+			Data.Maybe.maybe ExecutionConfiguration.Criterion.median {-this course has no maximum class-size-} (+				\maximumClassSize -> let+					numerator, denominator :: Size.NStudents+					(numerator, denominator)	= abs {-symmetrical-} . uncurry (-) &&& uncurry (+) $ (+						pred {-the minimum is one-} $ Data.Location.getCapacity locationProfile,+						pred {-the minimum is one-} maximumClassSize+					 ) -- Pair.+				in if denominator == 0+					then maxBound	-- The location-capacity & maximum class-size for the course, must both equal one.+					else ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.LessonCriteriaWeights.weightOfMatchCourseClassSizeToLocationCapacityTag $ fromIntegral numerator / fromIntegral denominator	-- '1' if maximum course-size matches the location-capacity, tending towards '0' as the discrepancy rises. It doesn't matter if the course-size exceeds location-capacity, because it doesn't reflect the actual class-size.+			) maybeMaximumClassSizeOfCourse+		 ) (+			ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseRelativeFacilityUtilisationTag relativeFacilityUtilisation+		 ) (+			Data.Maybe.maybe ExecutionConfiguration.Criterion.median {-this course has no maximum class-size-} (+				ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseStudentClassSizeOverCourseClassSizeTag . (fromIntegral studentClassSize /) . fromIntegral+			) maybeMaximumClassSizeOfCourse -- Incompatible with 'ExecutionConfiguration.ExecutionOptions.setPermitTemporaryStudentBodyMerger', which allows this ratio to change.+		 ) (+			ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseStudentClassSizeOverLocationCapacityTag relativeCapacityUtilisation	-- Incompatible with 'ExecutionConfiguration.ExecutionOptions.setPermitTemporaryStudentBodyMerger', which allows this ratio to change.+		 ) (+			let+				calculateProbabilitiesTimeNotRequired studentBody'	= map (+					(+						1 -	-- The complementary probability that a course is selected for the specified subject which doesn't require the proposed time.+					) . uncurry (+						/	-- The probability that a course is selected for the specified subject which requires the proposed time.+					) . (+						fromIntegral . Data.Map.size . Data.Map.filter (+							Data.Course.isASpecifiedTime time+						) &&& fromIntegral . Data.Map.size {-there's @ least one-}+					) . (+						ProblemConfiguration.ProblemAnalysis.getSuitableCoursesByTeacherIdBySubjectByStudentBody problemAnalysis ! studentBody' !+					)+				 ) . Data.Set.toList {-avoid accidentally merging equal members-}+			in ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag . product {-the probability that no other course requires the proposed time-} . Data.Maybe.maybe (+				calculateProbabilitiesTimeNotRequired studentBody . Data.Set.filter (+					/= Model.Lesson.getSubject studentViewLesson	-- Find the other subjects required by this student-body.+				) . Data.Student.deriveAmalgamatedKnowledgeRequirement $ studentBodyRegister ! studentBody+			) (+				\synchronisationId -> concatMap (+					\synchronisedStudentBody -> calculateProbabilitiesTimeNotRequired synchronisedStudentBody . Data.Set.filter (+						not . Data.Foldable.any (+							(== Just synchronisationId) . Data.Course.getMaybeSynchronisationId+						) . (+							ProblemConfiguration.ProblemAnalysis.getSuitableCoursesByTeacherIdBySubjectByStudentBody problemAnalysis ! synchronisedStudentBody !+						)+					) . Data.Student.deriveAmalgamatedKnowledgeRequirement $ studentBodyRegister ! synchronisedStudentBody+				) . Data.Set.toList $ ProblemConfiguration.ProblemAnalysis.getStudentBodiesBySynchronisationId problemAnalysis ! synchronisationId+			) $ Data.Course.getMaybeSynchronisationId course+		 ) (+			if nTeachers <= 1+				then minBound	-- There're zero other teachers, so the concept is void.+				else if Data.Set.null {-no choice of location for this subject-} . Data.Set.delete locationId . Data.Set.fromList . map (+					StudentView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds	-- Catalogue alternative locations @ which this subject may be taught.+				) . filter (+					(== subject) . Model.Lesson.getSubject+				) $ ProblemConfiguration.ProblemAnalysis.getRequiredLessonCombinationsByStudentBody problemAnalysis ! studentBody {-disregard availability, because if preferable we can opt to book another day-}+					then maxBound	-- There's no choice of location for this subject, so don't penalise this lesson if the location is shared, wrt another lesson where it isn't.+					else ExecutionConfiguration.Criterion.invertWholeNumbersIntoUnitInterval ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseBookingOfLocationByOtherTeachersTag . fromIntegral . Data.Set.size . Data.Set.delete teacherId $ StudentView.Timetable.findDistinctTeacherIdsFor locationId studentViewTimetable	-- Count the other teachers currently booked.+		 ) (+{-+	In order of preference, book a lesson in a course that:+		GOOD;		is either at a time specified for the course, or can span all the specified times for today using minimumConsecutiveLessons,+				or is near enough any requested ideal timeslotId to span the gap using minimumConsecutiveLessons (missing the ideal timeslot may be as good as a mile, so a binary rather than a linear range).+		INDIFFERENT;	hasn't a relevant timeslot-request.+		BAD;		is on the same day as a time precisely specified for the course, but at a different timeslotId which can span to the specified timeslot using minimumConsecutiveLessons.+				or is too far from any requested ideal timeslotId to span the gap using minimumConsecutiveLessons.++	N.B.: As soon as any booking is requested, for a course with either specified times or minimumConsecutiveLessons > 1,+	then either the remainder will be booked, or none will be booked.+-}+			let+				canSpan	= (< minimumConsecutiveLessons) . Temporal.Time.calculateAbsoluteDistance timeslotId	-- Check whether the specified timeslotId can span to the current timeslotId using minimumConsecutiveLessons.+			in case timeslotRequest of+				Temporal.TimeslotRequest.Ideally idealTimeslotId				-> ExecutionConfiguration.Criterion.mkCriterionFrom $ canSpan idealTimeslotId	-- If the ideal timeslot has already been booked, then a similar lesson won't be proposed for the same day, so we'll never accidentally create an excessive runlength.+				Temporal.TimeslotRequest.Specifically specificallyRequestedTimes {-which may be null-}+					| Temporal.TimeslotRequest.isASpecifiedTime time timeslotRequest	-> maxBound	-- Most desirable.+					| Temporal.TimeslotRequest.isASpecifiedDay day timeslotRequest		-> ExecutionConfiguration.Criterion.mkCriterionFrom . uncurry (&&) . (+						canSpan . Data.Set.findMin &&& canSpan . Data.Set.findMax+					) . Data.Set.map Temporal.Time.getTimeslotId $ Data.Set.filter (+						(== day) . Temporal.Time.getDay	-- There must be @ least one according to 'isASpecifiedDay'.+					) specificallyRequestedTimes	-- Discourage booking on the same day, but at a different time-slot from a time specified for this course, which can't span to specified times by minimumConsecutiveLessons.+					| otherwise								-> ExecutionConfiguration.Criterion.median	-- 'ProblemConfiguration.ProblemAnalysis.getRequiredLessonCombinationsByStudentBodyAvailableByDay' doesn't return a lesson from rigid courses on the wrong day.+		 ) (+			ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseInterCampusMigrationsOfStudentsTag . (+				/ 2	-- Normalise.+			) . fromIntegral . countTemporallyAdjacentCampusMigrations $ Dynamic.TimetableForWeekUtilities.extractTemporallyAdjacentCampuses problemParameters studentProfile StudentView.LessonResourceIds.getLocationId time studentViewTimetableForWeek {-the original-}+		 ) (+			ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseInterCampusMigrationsOfTeachersTag . (+				/ 2	-- Normalise.+			) . fromIntegral . countTemporallyAdjacentCampusMigrations . Dynamic.TimetableForWeekUtilities.extractTemporallyAdjacentCampuses problemParameters teacherProfile TeacherView.LessonResourceIds.getLocationId time $ teacherViewTimetable {-the original-} ! teacherId+		 ) (+			Data.Maybe.maybe maxBound {-this student-body hasn't previously booked any lessons of this type-} (+				ExecutionConfiguration.Criterion.mkCriterionFrom . Data.Set.member proposedStudentClass	-- The number of student-body combinations isn't relevant, only whether this lesson makes it worse; i.e. a binary rather than a linear range.+			) . Data.Map.lookup studentViewLesson $ StudentView.Timetable.findStudentClassesByLessonFor studentViewTimetable studentBody	-- studentBodyCombinations.+		 ) (+			let+				distinctLocationIds	= StudentView.Timetable.findDistinctLocationIdsFor teacherId studentViewTimetable+			in if Data.Set.null distinctLocationIds+				then maxBound	-- This teacher hasn't made any bookings.+				else ExecutionConfiguration.Criterion.mkCriterionFrom $ Data.Set.member locationId distinctLocationIds	-- teachersLocusOperandi. Otherwise the teacher is using a new location. The number of other teachers isn't relevant, only whether this lesson makes it worse; i.e. a binary rather than a linear range.+		 ) (+			let+{-+	For each facility wasted, by holding a lesson in this course at this location;+	the demand for it, is the sum over courses which require it, of Data.Course.getRequiredLessonsPerweek;+	the supply of it, is the sum over locations which offer it, of available timeslots / week.++	The total of this ratio over all facilities, should then be normalised by the number of distinct facilities.+-}+				denominator :: Int+				denominator	= nTimeslotsPerDay * Data.Set.size (Aggregate.LocationCatalogue.extractDistinctFacilityNames locationCatalogue)+			in if denominator == 0+				then minBound	-- There is no concept of this criterion, for any lesson.+				else ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseWasteOfScarceFacilitiesTag {-low waste is good-} . (+					/ fromIntegral denominator	-- Normalise to the unit-interval.+				) . Data.Set.foldr (+					\facilityName -> (+						(+							fromIntegral (+								Data.Maybe.fromMaybe 0 . Data.Map.lookup facilityName $ ProblemConfiguration.ProblemAnalysis.getTotalLessonsPerWeekByFacilityName problemAnalysis	-- The demand for this facility from courses; redundant courses have been removed by 'ProblemConfiguration.ProblemParameters.removeRedundantCourses'.+							) / fromIntegral (+								Aggregate.LocationCatalogue.countDaysByFacilityName locationCatalogue ! facilityName	-- The supply of this facility by locations; which must exceed zero.+							)+						) ++					) -- Section.+				) 0 $ Data.Location.getWastedFacilityNames wastedResources+		 )+	in (+		Control.Monad.Writer.writer (+			proposedHumanViewTimetable,+			lessonCriteriaValues+		),		-- The timetable including the proposed booking.+		weightedMean	-- The fitness of the proposed booking.+	) -- HumanViewTimetablePairFitness.+ ) `fmap` Dynamic.StudentViewTimetableUtilities.bookAtomicallyWithRamifications continuation problemParameters executionOptions problemAnalysis course studentViewBooking humanViewTimetablePair where+	nTimeslotsPerDay :: Size.NTimeslots+	nTimeslotsPerDay	= ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis++	(studentViewTimetable, teacherViewTimetable)	= Dynamic.HumanViewTimetable.getStudentViewTimetable &&& Dynamic.HumanViewTimetable.getTeacherViewTimetable $ humanViewTimetablePair	-- Deconstruct.++	(((studentViewTimetableForWeek, studentProfile), (day, timeslotId)), (subject, (locationId, teacherId)))	= (+		(+			(studentViewTimetable !) &&& (studentBodyRegister !)+		) *** (+			Temporal.Time.getDay &&& Temporal.Time.getTimeslotId+		)+	 ) *** (+		Model.Lesson.getSubject &&& (+			StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId+		) . Model.Lesson.getResourceIds+	 ) $ studentViewBooking	-- Deconstruct.++	locationProfile	= locationCatalogue ! locationId	-- Lookup.+	teacherProfile	= teacherRegister ! teacherId		-- Lookup.++	course				= Data.Maybe.fromJust $ Data.Teacher.lookupCourseIn subject teacherProfile+	maybeMaximumClassSizeOfCourse	= Data.Course.getMaybeMaximumClassSize course+	minimumConsecutiveLessons	= Data.Course.getMinimumConsecutiveLessons course+	timeslotRequest			= Data.Course.getTimeslotRequest course++	countTemporallyAdjacentCampusMigrations :: (Maybe campus, Maybe campus) -> Int+	countTemporallyAdjacentCampusMigrations (maybeCampusBefore, maybeCampusAfter)	= length $ filter (+		/= Data.Location.getCampus locationProfile	-- Mismatch.+	 ) $ Data.Maybe.catMaybes {-an unallocated time-slot doesn't constitute a mismatch-} [maybeCampusBefore, maybeCampusAfter]++{- |+	* Transforms the specified /timetable/, by independently /booking/ each suitable & available /lesson/ into the specified /coordinate/s, to create a population of candidate /timetable/s.++	* Avoids /booking/s which conflict with /time/s specified for other /course/s, which are either;+	offered by the /teacher/;+	or necessary to satisy the other /subject/s required by the /student-body/.++	* For each alternative /timetable/;+		the individual weighted /lesson-criteria/ are written to facilitate analysis,+		& the weighted mean of /lesson-criteria/ is returned to facilitate selection.+-}+getHumanViewTimetableFitnessFromSuitableAvailableLessonCombinations :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Fractional		criterionValue,+	Fractional		weightedMean,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.TimetableCoordinates.Coordinates timeslotId						-- ^ The coordinates of the /time-slot/ at which to book a suitable available /lesson/.+	-> Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level			-- ^ The /timetable/ on which to operate.+	-> [HumanViewTimetablePairFitness criterionValue timeslotId locationId teacherId level weightedMean]	-- ^ The resulting population of candidate /timetable/s, each paired with a fitness-evaluation; each including a log of individual /lesson-criteria/ values.+getHumanViewTimetableFitnessFromSuitableAvailableLessonCombinations problemParameters executionOptions problemAnalysis studentViewTimetableCoordinates humanViewTimetablePair	= Data.Maybe.mapMaybe (+	($ humanViewTimetablePair) . bookAtomicallyAndEvaluateFitness bookAtomicallySynchronisedLessons problemParameters executionOptions problemAnalysis . (,) studentViewTimetableCoordinates {-construct a booking from lesson-}+ ) . filter (+	(+		\(subject, teacherId)	-> not $ or [++-- Avoid subjects which are already completely booked.+			Data.Set.notMember subject $ Data.Map.map Data.Student.amalgamateKnowledgeRequirements (+				Dynamic.StudentViewTimetableUtilities.findIncompletelyBookedKnowledgeRequirementsByStudentBody problemParameters studentViewTimetable	-- Includes subjects which aren't booked at all.+			) ! studentBody,+{-+	Avoid subjects already booked today, since any additionally required to meet 'minimumConsecutiveLessons' are booked automatically with the first for the day.+	CAVEAT: subjects already booked today, for any synchronised courses, are checked separately in 'bookAtomicallySynchronisedLessons'.+-}+			Model.TimetableForDay.isSubjectBooked subject $ studentViewTimetableForWeek Data.Array.IArray.! day,++-- Avoid booking-times specified by another course offered by this teacher.+			Data.Foldable.any (+				Data.Course.isASpecifiedTime time+			) . Data.Set.filter (+				(/= subject) . Data.Course.getSubject	-- Find the other courses offered by this teacher.+			) . Data.Teacher.getService $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters ! teacherId,++-- Avoid booking-times specified by all courses that match one of the other knowledge-requirements of this student-body.+			ProblemConfiguration.ProblemAnalysis.doAllCoursesSatifyingAnotherKnowledgeRequirementSpecifyThisTime problemParameters problemAnalysis subject studentViewTimetableCoordinates+		] -- Quickly select those lessons, which can be independently booked into this timetable at the specified coordinates.+	) . (+		Model.Lesson.getSubject &&& StudentView.LessonResourceIds.getTeacherId . Model.Lesson.getResourceIds	-- Deconstruct the lesson.+	)+ ) $ ProblemConfiguration.ProblemAnalysis.getRequiredLessonCombinationsByStudentBodyAvailableByDay problemAnalysis ! day ! studentBody where+	(studentBody, time)		= Model.TimetableCoordinates.getObserverId &&& Model.TimetableCoordinates.getTime $ studentViewTimetableCoordinates	-- Deconstruct.+	studentViewTimetable		= Dynamic.HumanViewTimetable.getStudentViewTimetable humanViewTimetablePair	-- Access.+	studentViewTimetableForWeek	= studentViewTimetable ! studentBody	-- Lookup.+	day				= Temporal.Time.getDay time	-- Access.++{- |+	* Books /lesson/s where possible (except if they're already booked or none are viable), into the specified /timetable/ at the specified /coordinates/.++	* The /lesson/ is selected to maximise the /weighted mean/ over all /lesson-criteria/.++	* The values of each /lesson-criterion/, are also written to facilitate post-analysis.+-}+mutator :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Fractional		criterionValue,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.TimetableCoordinates.Coordinates timeslotId				-- ^ The /coordinates/ at which to book the most suitable available /lesson/.+	-> Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level	-- ^ The /timetable/ on which to operate.+	-> Control.Monad.Writer.Writer [[Maybe criterionValue]] (Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level)+mutator problemParameters executionOptions problemAnalysis studentViewTimetableCoordinates humanViewTimetablePair+	| Model.Timetable.isDefinedTimeslot studentViewTimetableCoordinates studentViewTimetable	= return {-to Writer-monad-} humanViewTimetablePair	-- The specified coordinates are already booked, so no change.+	| not $ null humanViewTimetableFitnessFromSuitableAvailableLessonCombinations			= Control.Monad.Writer.mapWriter (+		Control.Arrow.second return {-to List-monad-}	-- Re-write the list of lesson-criteria values, corresponding to the lesson found to be most effective, when booked into specified coordinated of the timetable.+	) . getWriter $ Data.List.maximumBy (+		Data.Ord.comparing (+			\pair -> getWeightedMean pair :: Rational+		)+	) humanViewTimetableFitnessFromSuitableAvailableLessonCombinations+	| not $ null qualifiedHumanViewTimetablePairsFromSuitableAdjacentLessons			= return {-to Writer-monad-} . fst {-humanViewTimetablePair-} $ Data.List.maximumBy (+		Data.Ord.comparing snd {-runlength-shortfall-}+	) qualifiedHumanViewTimetablePairsFromSuitableAdjacentLessons+	| otherwise											= return {-to Writer-monad-} humanViewTimetablePair	-- Can't book anything into the specified coordinates.+	where+		(studentBody, (day, timeslotId))					= Model.TimetableCoordinates.getObserverId &&& (Temporal.Time.getDay &&& Temporal.Time.getTimeslotId) . Model.TimetableCoordinates.getTime $ studentViewTimetableCoordinates	-- Deconstruct.+		studentViewTimetable							= Dynamic.HumanViewTimetable.getStudentViewTimetable humanViewTimetablePair+		humanViewTimetableFitnessFromSuitableAvailableLessonCombinations	= getHumanViewTimetableFitnessFromSuitableAvailableLessonCombinations problemParameters executionOptions problemAnalysis studentViewTimetableCoordinates humanViewTimetablePair+		qualifiedHumanViewTimetablePairsFromSuitableAdjacentLessons		= Data.Maybe.mapMaybe (+			(+				\proposedBooking -> let+					course	= ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters $ Model.TimetableForDay.getBookedLesson proposedBooking+				in (+					id &&& (+						Data.Course.getMinimumConsecutiveLessons course -	-- Evaluate the signed runlength-shortfall; they should all be <= 0.+					) . Model.TimetableForDay.countRunlengthAt timeslotId . (+						Data.Array.IArray.! day	-- Extract the timetableForDay.+					) . (+						! studentBody	-- Extract the timetableForWeek.+					) . Dynamic.HumanViewTimetable.getStudentViewTimetable+				) `fmap` Dynamic.StudentViewTimetableUtilities.bookAtomicallyWithRamifications bookAtomicallySynchronisedLessons {-continuation-} problemParameters executionOptions problemAnalysis course proposedBooking humanViewTimetablePair	-- The adjacent lesson should already have been booked in a runlength of minimumConsecutiveLessons & for the times specified by the course, but it may also have synchronised courses which should be booked.+			) . (,) studentViewTimetableCoordinates . Model.TimetableForDay.getBookedLesson {-replicate the adjacent bookings @ the current coordinates-}+		 ) . Model.TimetableForDay.extractAdjacentBookings timeslotId $ studentViewTimetable ! studentBody Data.Array.IArray.! day++-- | The ((mean, standard deviation), (min, max)) over the values of a single /lesson-criterion/.+type LessonCriteriaStatistics criterionValue mean standardDeviation	= ((mean {-mean-}, standardDeviation), (criterionValue {-min-}, criterionValue {-max-}))	-- Pair.++-- | Accessor.+getLessonCriteriaStatistics :: LessonCriteriaStatistics criterionValue mean standardDeviation -> (mean, standardDeviation)+getLessonCriteriaStatistics	= fst++-- | Accessor.+getLessonCriterionBounds :: LessonCriteriaStatistics criterionValue mean standardDeviation -> (criterionValue {-min-}, criterionValue {-max-})+getLessonCriterionBounds	= snd++{- |+	* Books where possible, /lesson/s into the specified /timetable/, at unallocated /time-slot/s amongst the specified ordered /coordinates/.++	* The individual /lesson/s are selected to maximise the weighted mean of various /lesson-criteria/.++	* 'LessonCriteriaStatistics' gathered over all /booking/s, for each /lesson-criterion/ (unless the corresponding weight is zero), are also written to facilitate analysis.+-}+mutateStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Floating		standardDeviation,+	Fractional		criterionValue,+	Fractional		mean,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The initial /timetable/ to refine.+	-> StudentView.TimetableCoordinates.Vector timeslotId				-- ^ The ordered list of /coordinates/.+	-> Control.Monad.Writer.Writer [Maybe (LessonCriteriaStatistics criterionValue mean standardDeviation)] (+		StudentView.Timetable.Timetable timeslotId locationId teacherId level+	)										-- ^ The filled /timetable/, & the 'LessonCriteriaStatistics' gathered over all /booking/s, for each weighted /lesson-criterion/.+mutateStudentViewTimetable problemParameters executionOptions problemAnalysis studentViewTimetable	= Control.Monad.Writer.mapWriter (+	Dynamic.HumanViewTimetable.getStudentViewTimetable *** map (+		fmap (+			(Factory.Math.Statistics.getMean &&& Factory.Math.Statistics.getStandardDeviation) &&& (minimum &&& maximum)	-- Gather statistics over all selected bookings, for the value of each unweighted homogeneous lesson-criterion.+		) . sequence {-if the value of any lesson-criterion is unavailable, then the corresponding statistics are indeterminate-}+	) . Data.List.transpose+ ) . Data.List.foldl' {-not foldr, since the coordinates are ordered-} (+	\humanViewTimetableWriter -> (humanViewTimetableWriter >>=) . mutator problemParameters executionOptions problemAnalysis	-- Thread the writer through the coordinates, evolving the timetable & accumulating statistics for each lesson-criterion.+ ) (+	return {-to Writer-monad-} $ Dynamic.HumanViewTimetable.mkTimetablePair executionOptions problemAnalysis studentViewTimetable	-- The initial value.+ ) {-coordinate-vector-}+
+ src-exe/WeekDaze/Implementation/EvolutionaryAlgorithm.hs view
@@ -0,0 +1,638 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Deterministically constructs the initial /timetable/.++	* Uses an evolutionary algorithm (<https://en.wikipedia.org/wiki/Evolutionary_algorithm>),+	based on an ordered sequence of different evolution-strategies, to progressively improve it.+-}++module WeekDaze.Implementation.EvolutionaryAlgorithm(+-- * Types+-- ** Type-synonyms+--	NGenerations,+-- * Functions+--	evolveQuantifiedStudentViewTimetable,+	evolveStudentViewTimetable,+--	selectDeterministicStudentViewTimetable,+	optimiseLessonCriteriaWeights+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Monad.Writer	-- The lazy instance.+import qualified	Control.Parallel.Strategies+import qualified	Data.Array.IArray+import qualified	Data.Default+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Data.Set+import qualified	Factory.Math.Factorial+import qualified	Factory.Math.Implementations.Factorial+import qualified	Factory.Math.Statistics+import qualified	System.Random+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.Pair+import qualified	ToolShed.Data.Quadruple+import qualified	ToolShed.Data.Triple+import qualified	ToolShed.System.Random+import qualified	WeekDaze.Aggregate.StudentBody						as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentBodyRegister					as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities				as Dynamic.StudentViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight				as ExecutionConfiguration.CriterionWeight+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies			as ExecutionConfiguration.EvolutionStrategies+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions			as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.ExecutionConfiguration.LessonCriteriaWeights			as ExecutionConfiguration.LessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights		as ExecutionConfiguration.OptimiseLessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity		as ExecutionConfiguration.TimetableBreederFecundity+import qualified	WeekDaze.Implementation.DeterministicConstructor			as Implementation.DeterministicConstructor+import qualified	WeekDaze.Implementation.QuantifiedStudentViewTimetable			as Implementation.QuantifiedStudentViewTimetable+import qualified	WeekDaze.Implementation.RandomConstructor				as Implementation.RandomConstructor+import qualified	WeekDaze.Implementation.StudentViewTimetableRandomBreeders		as Implementation.StudentViewTimetableRandomBreeders+import qualified	WeekDaze.Model.TimetableAxisTriple					as Model.TimetableAxisTriple+import qualified	WeekDaze.Model.TimetableCoordinates					as Model.TimetableCoordinates+import qualified	WeekDaze.Model.Traverse							as Model.Traverse+import qualified	WeekDaze.OutputFormat.DeterministicStudentViewTimetableSelection	as OutputFormat.DeterministicStudentViewTimetableSelection+import qualified	WeekDaze.OutputFormat.EvolutionStrategyStatistics			as OutputFormat.EvolutionStrategyStatistics+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis				as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters				as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.Timetable						as StudentView.Timetable+import qualified	WeekDaze.StudentView.TimetableCoordinates				as StudentView.TimetableCoordinates+import			WeekDaze.Implementation.StudentViewTimetableRandomBreeders(StudentViewTimetableRandomBreederStrategy((:*>)))++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<*>))+#endif++-- | A number of generations in the evolution of the /timetable/.+type NGenerations	= Int++{- |+	* Uses the specified 'WeekDaze.Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableQuantifiedRandomBreeder' to breed a population of candidates from a parent /StudentViewTimetable/.+	The size of the population is initially defined by the specified /fecundity/,+	but is then dynamically controlled by feedback, in an attempt to maintain the configured minimum /diversity-ratio/ in the candidate populations.++	* The best /timetable/s (though potentially less fit than their parent), are used to seed subsequent generations to produce a family-tree.++	* By selecting fewer candidates from each successive generation, the resulting family-tree thins, & dies (when zero are selected).+	The best child from this entire tree is then compared with the original parent to determine whether any beneficial evolution has occurred;+	if fitter, then the whole process is restarted from that child, otherwise the evolution is terminated.+	The number of branches sprouting from any node in this tree, may be alternatively be variable if /maybeNInitialScouts/ is set to 'Nothing'.++	* The number of generations of evolution, the final fecundity of the breeding-program, & the evolved 'Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable'; are returned.+	The resulting 'nGenerations' is a typically a multiple of 'nInitialScouts' (where defined),+	since at each stage scouts are dispatched for this number of generations before returning & comparing for fitness with the original parent,+	& if a leaf-node is fittest then 'nInitialScouts' is added to 'nGenerations'.+-}+evolveQuantifiedStudentViewTimetable :: forall campus criterionValue criterionWeight fecundityDecayRatio level locationId populationDiversityRatio randomGen stream synchronisationId teacherId teachingRatio timeslotId weightedMean. (+	Control.DeepSeq.NFData	level,+	Control.DeepSeq.NFData	locationId,+	Control.DeepSeq.NFData	teacherId,+	Control.DeepSeq.NFData	timeslotId,+	Control.DeepSeq.NFData	weightedMean,+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Fractional		criterionValue,+	Fractional		weightedMean,+	Num			populationDiversityRatio,+	Ord			level,+	Ord			locationId,+	Ord			populationDiversityRatio,+	Ord			synchronisationId,+	Ord			teacherId,+	Ord			weightedMean,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		fecundityDecayRatio,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId,+	System.Random.RandomGen	randomGen+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level+	-> ExecutionConfiguration.TimetableBreederFecundity.Fecundity												-- ^ Define the size of the required population.+	-> randomGen																		-- ^ Permit mutation of each candidate wrt the parent from which it was bred.+	-> Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue	-- ^ The parent from which to breed a candidate population.+	-> (+		NGenerations,+		ExecutionConfiguration.TimetableBreederFecundity.Fecundity,+		Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue+	) -- Triple.+evolveQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis studentViewTimetableQuantifiedRandomBreeder	= evolve 0 {-nGenerations-} where+	evolutionStrategies	= ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions++	dispatchScouts+		:: Enum nGenerations+		=> Maybe Int+		-> (+			nGenerations,+			ExecutionConfiguration.TimetableBreederFecundity.Fecundity,+			randomGen,+			Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue+		)+		-> (+			nGenerations,+			ExecutionConfiguration.TimetableBreederFecundity.Fecundity,+			randomGen,+			Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue+		)+	dispatchScouts (Just 0 {-nScouts-}) parentQuadruple									= parentQuadruple	-- Not strictly necessary since the general case can handle zero.+	dispatchScouts maybeNScouts parentQuadruple@(nGenerations, fecundity, randomGen, quantifiedStudentViewTimetable)	= Data.List.maximumBy {-known as "Elitist Selection"-} (+		Data.Ord.comparing $ Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria . ToolShed.Data.Quadruple.getFourth+	 ) . (+		parentQuadruple :	-- Compare the fitness of the scouts with their parent; which as a side-effect ensures 'Data.List.maximumBy' doesn't receive a null list.+{-+	 ) . Control.Parallel.Strategies.withStrategy (+		Control.Parallel.Strategies.parList $ Control.Parallel.Strategies.parTuple4 Control.Parallel.Strategies.r0 Control.Parallel.Strategies.r0 Control.Parallel.Strategies.r0 Control.Parallel.Strategies.rdeepseq	-- Generates too many sparks.+-}+	 ) . map (+		dispatchScouts (+			fmap pred maybeNScouts	-- Progressively thin the family-tree, with each successive generation, until ultimately zero branches sprout.+		) {-recurse-} . (,,,) (+			succ nGenerations	-- Count the generations.+		) (+			(+				if fromIntegral (length distinctChildren) < ExecutionConfiguration.EvolutionStrategies.getMinimumPopulationDiversityRatio evolutionStrategies * fromIntegral fecundity	-- Check whether a diverse population of the requested size wasn't achieved, either because insufficient candidates were bred or because they were insufficiently diverse.+					then ceiling {-guarantee a minimum of one-} . (+						* ExecutionConfiguration.EvolutionStrategies.getFecundityDecayRatio evolutionStrategies	-- Reduce the fecundity when breeding the next generation.+					) . fromIntegral+					else id+			) fecundity+		) unusedRandomGen	-- Recursively dispatch scouts, some of whom may be less fit than their parent.+	 ) . (+		\candidates -> Data.Maybe.maybe (+			concat {-ungroup-} . take 1 {-perhaps zero-} . takeWhile (+				(+					> Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria quantifiedStudentViewTimetable	-- Since the number of scouts isn't decremented (ultimately to zero), require that the weighted mean over timetable-criteria increases, in order to guarantee termination.+				) . Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria . head {-of group of equals-}+			) $ Data.List.groupBy (+				ToolShed.Data.List.equalityBy Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria+			) candidates+		) (+			`take` candidates+		) maybeNScouts	-- Select either the specified number of scouts, or those which are fitter than their parent.+	 ) . Data.List.sortBy (+		flip $ Data.Ord.comparing Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria	-- Fittest candidate first.+	 ) . Control.Parallel.Strategies.withStrategy (+		Control.Parallel.Strategies.parList Control.Parallel.Strategies.rdeepseq	-- Evaluate each quantifiedStudentViewTimetable in parallel.+	 ) $ map (+		Implementation.QuantifiedStudentViewTimetable.mkQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis	-- Expensive, so postponed until after de-duplication.+	 ) distinctChildren where+		(distinctChildren, unusedRandomGen)	= Control.Arrow.first (+			Data.Set.toList . Data.Set.delete parentStudentViewTimetable {-remove any clone-} . Data.Set.fromList {-de-duplicate-} . Control.Parallel.Strategies.withStrategy (+				Control.Parallel.Strategies.parList Control.Parallel.Strategies.rdeepseq	-- Evaluate each studentViewTimetable in parallel.+			) . (+				$ parentStudentViewTimetable	-- Breed from the parent.+			) . studentViewTimetableQuantifiedRandomBreeder fecundity	-- Implement the breeding-program; which may produce fewer candidates than requested.+		 ) $ System.Random.split randomGen {-if identical timetables are selected from different generations, we still want to breed a distinct population from each-} where+			parentStudentViewTimetable	= Implementation.QuantifiedStudentViewTimetable.getStudentViewTimetable quantifiedStudentViewTimetable++	evolve+		:: Enum nGenerations+		=> nGenerations+		-> ExecutionConfiguration.TimetableBreederFecundity.Fecundity+		-> randomGen+		-> Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue+		-> (+			nGenerations,+			ExecutionConfiguration.TimetableBreederFecundity.Fecundity,+			Implementation.QuantifiedStudentViewTimetable.QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue+		) -- Triple.+	evolve nGenerations fecundity randomGen parentQuantifiedStudentViewTimetable+		| uncurry (>) $ ToolShed.Data.Pair.mirror Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria (+			ToolShed.Data.Quadruple.getFourth quadruple,+			parentQuantifiedStudentViewTimetable+		)		= ToolShed.Data.Quadruple.uncurry4 evolve quadruple			-- Tail-recurse.+		| otherwise	= (nGenerations, fecundity, parentQuantifiedStudentViewTimetable)	-- Triple.+		where+			quadruple	= dispatchScouts (+				ExecutionConfiguration.EvolutionStrategies.getMaybeNInitialScouts evolutionStrategies+			 ) (+				nGenerations,+				fecundity,+				randomGen,+				parentQuantifiedStudentViewTimetable+			 ) -- Quadruple.++{- |+	* Sequentially mutates the /timetable/, by firstly undefining all /lesson/s in a randomly selected /subject/,+	then by undefining progressively smaller sets of randomly selected /lesson/s.++	* The best /timetable/ is returned, according to the weighted mean of the /timetable-criteria/, by which it was improved at each stage.++	* An 'OutputFormat.EvolutionStrategyStatistics.EvolutionStrategyStatistics', for each strategy, is written to facilitate subsequent analysis.+-}+evolveStudentViewTimetable :: forall campus criterionValue criterionWeight fecundityDecayRatio level locationId populationDiversityRatio randomGen stream synchronisationId teacherId teachingRatio timeslotId weightedMean. (+	Control.DeepSeq.NFData	level,+	Control.DeepSeq.NFData	locationId,+	Control.DeepSeq.NFData	teacherId,+	Control.DeepSeq.NFData	timeslotId,+	Control.DeepSeq.NFData	weightedMean,+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Enum			weightedMean,+	Eq			campus,+	Fractional		criterionValue,+	Fractional		weightedMean,+	Num			populationDiversityRatio,+	Ord			level,+	Ord			locationId,+	Ord			populationDiversityRatio,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Ord			weightedMean,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		fecundityDecayRatio,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The initial value (returned by 'selectDeterministicStudentViewTimetable'), from which to evolve.+	-> Control.Monad.Writer.Writer [OutputFormat.EvolutionStrategyStatistics.EvolutionStrategyStatistics weightedMean criterionValue] (+		StudentView.Timetable.Timetable timeslotId locationId teacherId level+	) -- ^ The evolved /timetable/.+evolveStudentViewTimetable randomGen problemParameters executionOptions problemAnalysis studentViewTimetable+	| ExecutionConfiguration.CriterionWeight.areAllZero (+		ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights executionOptions+	)		= return {-to Writer-monad-} studentViewTimetable	-- No improvement can ever be measured.+	| otherwise	= fmap Implementation.QuantifiedStudentViewTimetable.getStudentViewTimetable . foldr (+		\(depletionStrategyName, reconstructionStrategyName, fecundity, studentViewTimetableQuantifiedRandomBreeder) quantifiedStudentViewTimetableWriter	-> do+			quantifiedStudentViewTimetable	<- quantifiedStudentViewTimetableWriter	-- Receive the fittest from the previous evolution-strategy.++			let+				(nGenerations, finalFecundity, quantifiedStudentViewTimetable')	= evolveQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis studentViewTimetableQuantifiedRandomBreeder fecundity randomGen quantifiedStudentViewTimetable	-- Implement the current evolution-strategy, & gather timetable-criteria from the selected candidate, in each generation. Since each strategy is different, the random-generator can be re-used.++			Control.Monad.Writer.tell [+				OutputFormat.EvolutionStrategyStatistics.mkEvolutionStrategyStatistics depletionStrategyName reconstructionStrategyName fecundity finalFecundity (+					Implementation.QuantifiedStudentViewTimetable.calculateImprovementFactor quantifiedStudentViewTimetable quantifiedStudentViewTimetable'+				 ) (+					Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria quantifiedStudentViewTimetable'+				 ) nGenerations $ if nGenerations == 0+					then Nothing+					else Just $ Implementation.QuantifiedStudentViewTimetable.getTimetableCriteriaValues quantifiedStudentViewTimetable'+			 ] -- Singleton-list.++			return {-to Writer-monad-} quantifiedStudentViewTimetable'	-- Forward the fittest candidate to the next evolution-strategy.+	) (+		return {-to Writer-monad-} $ Implementation.QuantifiedStudentViewTimetable.mkQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis studentViewTimetable	-- Initial value.+	) . filter (+		(> 0) . ToolShed.Data.Quadruple.getThird {-fecundity-}	-- Reduce unnecessary logging.+	) $ [+		specifyRandomBreedingStrategy,	-- Relatively ineffective, but can explore a part of the solution-space unreachable by 'Implementation.DeterministicConstructor.mutateStudentViewTimetable'.+		specifyDeterministicBreedingStrategy+	] {-functions which require a triple-} <*> map (+		\studentViewTimetableRandomBreederStrategy -> (+			show studentViewTimetableRandomBreederStrategy,	-- Generate a name for this strategy.+			Implementation.StudentViewTimetableRandomBreeders.getTimetableBreederFecundity studentViewTimetableRandomBreederStrategy evolutionStrategies,+			Implementation.StudentViewTimetableRandomBreeders.breed studentViewTimetableRandomBreederStrategy problemAnalysis problemParameters	-- Encapsulates both the depleter & the reconstructor.+		) -- Triple to which the above functions can be applied.+	) [+		Implementation.StudentViewTimetableRandomBreeders.SplitSessionMutation :*> randomLessonMutation,		-- Targets a specific problem, but needs additional space to work. CAVEAT: split sessions can only be generated during random reconstruction.+		Implementation.StudentViewTimetableRandomBreeders.ExcessRunlengthMutation :*> randomLessonMutation,		-- Targets a specific problem, but needs additional space to work.+		Implementation.StudentViewTimetableRandomBreeders.IncompleteCourseMutation :*> randomLessonMutation,		-- Targets a specific problem, but needs additional space to work.+		Implementation.StudentViewTimetableRandomBreeders.StudentBodyCombinationMutation :*> randomLessonMutation,	-- Targets a specific problem, but needs additional space to work.+		Implementation.StudentViewTimetableRandomBreeders.SingletonStudentClassMutation :*> randomLessonMutation,	-- Targets a specific problem, but needs additional space to work.+		uncurry Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableForWeekMutation $ (ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationNTrials &&& ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationNTimeslots) evolutionStrategies,	-- Highly effective, but can't easily change a student's routine; so perform after that's been refined.+		Implementation.StudentViewTimetableRandomBreeders.HomogeneousStudentViewLessonMutation,				-- Breaks a student's routine (relationship for a subject, with a location & teacher), allowing exploration of alternatives.+		Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableForDayMutation $ ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForDayMutationMaybeNDays evolutionStrategies,	-- Probably the most effective strategy.+		Implementation.StudentViewTimetableRandomBreeders.SynchronisedCourseByDayMutation :*> Implementation.StudentViewTimetableRandomBreeders.SynchronousLessonMutation,+		Implementation.StudentViewTimetableRandomBreeders.SynchronisedCourseMutation					-- Relocating synchronised courses is highly disruptive, so locate these before proceeding up the list.+	] -- Generate combinations of depleter & re-constructor. CAVEAT: 'foldr' applies these in reverse order.+	where+		evolutionStrategies	= ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions+		randomLessonMutation	= uncurry Implementation.StudentViewTimetableRandomBreeders.RandomLessonMutation $ (ExecutionConfiguration.EvolutionStrategies.getRandomLessonMutationNTrials &&& ExecutionConfiguration.EvolutionStrategies.getRandomLessonMutationNTimeslots) evolutionStrategies	-- For application with another depleter to liberate space for change. The intention is to apply it after a specific-issue depleter, & as such it won't be invoked unless that issue exists; if applied before the other specific-issue depleter, then it might create that issue.++		selectUnallocatedAvailableUnreservedCoordinatePermutations+			:: ExecutionConfiguration.TimetableBreederFecundity.Fecundity+			-> randomGen+			-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+			-> [StudentView.TimetableCoordinates.Vector timeslotId]+		selectUnallocatedAvailableUnreservedCoordinatePermutations fecundity randomGen'	= (+			\unallocatedAvailableUnreservedCoordinates -> if Factory.Math.Factorial.factorial (+				Data.Default.def	:: Factory.Math.Implementations.Factorial.Algorithm+			) (fromIntegral $ length unallocatedAvailableUnreservedCoordinates) <= toInteger {-avoid overflow in factorial-} fecundity+				then Data.List.permutations unallocatedAvailableUnreservedCoordinates	-- Generate all coordinate-permutations (the order is consequently irrelevant), which will either be equal or fewer than required.+				else take fecundity . Data.List.nub {-lazy-} . map (+					`ToolShed.System.Random.shuffle` unallocatedAvailableUnreservedCoordinates+				) $ ToolShed.System.Random.randomGens randomGen'	-- The number of coordinate-permutations is excessive, so randomly select the required number of distinct coordinate-vectors.+		 ) . Dynamic.StudentViewTimetableUtilities.locateUnallocatedAvailableUnreservedCoordinates problemParameters problemAnalysis++		specifyDeterministicBreedingStrategy+			:: (+				String,+				ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,+				Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level -> studentViewTimetableRandomBreeder+			) -- Triple.+			-> (+				String,+				String,+				ExecutionConfiguration.TimetableBreederFecundity.Fecundity,+				studentViewTimetableRandomBreeder+			) -- Quadruple.+		specifyDeterministicBreedingStrategy (tag, timetableBreederFecundity, studentViewTimetableBreederMutator)	= (+			tag,+			"Deterministic",+			ExecutionConfiguration.TimetableBreederFecundity.getDeterministicConstructorFecundity timetableBreederFecundity,+			studentViewTimetableBreederMutator studentViewTimetableBreeder	-- Partially apply, by defining the call-back.+		 ) where+			studentViewTimetableBreeder :: Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level+			studentViewTimetableBreeder fecundity randomGen'	= map (+				fst {-studentViewTimetable-} . Control.Arrow.second (+					\lessonCriteriaStatistics -> lessonCriteriaStatistics :: [Maybe ((Rational {-mean-}, Double {-standard deviation-}), (Rational {-min-}, Rational {-max-}))]	-- The type of the discarded statistics should still be defined.+				) . Control.Monad.Writer.runWriter+			 ) . uncurry map . (+				Implementation.DeterministicConstructor.mutateStudentViewTimetable problemParameters executionOptions problemAnalysis &&& selectUnallocatedAvailableUnreservedCoordinatePermutations fecundity randomGen'+			 )++		specifyRandomBreedingStrategy+			:: (+				String,+				ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,+				Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level -> studentViewTimetableRandomBreeder+			) -- Triple.+			-> (+				String,+				String,+				ExecutionConfiguration.TimetableBreederFecundity.Fecundity,+				studentViewTimetableRandomBreeder+			) -- Quadruple.+		specifyRandomBreedingStrategy (tag, timetableBreederFecundity, studentViewTimetableBreederMutator)	= (+			tag,+			"Random",+			ExecutionConfiguration.TimetableBreederFecundity.getRandomConstructorFecundity timetableBreederFecundity,+			studentViewTimetableBreederMutator studentViewTimetableBreeder	-- Partially apply, by defining the call-back.+		 ) where+			studentViewTimetableBreeder :: Implementation.StudentViewTimetableRandomBreeders.StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level+			studentViewTimetableBreeder fecundity randomGen'	= uncurry map . (+				Implementation.RandomConstructor.mutateStudentViewTimetable randomGen' problemParameters executionOptions problemAnalysis &&& selectUnallocatedAvailableUnreservedCoordinatePermutations fecundity randomGen'+			 )++{- |+	* Generates the initial /student/-view of the /timetable/,+	by a deterministic process of raster-scanning the /time-slot/s in the three-dimensional structure,+	& at each /time-slot/ selecting the best /lesson/ according to the weighted mean over all heterogeneous /lesson-criteria/.++	* The raster-scan can be performed via many different routes through the three-dimensional structure of the /timetable/.+	This can be precisely specified, but since it's difficult to choose the optimal route in advance,+	typically one opts to traverse all permutations in parallel, selecting the best according to the weighted mean over all heterogeneous /timetable-criteria/.++	* Whilst one could replace the regular raster with a random walk, it doesn't seem to be competitive.++	* Ancillary data is returned to facilitate subsequent analysis.+-}+selectDeterministicStudentViewTimetable :: forall campus criterionValue criterionWeight fecundityDecayRatio level locationId mean populationDiversityRatio standardDeviation stream synchronisationId teacherId teachingRatio timeslotId weightedMean. (+	Control.DeepSeq.NFData	weightedMean,+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Floating		standardDeviation,+	Fractional		criterionValue,+	Fractional		mean,+	Fractional		weightedMean,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	Ord			weightedMean,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Maybe (StudentView.Timetable.Timetable timeslotId locationId teacherId level)	-- ^ Read from 'ExecutionConfiguration.ExecutionOptions.getMaybeHint' for the case of /Right inputFilePath/.+	-> OutputFormat.DeterministicStudentViewTimetableSelection.DeterministicStudentViewTimetableSelection criterionValue criterionWeight level locationId mean standardDeviation teacherId timeslotId weightedMean+selectDeterministicStudentViewTimetable problemParameters executionOptions problemAnalysis maybeInitialStudentViewTimetable	= (+	\(+		(+			(studentViewTimetable, initialLessonCriteriaStatistics),	-- Pair.+			initialTimetableCriterionValues+		), -- Pair.+		weightedMeanOfTimetableCriteriaByTraversalOrder+	) {-pair-} -> OutputFormat.DeterministicStudentViewTimetableSelection.mkDeterministicStudentViewTimetableSelection studentViewTimetable initialLessonCriteriaStatistics initialTimetableCriterionValues weightedMeanOfTimetableCriteriaByTraversalOrder+ ) . Data.Maybe.maybe (+	selectBestRasterScan Model.TimetableAxisTriple.permutations+ ) (+	(+		\traversalOrder -> if Model.TimetableAxisTriple.hasWildSense traversalOrder+			then selectBestRasterScan $ Model.TimetableAxisTriple.generatePermutationsOf traversalOrder+			else Control.Arrow.second Left . getTimetableFor $ generateStudentViewTimetableCoordinateVector traversalOrder+	) `either` const {-drop file-path-} (+		Data.Maybe.maybe (+			error "WeekDaze.Implementation.EvolutionaryAlgorithm.selectDeterministicStudentViewTimetable:\tinitial studentViewTimetable is unspecified."+		) (+			\studentViewTimetable -> (+				(,) (+					studentViewTimetable,+					[{-initialLessonCriteriaStatistics-}]+				) . Implementation.QuantifiedStudentViewTimetable.getTimetableCriteriaValues &&& Left . Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria+			) $ Implementation.QuantifiedStudentViewTimetable.mkQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis studentViewTimetable+		) maybeInitialStudentViewTimetable+	) -- A file-path to the initial studentViewTimetable was specified, so the corresponding parsed studentViewTimetable should have been passed as a parameter.+ ) $ ExecutionConfiguration.ExecutionOptions.getMaybeHint executionOptions where+	selectBestRasterScan+		:: [Model.TimetableAxisTriple.Axes]+		-> (+			(+				(+					StudentView.Timetable.Timetable timeslotId locationId teacherId level,+					[+						Maybe (+							Implementation.DeterministicConstructor.LessonCriteriaStatistics criterionValue mean standardDeviation+						)+					]+				),+				[+					Maybe criterionValue+				]+			),+			Either a [+				(Model.TimetableAxisTriple.Axes, weightedMean)+			]+		)+	selectBestRasterScan	= (+		snd {-drop traversalOrder-} . fst {-drop weightedMeanOfTimetableCriteria-} . Data.List.maximumBy (+			Data.Ord.comparing snd {-weightedMeanOfTimetableCriteria-}+		) &&& Right . map (+			Control.Arrow.first fst {-traversalOrder-}+		)+	 ) . Control.Parallel.Strategies.withStrategy (+		Control.Parallel.Strategies.parList $ Control.Parallel.Strategies.parTuple2 Control.Parallel.Strategies.r0 Control.Parallel.Strategies.rdeepseq {-weightedMeanOfTimetableCriteria-}+	 ) . map (+		\traversalOrder -> Control.Arrow.first (+			(,) traversalOrder	-- Document the means by which this solution was created.+		) . getTimetableFor $ generateStudentViewTimetableCoordinateVector traversalOrder+	 )++	generateStudentViewTimetableCoordinateVector :: Model.TimetableAxisTriple.Axes -> StudentView.TimetableCoordinates.Vector timeslotId+	generateStudentViewTimetableCoordinateVector traversalOrder	= filter (+		uncurry (+			ProblemConfiguration.ProblemAnalysis.isFree problemParameters+		) . (+			Model.TimetableCoordinates.getTime &&& (studentBodyRegister !) . Model.TimetableCoordinates.getObserverId+		) -- Select only those times, when the student is both available & not booked for a meeting.+	 ) . Model.Traverse.generateRasterCoordinates traversalOrder (+		Data.List.sortBy (+			Data.Ord.comparing Aggregate.StudentBody.getSize	-- More meaningful than the native alphabetical order.+		) $ Aggregate.StudentBodyRegister.getStudentBodies studentBodyRegister+	 ) $ ProblemConfiguration.ProblemAnalysis.getTimeslotIdRange problemAnalysis where+		studentBodyRegister	= ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters++	getTimetableFor+		:: StudentView.TimetableCoordinates.Vector timeslotId+		-> (+			(+				(+					StudentView.Timetable.Timetable timeslotId locationId teacherId level,+					[Maybe (Implementation.DeterministicConstructor.LessonCriteriaStatistics criterionValue mean standardDeviation)]+				),+				[Maybe criterionValue]+			),+			weightedMean+		) -- Pair.+	getTimetableFor = (+		\pair -> (+			(,) pair . Implementation.QuantifiedStudentViewTimetable.getTimetableCriteriaValues &&& Implementation.QuantifiedStudentViewTimetable.getWeightedMeanOfTimetableCriteria+		) . Implementation.QuantifiedStudentViewTimetable.mkQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis $ fst {-studentViewTimetable-} pair -- Evaluate the initial deterministic timetable.+	 ) . Control.Monad.Writer.runWriter . Implementation.DeterministicConstructor.mutateStudentViewTimetable problemParameters executionOptions problemAnalysis (+		ProblemConfiguration.ProblemAnalysis.getFreeStudentViewTimetable problemAnalysis+	 )++{- |+	* Repeatedly randomly mutates the /lesson-criteria weights/ over the specified number of trials,+	in an attempt to improve them according to the weighted mean over heterogeneous /timetable-criteria/ for the resulting /deterministic student-view timetable/.++	* The proposed set of /lesson-criteria weights/ is considered to be improved, if the mean over (or maximum of) each raster-scan, of the weighted-mean over /timetable-criteria/, improves.++	* After finding a better set of /lesson-criteria weights/, the /change-magnitude/ is reduced by multiplication by the specified /reduction-factor/;+	see 'ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights'.+-}+optimiseLessonCriteriaWeights :: (+	Control.Parallel.Strategies.NFData	weightedMean,+	Data.Array.IArray.Ix			timeslotId,+	Enum					criterionValue,+	Enum					criterionWeight,+	Enum					timeslotId,+	Eq					campus,+	Floating				standardDeviation,+	Fractional				criterionValue,+	Fractional				criterionWeight,+	Fractional				mean,+	Fractional				weightedMean,+	Ord					level,+	Ord					locationId,+	Ord					stream,+	Ord					synchronisationId,+	Ord					teacherId,+	Real					criterionValue,+	Real					criterionWeight,+	RealFrac				teachingRatio,+	Real					weightedMean,+	Show					criterionWeight,+	Show					level,+	Show					locationId,+	Show					teacherId,+	Show					timeslotId,+	System.Random.Random			criterionWeight,+	System.Random.RandomGen			randomGen+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Maybe (StudentView.Timetable.Timetable timeslotId locationId teacherId level)	-- ^ Where an initial /student-view timetable/ has been read from file.+	-> randomGen										-- ^ Only used if @ ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights.isRequired @.+	-> Control.Monad.Writer.Writer (OutputFormat.EvolutionStrategyStatistics.OptimiseLessonCriteriaWeightsLog criterionWeight weightedMean) (+		ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio,+		OutputFormat.DeterministicStudentViewTimetableSelection.DeterministicStudentViewTimetableSelection criterionValue criterionWeight level locationId mean standardDeviation teacherId timeslotId weightedMean+	) -- ^ A Writer which logs the magnitude of the perturbation & the increase in the mean or maximum over all specified raster-scans of the weighted mean over heterogeneous timetable-criteria, & carries a payload of (The modified execution-options, The initial deterministic timetable & various statistics).+optimiseLessonCriteriaWeights problemParameters executionOptions problemAnalysis maybeStudentViewTimetable	= fmap (+	ToolShed.Data.Triple.getSecond &&& ToolShed.Data.Triple.getThird+ ) . foldr (+	\(trialNumber, randomGen) writer	-> do+		originalTriple@(changeMagnitude, _, _)	<- writer	-- Extract the payload from the monad.++		let+			proposedExecutionOptions	= executionOptions {+				ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights	= ExecutionConfiguration.LessonCriteriaWeights.perturbWeights randomGen changeMagnitude . ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights $ ToolShed.Data.Triple.getSecond {-execution-options-} originalTriple+			} -- Randomly mutate the lesson-criteria weights.++			proposedTriple	= (+				changeMagnitude * ExecutionConfiguration.OptimiseLessonCriteriaWeights.getReductionFactor optimiseLessonCriteriaWeightsData,	-- Reduce the perturbation-magnitude.+				proposedExecutionOptions,+				selectDeterministicStudentViewTimetable problemParameters proposedExecutionOptions problemAnalysis Nothing {-proposing an initial studentViewTimetable makes no sense-}+			 )++			changeBetweenRasterScansOfWeightedMeanOverTimetableCriteria	= uncurry (-) $ ToolShed.Data.Pair.mirror (+				either id (+					(+						if ExecutionConfiguration.OptimiseLessonCriteriaWeights.getUseMeanOverRasterScans optimiseLessonCriteriaWeightsData+							then Factory.Math.Statistics.getMean+							else maximum+					) . map snd {-weighted mean over timetable-criteria-}+				) . OutputFormat.DeterministicStudentViewTimetableSelection.getWeightedMeanOfTimetableCriteria . ToolShed.Data.Triple.getThird+			 ) (proposedTriple, originalTriple)+		if changeMagnitude == 0 {-avoid unnecessary evaluation-} || changeBetweenRasterScansOfWeightedMeanOverTimetableCriteria <= 0+			then return {-to Writer-monad-} originalTriple+			else do+				Control.Monad.Writer.tell [(trialNumber, changeMagnitude, changeBetweenRasterScansOfWeightedMeanOverTimetableCriteria)]++				return {-to Writer-monad-} proposedTriple+ ) (+	return {-to Writer-monad-} (+		ExecutionConfiguration.OptimiseLessonCriteriaWeights.getChangeMagnitude optimiseLessonCriteriaWeightsData,+		executionOptions,+		selectDeterministicStudentViewTimetable problemParameters executionOptions problemAnalysis maybeStudentViewTimetable+	) {-initial triple-}+ ) . reverse . zip [1 ..] . take (+	ExecutionConfiguration.OptimiseLessonCriteriaWeights.getNTrials optimiseLessonCriteriaWeightsData+ ) . ToolShed.System.Random.randomGens where+	optimiseLessonCriteriaWeightsData	= ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights executionOptions+
+ src-exe/WeekDaze/Implementation/QuantifiedStudentViewTimetable.hs view
@@ -0,0 +1,111 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Encapsulates a /student-view timetable/ with an evaluation of its fitness for purpose.+-}++module WeekDaze.Implementation.QuantifiedStudentViewTimetable(+-- * Types+-- ** Data-types+	QuantifiedStudentViewTimetable(+--		MkQuantifiedStudentViewTimetable,+		getStudentViewTimetable,+		getTimetableCriteriaValues,+		getWeightedMeanOfTimetableCriteria+	),+-- * Functions+	calculateImprovementFactor,+-- ** Constructor+	mkQuantifiedStudentViewTimetable+) where++import qualified	Control.DeepSeq+import qualified	Control.Monad.Writer	-- The lazy instance.+import qualified	Data.Array.IArray+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.Implementation.TimetableFitness		as Implementation.TimetableFitness+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable++-- | A /timetable/ quantified by the individual weighted /timetable-criteria/ & their mean.+data QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue	= MkQuantifiedStudentViewTimetable {+	getStudentViewTimetable			:: StudentView.Timetable.Timetable timeslotId locationId teacherId level,	-- ^ The /timetable/.+	getWeightedMeanOfTimetableCriteria	:: weightedMean,								-- ^ The /fitness/ of the /timetable/, according to the weighted mean of the /timetable-criteria/.+	getTimetableCriteriaValues		:: [Maybe criterionValue]							-- ^ The /timetable-criteria/ values; 'Nothing' if the corresponding criterion-weight is zero.+}++instance (Data.Array.IArray.Ix timeslotId, Eq level, Eq locationId, Eq teacherId) => Eq (QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue) where+	l == r	= getStudentViewTimetable l == getStudentViewTimetable r	-- Stricter than mere comparison between 'getWeightedMeanOfTimetableCriteria'.++instance Control.DeepSeq.NFData weightedMean => Control.DeepSeq.NFData (QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue) where+	rnf	= Control.DeepSeq.rnf . getWeightedMeanOfTimetableCriteria	-- Evaluation of the other fields is a prerequisite for the 'weightedMean', but explicitly evaluating only the latter, requires a minimal context.++{- |+	* Constructor.++	* Takes a /timetable/ & quantifies it with the /weighted mean/ over all /timetable-criteria/.++	* Records the value of each /timetable-criterion/.+-}+mkQuantifiedStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Fractional		criterionValue,+	Fractional		weightedMean,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue+mkQuantifiedStudentViewTimetable problemParameters executionOptions problemAnalysis studentViewTimetable	= uncurry (+	MkQuantifiedStudentViewTimetable studentViewTimetable+ ) . Control.Monad.Writer.runWriter $ Implementation.TimetableFitness.evaluateFitness problemParameters executionOptions problemAnalysis studentViewTimetable++-- | Quantifies the factor by which the second /timetable/ is fitter than the first, according to the weighted mean of their /timetable-criteria/.+calculateImprovementFactor :: (+	Enum		weightedMean,+	Eq		weightedMean,+	Fractional	weightedMean+ )+	=> QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue	-- ^ The original against which to compare.+	-> QuantifiedStudentViewTimetable weightedMean timeslotId locationId teacherId level criterionValue	-- ^ The proposed alternative.+	-> Maybe weightedMean											-- ^ Infinity is represented by 'Nothing'.+calculateImprovementFactor original proposed	= case ToolShed.Data.Pair.mirror getWeightedMeanOfTimetableCriteria (proposed, original) of+	(0, 0)	-> Just 0	-- Zero improvement.+	(_, 0)	-> Nothing	-- Infinite improvement.+	ratio	-> Just . pred $ uncurry (/) ratio+
+ src-exe/WeekDaze/Implementation/RandomConstructor.hs view
@@ -0,0 +1,255 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Constructs a /timetable/, based on the one specified, but with unallocated /time-slot/s booked where possible,+	with /lesson/-definitions conforming to the problem-specification, but are otherwise randomly selected.++	* It may be necessary to unbook some /lesson/s first, to create construction-space.+-}++module WeekDaze.Implementation.RandomConstructor(+-- * Functions+--	bookAtomicallySynchronisedLessons,+	mutateStudentViewTimetable+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	System.Random+import qualified	ToolShed.System.Random+import qualified	WeekDaze.Aggregate.LocationCatalogue			as Aggregate.LocationCatalogue+import qualified	WeekDaze.Aggregate.StudentBody				as Aggregate.StudentBody+import qualified	WeekDaze.Data.Course					as Data.Course+import qualified	WeekDaze.Data.Resource					as Data.Resource+import qualified	WeekDaze.Data.Student					as Data.Student+import qualified	WeekDaze.Data.Teacher					as Data.Teacher+import qualified	WeekDaze.Dynamic.HumanViewTimetable			as Dynamic.HumanViewTimetable+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities		as Dynamic.StudentViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.Model.Lesson					as Model.Lesson+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableCoordinates			as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForDay				as Model.TimetableForDay+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.LessonResourceIds			as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.StudentView.TimetableCoordinates		as StudentView.TimetableCoordinates+import qualified	WeekDaze.Temporal.Time					as Temporal.Time++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<*>))+#endif++{- |+	* If the specified /lesson/ (which is assumed to have already been booked), is a member of a set of /synchronised courses/,+	then where required, attempt to book synchronous /lesson/s for the other /teacher/s.++	* The /subject/ & /teacher/ of any additional /lesson/s is defined by their respective synchronised /course/s.+	The /locationId/ & /student-body/ for any additional /lesson/s are selected randomly.++	* CAVEAT: any additional /booking/s are delegated to 'Dynamic.StudentViewTimetableUtilities.bookAtomicallyWithRamifications',+	which accounts for further ramifications; e.g. other /time/s specified by the /course/, & non-trivial /minimum consecutive lessons/.++	* CAVEAT: before changing, review the namesake 'Implementation.DeterministicConstructor.bookAtomicallySynchronisedLessons'.+-}+bookAtomicallySynchronisedLessons :: forall campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio randomGen stream synchronisationId teacherId teachingRatio timeslotId. (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId,+	System.Random.RandomGen	randomGen+ ) => randomGen -> Dynamic.StudentViewTimetableUtilities.BookAtomically campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+bookAtomicallySynchronisedLessons randomGen problemParameters@ProblemConfiguration.ProblemParameters.MkProblemParameters {+	ProblemConfiguration.ProblemParameters.getLocationCatalogue	= locationCatalogue,+	ProblemConfiguration.ProblemParameters.getStudentBodyRegister	= studentBodyRegister,+	ProblemConfiguration.ProblemParameters.getTeacherRegister	= teacherRegister+} executionOptions problemAnalysis course studentViewBooking {-already booked-} humanViewTimetablePair	= Data.Maybe.maybe (+	Just humanViewTimetablePair	-- Since the original booking has already been made, no action is required.+ ) slave $ Data.Course.getMaybeSynchronisationId course where+	studentViewTimetableCoordinates			= Model.Timetable.getBookedCoordinates studentViewBooking	-- Access.+	(bookedStudentBody, time)			= Model.TimetableCoordinates.getObserverId &&& Model.TimetableCoordinates.getTime $ studentViewTimetableCoordinates	-- Deconstruct.+	day						= Temporal.Time.getDay time	-- The day on which to book a lesson, for each synchronised course.+	(studentViewTimetable, teacherViewTimetable)	= Dynamic.HumanViewTimetable.getStudentViewTimetable &&& Dynamic.HumanViewTimetable.getTeacherViewTimetable $ humanViewTimetablePair	-- Deconstruct.++	isAvailable :: Data.Resource.Resource resource => resource -> Bool+	isAvailable	= Data.Resource.isAvailableOn day	-- Partially apply.++	slave :: synchronisationId -> Maybe (Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level)+	slave synchronisationId+		| or [+			any (+				\(teacherId, synchronisedCourse)	-> Model.Timetable.hasMatchingLessonAt (+					(/= Data.Course.getSubject synchronisedCourse) . Model.Lesson.getSubject	-- Check for an incompatible booking.+				) (teacherId, time) {-coordinates-} teacherViewTimetable+			) $ Data.Map.toList synchronisedCoursesByTeacherId,	-- Some of the teachers of this set of synchronised courses, have booked a lesson at the required time, but in the wrong subject.+			not $ all isAvailable synchronisedTeacherProfiles,	-- Some of the required teachers are unavailable on the required day.+			any (+				Data.Foldable.any (Data.Course.isASpecifiedTime time) . Data.Set.filter (+					(/= Just synchronisationId) . Data.Course.getMaybeSynchronisationId	-- Consider only other courses.+				) . Data.Teacher.getService+			) synchronisedTeacherProfiles,	-- Some of the teachers of this set of synchronised courses, are already committed at the required time; even if it's not yet booked.+			not . Data.Foldable.all isAvailable $ Data.Map.filter (+				Data.Student.requiresAnySubjectBy (+					`Data.Foldable.elem` Data.Map.map Data.Course.getSubject requiredSynchronisedCoursesByTeacherId+				)+			) studentBodyRegister	-- Some interested student-bodies are unavailable. TODO: inessential; not all student-bodies must sit each lesson simultaneously with all other bodies ?+		]							= Nothing			-- Some of the resources are unavailable or otherwise committed.+		| Data.Map.null requiredSynchronisedCoursesByTeacherId	= Just humanViewTimetablePair	-- Lessons for all the synchronised courses have already been booked at the required time.+		| otherwise						= ToolShed.System.Random.select randomGen humanViewTimetablePairs+		where+			synchronisedCoursesByTeacherId		= ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis ! synchronisationId	-- Extract this set of synchronised courses.++			requiredSynchronisedCoursesByTeacherId	= Data.Map.filterWithKey (+				\teacherId _	-> not $ Model.Timetable.isDefinedTimeslot (teacherId, time) teacherViewTimetable+			 ) synchronisedCoursesByTeacherId	-- We've checked that teachers who offer one of this set of synchronised courses, & who're booked at this time, must be teaching the correct subject; find those who're unbooked.+			synchronisedTeacherProfiles		= map (teacherRegister !) $ Data.Map.keys requiredSynchronisedCoursesByTeacherId+{-+	Starting from a singleton constructed from the original timetable-pair,+	book one lesson, in the synchronised course offered by each of the other teachers, thus maintaining the synchronisation required.+	Returns all viable permutations, along with an evaluation of their fitness.++	CAVEAT:+		This algorithm only books ONE of the student-bodies interested in each of the required synchronised courses.+		This is sufficient but suboptimal; since student-body S1 can't be split, S2 & S3 MUST merge if they're to book a second lesson:++					Time 1	Time 2+					======	======+		(Teacher 1,Course a)	S1	S1+		(Teacher 2,Course b)	S2	S3++		So, if after booking S1, S1 xor S2 is booked,+		then when the requirement for the other is discovered, the booking can only be made, by merging with the previous booking,+		even though all the teachers at that time are already, as minimally required, booked.+-}+			humanViewTimetablePairs :: [Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level]+			humanViewTimetablePairs	= Data.Map.foldr (+				\unaryBookingFunctions -> Data.Maybe.catMaybes {-forward viable permutations to the next teacher-} . (+					unaryBookingFunctions <*>	-- Generate permutations of the list of unary functions applied to the list of possible Human-view TimetablePairs.+				)+			 ) [+				humanViewTimetablePair+			 ] {-Initial value-} $ Data.Map.mapWithKey (+				\teacherId synchronisedCourse	-> [+					Dynamic.StudentViewTimetableUtilities.bookAtomicallyWithRamifications Dynamic.StudentViewTimetableUtilities.bookAtomicallyNothing {-continuation. CAVEAT: don't call 'bookAtomicallySynchronisedLessons' recursively, which would book lessons, that this call has identify as required-} problemParameters executionOptions problemAnalysis synchronisedCourse synchronisedStudentViewBooking |	-- Construct a unary booking-function by partial application.+						let subject	= Data.Course.getSubject synchronisedCourse,	-- Find the single subject offered by this teacher of one of the synchronised courses.+						studentBody	<- Data.Map.keys $ Data.Map.filter (+							Data.Set.member subject . Data.Student.deriveAmalgamatedKnowledgeRequirement+						) studentBodyRegister,	-- Find the student-bodies requiring the subject offered by this teacher of the synchronised courses.+						studentBody /= bookedStudentBody,	-- The synchronised lessons can't involve the same studentBody as the original 'studentViewBooking'.+						not . uncurry (||) . (+							Model.TimetableForWeek.isDefinedTimeslot time {-check the student-body isn't already booked-} &&& Model.TimetableForDay.isSubjectBooked subject . (Data.Array.IArray.! day)+						) $ studentViewTimetable ! studentBody,+						not $ ProblemConfiguration.ProblemAnalysis.doAllCoursesSatifyingAnotherKnowledgeRequirementSpecifyThisTime problemParameters problemAnalysis subject studentViewTimetableCoordinates,	-- Avoid booking-times specified by all courses that match one of the other knowledge-requirements of this student-body.+						locationId	<- Data.Map.keys $ Aggregate.LocationCatalogue.findSuitableLocations (+							Aggregate.StudentBody.getSize studentBody+						) (+							Data.Course.getRequiredFacilityNames synchronisedCourse+						) $ Data.Map.filter isAvailable locationCatalogue,	-- Identify suitable locations.+						(/= locationId) . StudentView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds $ Model.Timetable.getBookedLesson studentViewBooking, -- The synchronised lessons can't occupy the same location as the original 'studentViewBooking'.+						let synchronisedStudentViewBooking	= ((studentBody, time), Model.Lesson.MkLesson (StudentView.LessonResourceIds.MkLessonResourceIds locationId teacherId) subject),+						Dynamic.StudentViewTimetableUtilities.isSuitableBooking problemParameters executionOptions problemAnalysis humanViewTimetablePair synchronisedStudentViewBooking	-- Remove any which are unsuitable in the context of the specified timetable.+				] -- List-comprehension: to generate a list of viable student-view bookings for this teacher.+			 ) requiredSynchronisedCoursesByTeacherId++{- |+	* Books where possible, /lesson/s into unallocated /time-slot/s, in the specified /timetable/, at the specified /coordinates/.++	* Each /lesson/ booked, is randomly selected from a set constrained only by the /problem-parameters/.+	No /lesson/s are discarded merely because they're considered to be a poor choice at the specified /coordinates/ in the specified /timetable/,+	which permits exploration of a wider solution-space than 'Implementation.DeterministicConstructor.mutateStudentViewTimetable'.+-}+mutateStudentViewTimetable :: forall campus criterionWeight fecundityDecayRatio level locationId populationDiversityRatio randomGen stream synchronisationId teacherId teachingRatio timeslotId. (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			stream,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The initial /timetable/ on which to base the mutation.+	-> StudentView.TimetableCoordinates.Vector timeslotId				-- ^ The ordered list of /coordinates/ to visit.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+mutateStudentViewTimetable randomGen problemParameters executionOptions problemAnalysis studentViewTimetable	= Dynamic.HumanViewTimetable.getStudentViewTimetable . fst {-humanViewTimetablePair-} . foldr (+	\studentViewTimetableCoordinates visitor@(humanViewTimetablePair, randomGen')	-> let+		studentBody	= Model.TimetableCoordinates.getObserverId studentViewTimetableCoordinates	-- Deconstruct.+	in if Model.Timetable.isDefinedTimeslot studentViewTimetableCoordinates $ Dynamic.HumanViewTimetable.getStudentViewTimetable humanViewTimetablePair+		then visitor	-- No change.+		else Control.Arrow.first (+			\randomGen''	-> let+				humanViewTimetablePairs :: [Dynamic.HumanViewTimetable.TimetablePair timeslotId locationId teacherId level]+				humanViewTimetablePairs	= Data.Maybe.mapMaybe (+					($ humanViewTimetablePair) . uncurry (+						Dynamic.StudentViewTimetableUtilities.bookAtomicallyWithRamifications (+							bookAtomicallySynchronisedLessons randomGen''	-- Continuation.+						) problemParameters executionOptions problemAnalysis	-- Either make all or none of the bookings mandated by this lesson's course.+					) . (+						ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters &&& (,) studentViewTimetableCoordinates {-construct a booking-}+					)+				 ) . ToolShed.System.Random.shuffle randomGen'' . filter (+					(+						`Data.Set.member` (+							Data.Map.map Data.Student.amalgamateKnowledgeRequirements (+								Dynamic.StudentViewTimetableUtilities.findIncompletelyBookedKnowledgeRequirementsByStudentBody problemParameters studentViewTimetable+							) ! studentBody+						)+					) . Model.Lesson.getSubject	-- For efficiency, select only those subjects which are still required.+				 ) $ ProblemConfiguration.ProblemAnalysis.getRequiredLessonCombinationsByStudentBodyAvailableByDay problemAnalysis ! Temporal.Time.getDay (+					Model.TimetableCoordinates.getTime studentViewTimetableCoordinates+				 ) ! studentBody+			in if null humanViewTimetablePairs+				then humanViewTimetablePair	-- No change; other than to the random-generator.+				else head humanViewTimetablePairs+		) $ System.Random.split randomGen'	-- Forward an unused random-generator.+ ) (+	Dynamic.HumanViewTimetable.mkTimetablePair executionOptions problemAnalysis studentViewTimetable,+	randomGen+ ) -- Initial value.+
+ src-exe/WeekDaze/Implementation/StudentViewTimetableRandomBreeders.hs view
@@ -0,0 +1,957 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines many different strategies used to breed a candidate population, from a parent.++	* Each strategy depletes the specified /timetable/ in a variety of different ways;+	then for each depleted /timetable/, reconstructs it a variety of different ways,+	using the supplied reconstructor to which a /fecundity/ is supplied in order to generate the required size candidate-population.+-}++module WeekDaze.Implementation.StudentViewTimetableRandomBreeders(+-- * Types+-- ** Data-types+	StudentViewTimetableRandomBreederStrategy(..),+-- ** Type-synonyms+--	RandomBreeder,+--	StudentViewTimetableRandomBreeder,+	StudentViewTimetableQuantifiedRandomBreeder,+-- * Functions+	breed,+--	findRelocatableSynchronousLessons,+--	locateConsecutivesAndSynchronous,+--	studentViewTimetableSynchronisedCourseDepleter,+--	studentViewTimetableSynchronisedCourseByDayDepleter,+--	studentViewTimetableExcessRunlengthDepleter,+--	studentViewTimetableHomogeneousStudentViewLessonDepleter,+--	studentViewTimetableIncompleteCourseDepleter,+--	studentViewTimetableSingletonStudentClassDepleter,+--	studentViewTimetableSplitSessionDepleter,+--	studentViewTimetableStudentBodyCombinationDepleter,+--	studentViewTimetableStudentViewTimetableForDayDepleter,+--	studentViewTimetableStudentViewTimetableForWeekDepleter,+--	studentViewTimetableSynchronousLessonDepleter,+-- ** Accessors+	getTimetableBreederFecundity,+-- ** Predicates+--	isBookingCumbersome,+-- ** Operators+--	(>*>)+) where++import qualified	Control.Arrow+import			Control.Arrow((&&&), (***))+import			Control.Monad((>=>))+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Map+import			Data.Map((!))+import qualified	Data.Maybe+import qualified	Data.Set+import			Data.Set((\\))+import qualified	System.Random+import qualified	ToolShed.Data.List.Runlength+import qualified	ToolShed.System.Random+import qualified	WeekDaze.Aggregate.TeacherRegister				as Aggregate.TeacherRegister+import qualified	WeekDaze.Data.Course						as Data.Course+import qualified	WeekDaze.Data.Resource						as Data.Resource+import qualified	WeekDaze.Data.Student						as Data.Student+import qualified	WeekDaze.Dynamic.StudentViewTimetableForWeekUtilities		as Dynamic.StudentViewTimetableForWeekUtilities+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities			as Dynamic.StudentViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies		as ExecutionConfiguration.EvolutionStrategies+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity	as ExecutionConfiguration.TimetableBreederFecundity+import qualified	WeekDaze.LinearModel.Timetable					as LinearModel.Timetable+import qualified	WeekDaze.LinearModel.TimetableForWeek				as LinearModel.TimetableForWeek+import qualified	WeekDaze.Model.Lesson						as Model.Lesson+import qualified	WeekDaze.Model.Timetable					as Model.Timetable+import qualified	WeekDaze.Model.TimetableCoordinates				as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForDay					as Model.TimetableForDay+import qualified	WeekDaze.Model.TimetableForWeek					as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis			as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters			as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size							as Size+import qualified	WeekDaze.StudentView.LessonResourceIds				as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable					as StudentView.Timetable+import qualified	WeekDaze.StudentView.TimetableCoordinates			as StudentView.TimetableCoordinates+import qualified	WeekDaze.Temporal.Availability					as Temporal.Availability+import qualified	WeekDaze.Temporal.Day						as Temporal.Day+import qualified	WeekDaze.Temporal.Time						as Temporal.Time+import			WeekDaze.ExecutionConfiguration.TimetableBreederFecundity((>*<))++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<*>))+#endif++infixr 7 >*>	-- Same precedance as (*), but right-associative.++-- | The type of a function used to breed a candidate population from a single parent; the reproduction phase in an evolutionary algorithm.+type RandomBreeder randomGen a+	= randomGen	-- ^ Used to mutate the childen.+	-> a		-- ^ The parent from which to breed.+	-> [a]++-- | A 'RandomBreeder' which has been specialised for /student-view timetable/s.+type StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level	= RandomBreeder randomGen (StudentView.Timetable.Timetable timeslotId locationId teacherId level)++-- | A 'StudentViewTimetableRandomBreeder' which quantifies the required population-size.+type StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level	= ExecutionConfiguration.TimetableBreederFecundity.Fecundity -> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level++{- |+	* A combinator which sequences two 'RandomBreeder's: the implementation uses the List-monad's implementation of @ (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c @,+	the parts of which match the signature of 'RandomBreeder' after the application of the 'randomGen' parameter.++	* CAVEAT: this operation is rather like multiplication, in that if either 'RandomBreeder' produces nothing, then the other becomes irrelevant,+	but it's not commutative (<https://en.wikipedia.org/wiki/Commutative_property>):+	a single child is extracted from the left-hand 'RandomBreeder' & then used by the right-hand 'RandomBreeder' to build a population of grandchildren,+	before proceeding to extract the next child from the left-hand 'RandomBreeder';+	consequently, if the tail of resulting population is dropped, then some offspring from the left-hand 'RandomBreeder' may never breed.+-}+(>*>) :: RandomBreeder randomGen a -> RandomBreeder randomGen a -> RandomBreeder randomGen a+firstGenerationRandomBreeder >*> secondGenerationRandomBreeder	= \randomGen -> firstGenerationRandomBreeder randomGen >=> secondGenerationRandomBreeder randomGen	-- There's no need to split the random-generator, since it's deployed in different environments.++-- | Identifies the various strategies for breeding a candidate population from a /timetable/.+data StudentViewTimetableRandomBreederStrategy+	= SynchronisedCourseMutation+	| SynchronisedCourseByDayMutation+	| ExcessRunlengthMutation+	| HomogeneousStudentViewLessonMutation+	| IncompleteCourseMutation+	| RandomLessonMutation Int Size.NTimeslots							-- ^ Qualified by the number of random trials, & the number of randomly selected /lesson/s to delete from a /timetable/ in each trial, before reconstruction.+	| SingletonStudentClassMutation+	| SplitSessionMutation+	| StudentBodyCombinationMutation+	| StudentViewTimetableForDayMutation (Maybe Size.NDays)						-- ^ Optionally qualified by the number of whole /day/s to delete from a /studentBody/'s /timetableForWeek/, before reconstruction; if unspecified, then all valid numbers of day will be tried.+	| StudentViewTimetableForWeekMutation Int Size.NTimeslots					-- ^ Qualified by the number of random trials, & the number of randomly selected /lesson/s to delete from a /studentBody/'s /timetableForWeek/ in each trial, before reconstruction.+	| SynchronousLessonMutation+	| StudentViewTimetableRandomBreederStrategy :*> StudentViewTimetableRandomBreederStrategy	-- ^ An arbitrary (though preferrably orthogonal) binary combination of 'StudentViewTimetableRandomBreederType's. N.B.: it isn't commutative; the order to the two strategies is significant.++instance Show StudentViewTimetableRandomBreederStrategy where+	showsPrec _ SynchronisedCourseMutation					= showString ExecutionConfiguration.EvolutionStrategies.synchronisedCourseMutationTag+	showsPrec _ SynchronisedCourseByDayMutation				= showString ExecutionConfiguration.EvolutionStrategies.synchronisedCourseByDayMutationTag+	showsPrec _ ExcessRunlengthMutation					= showString ExecutionConfiguration.EvolutionStrategies.excessRunlengthMutationTag+	showsPrec _ HomogeneousStudentViewLessonMutation			= showString ExecutionConfiguration.EvolutionStrategies.homogeneousStudentViewLessonMutationTag+	showsPrec _ IncompleteCourseMutation					= showString ExecutionConfiguration.EvolutionStrategies.incompleteCourseMutationTag+	showsPrec _ (RandomLessonMutation nTrials nTimeslots)			= showString ExecutionConfiguration.EvolutionStrategies.randomLessonMutationTag . showChar '(' . shows nTrials . showChar ',' . shows nTimeslots . showChar ')'+	showsPrec _ SingletonStudentClassMutation				= showString ExecutionConfiguration.EvolutionStrategies.singletonStudentClassMutationTag+	showsPrec _ SplitSessionMutation					= showString ExecutionConfiguration.EvolutionStrategies.splitSessionMutationTag+	showsPrec _ StudentBodyCombinationMutation				= showString ExecutionConfiguration.EvolutionStrategies.studentBodyCombinationMutationTag+	showsPrec _ (StudentViewTimetableForDayMutation maybeNDays)		= showString ExecutionConfiguration.EvolutionStrategies.studentViewTimetableForDayMutationTag . Data.Maybe.maybe id (+		\nDays -> showString ExecutionConfiguration.EvolutionStrategies.studentViewTimetableForDayMutationTag . showChar '(' . shows nDays . showChar ')'+	 ) maybeNDays+	showsPrec _ (StudentViewTimetableForWeekMutation nTrials nTimeslots)	= showString ExecutionConfiguration.EvolutionStrategies.studentViewTimetableForWeekMutationTag . showChar '(' . shows nTrials . showChar ',' . shows nTimeslots . showChar ')'+	showsPrec _ SynchronousLessonMutation					= showString ExecutionConfiguration.EvolutionStrategies.synchronousLessonMutationTag+	showsPrec _ (l :*> r)							= showChar '(' . shows l . showString " . " {-intended to look like function-composition-} . shows r . showChar ')'++-- | Determines how wide a candidate population to breed in any one generation.+getTimetableBreederFecundity+	:: StudentViewTimetableRandomBreederStrategy+	-> ExecutionConfiguration.EvolutionStrategies.EvolutionStrategies fecundityDecayRatio populationDiversityRatio+	-> ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity	-- ^ Returns the /fecundity/ to be used for this /evolution-strategy/.+getTimetableBreederFecundity SynchronisedCourseMutation			= ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseMutationFecundity+getTimetableBreederFecundity SynchronisedCourseByDayMutation		= ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseByDayMutationFecundity+getTimetableBreederFecundity ExcessRunlengthMutation			= ExecutionConfiguration.EvolutionStrategies.getExcessRunlengthMutationFecundity+getTimetableBreederFecundity HomogeneousStudentViewLessonMutation	= ExecutionConfiguration.EvolutionStrategies.getHomogeneousStudentViewLessonMutationFecundity+getTimetableBreederFecundity IncompleteCourseMutation			= ExecutionConfiguration.EvolutionStrategies.getIncompleteCourseMutationFecundity+getTimetableBreederFecundity (RandomLessonMutation _ _)			= ExecutionConfiguration.EvolutionStrategies.getRandomLessonMutationFecundity+getTimetableBreederFecundity SingletonStudentClassMutation		= ExecutionConfiguration.EvolutionStrategies.getSingletonStudentClassMutationFecundity+getTimetableBreederFecundity SplitSessionMutation			= ExecutionConfiguration.EvolutionStrategies.getSplitSessionMutationFecundity+getTimetableBreederFecundity StudentBodyCombinationMutation		= ExecutionConfiguration.EvolutionStrategies.getStudentBodyCombinationMutationFecundity+getTimetableBreederFecundity (StudentViewTimetableForDayMutation _)	= ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForDayMutationFecundity+getTimetableBreederFecundity (StudentViewTimetableForWeekMutation _ _)	= ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationFecundity+getTimetableBreederFecundity SynchronousLessonMutation			= ExecutionConfiguration.EvolutionStrategies.getSynchronousLessonMutationFecundity+getTimetableBreederFecundity (l :*> r)					= uncurry (>*<) . (getTimetableBreederFecundity l &&& getTimetableBreederFecundity r)	-- Recurse.++{- |+	* Use the /StudentViewTimetable-depleter/ & the specified 'StudentViewTimetableQuantifiedRandomBreeder', to breed a candidate population of the required size.++	* CAVEAT: if the combination of depleter & reconstructor can't generate enough combinations, the size of the resulting population may be smaller than requested.+-}+breed :: forall campus level locationId randomGen stream synchronisationId teacherId teachingRatio timeslotId. (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio,+	System.Random.RandomGen	randomGen+ )+	=> StudentViewTimetableRandomBreederStrategy+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level	-- ^ StudentViewTimetable-reconstructor.+	-> StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level+breed studentViewTimetableRandomBreederStrategy problemAnalysis problemParameters	= breedUsing $ getStudentViewTimetableDepleter studentViewTimetableRandomBreederStrategy where+	breedUsing+		:: StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level		-- Depleter.+		-> StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level	-- Reconstructor.+		-> StudentViewTimetableQuantifiedRandomBreeder randomGen timeslotId locationId teacherId level+	breedUsing studentViewTimetableDepleter studentViewTimetableReconstructor fecundity randomGen studentViewTimetable	= take fecundity {-truncate any excess resulting from the use of 'ceiling'-} . concatMap (+		studentViewTimetableReconstructor (+			ceiling $ toRational fecundity / fromIntegral (length depletedTimetables {-non-zero-})+		) randomGen	-- Generate the required population of candidates; though it could generate more because the estimate is rounded-up, & could generate fewer when insufficient distinct reconstructions can be generated. The same random generator can always be used to shuffle the available timeslots, since they're always different.+	 ) $ ToolShed.System.Random.shuffle randomGen {-relevant when fecundity < nDepletedTimetables-} depletedTimetables where+		depletedTimetables	= studentViewTimetableDepleter randomGen studentViewTimetable++	getStudentViewTimetableDepleter :: StudentViewTimetableRandomBreederStrategy -> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+	getStudentViewTimetableDepleter SynchronisedCourseMutation					= studentViewTimetableSynchronisedCourseDepleter problemAnalysis problemParameters+	getStudentViewTimetableDepleter SynchronisedCourseByDayMutation					= studentViewTimetableSynchronisedCourseByDayDepleter problemAnalysis problemParameters+	getStudentViewTimetableDepleter ExcessRunlengthMutation						= studentViewTimetableExcessRunlengthDepleter problemAnalysis problemParameters+	getStudentViewTimetableDepleter HomogeneousStudentViewLessonMutation				= studentViewTimetableHomogeneousStudentViewLessonDepleter problemAnalysis problemParameters+	getStudentViewTimetableDepleter IncompleteCourseMutation					= studentViewTimetableIncompleteCourseDepleter problemParameters+	getStudentViewTimetableDepleter (RandomLessonMutation nTrials nTimeslots)			= studentViewTimetableRandomDepleter nTrials nTimeslots problemAnalysis problemParameters+	getStudentViewTimetableDepleter SingletonStudentClassMutation					= studentViewTimetableSingletonStudentClassDepleter problemParameters+	getStudentViewTimetableDepleter SplitSessionMutation						= studentViewTimetableSplitSessionDepleter problemParameters+	getStudentViewTimetableDepleter StudentBodyCombinationMutation					= studentViewTimetableStudentBodyCombinationDepleter problemParameters+	getStudentViewTimetableDepleter (StudentViewTimetableForDayMutation maybeNDays)			= studentViewTimetableStudentViewTimetableForDayDepleter maybeNDays problemParameters+	getStudentViewTimetableDepleter (StudentViewTimetableForWeekMutation nTrials nTimeslots)	= studentViewTimetableStudentViewTimetableForWeekDepleter nTrials nTimeslots problemAnalysis problemParameters+	getStudentViewTimetableDepleter SynchronousLessonMutation					= studentViewTimetableSynchronousLessonDepleter problemParameters+	getStudentViewTimetableDepleter (l :*> r)							= getStudentViewTimetableDepleter l {-recurse-} >*> getStudentViewTimetableDepleter r {-recurse-}++{- |+	* Depletes the specified /timetable/, by undefining individual groups of identical student-view /lesson/s (though potentially different /student-body/).+	One could alternatively focus on identical /lesson/s from each /student-body/ in turn, but it doesn't seem to explore a different solution-space & empirically seems slightly less productive;+	see 'studentViewTimetableRandomBreederBySingletonStudentClassMutation'.++	* On encountering a /synchronised course/, all /lesson/s for the other /course/s with the same /synchronisationId/ are deleted also.++	* /Student-view lesson/s are composed of a /subject/, /teacher/ & /location/, which are the components of a routine which once formed must persist;+	because a /student/ doesn't want to study a /subject/ with different /teacher/s, or in a different /location/, for each /booking/.+	Thus removing one set of identical student-view /lesson/s, allows a new routine to be established,+	facilitating the transfer of workload between /teacher/s with compatible skills.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableHomogeneousStudentViewLessonDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableHomogeneousStudentViewLessonDepleter problemAnalysis problemParameters _ studentViewTimetable = map (+	\studentViewLesson -> LinearModel.Timetable.unbookWhere (+		Data.Maybe.maybe (+			(== studentViewLesson) . Model.Timetable.getBookedLesson+		) (+			\synchronisationId -> (+				`Data.Set.member` Data.Set.map Data.Course.getSubject (+					Aggregate.TeacherRegister.findDistinctCoursesBySynchronisationId (+						ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis+					) ! synchronisationId+				)+			) . Model.Lesson.getSubject . Model.Timetable.getBookedLesson+		) . Data.Course.getMaybeSynchronisationId $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson+	) studentViewTimetable {-deplete-}	-- Deplete the specified timetable.+ ) . Data.Set.elems $ Model.Timetable.extractDistinctLessons studentViewTimetable++{- |+	* True if the specified /booking/ is required to be at its current /coordinates/, either by another /booking/ or by explicit configuration.+	Under these circumstances, any attempt to relocate it, is unlikely to be beneficial, without addressing these issues also.+	Attempts to reconstruct a random set of /booking/s will be disadvantaged by the presence of any cumbersome one, & probably discarded after much futile effort.++	* Three types of /booking/ qualify, those;+		whose /course/ is /synchronised/;+		which are at /time/s specified by the /course/;+		whose runlength is irreducible.++	* CAVEAT: a /lesson/ booked at a /time/ specified by the /course/, may not be cumbersome,+	if another /teacher/ offers a /course/ in the same /subject/, which doesn't specify this /time/.+	This requires that all /bookings/ for the original /teacher/ are also removed, so that there's no established routine to break.+-}+isBookingCumbersome :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level+	-> Bool+isBookingCumbersome problemParameters studentViewTimetable booking	= any ($ course) [+	Data.Course.isSynchronised,+	Data.Course.isASpecifiedTime time,+	not . Model.TimetableForWeek.isRunlengthReducibleAt (studentViewTimetable ! studentBody) time+ ] where+	((studentBody, time), course)	= (Model.TimetableCoordinates.getObserverId &&& Model.TimetableCoordinates.getTime) . Model.Timetable.getBookedCoordinates &&& ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . Model.Timetable.getBookedLesson $ booking++{- |+	* /Timetable/s which contain /lesson/s for any single /course/,+	in which the /student-class/ has been composed from different combinations of /student-bodies/ at various booking-/time/s, are considered undesirable.+	So, if /student-bodies/ @A@ & @B@ both require the same /subject/,+	one would probably prefer to teach the class @{A, B}@ consistently (or failing that, to teach each /student-body/ in isolation),+	rather than class-combinations for this /student-body/, @{A}, {B}, {A, B}@, at various times throughout the week,++	* Proliferation of /student-body/-combinations, for the /lesson/s booked for a /course/,+	can be discouraged by the weightings applied to specific /lesson-criteria/ & /timetable-criteria/,+	but unless all instances of a specific /student-body/-combination for a /course/ are unbooked simultaneously,+	a better weighted mean of the /timetable-criteria/ is unlikely to result,+	& therefore the resulting /timetable/ won't be selected as the basis of the next generation.++	* This strategy depletes the /timetable/, by finding instances where the /student-classes/, for the /lesson/s booked for a /course/,+	have been composed from more than one combination of /student-bodies/,+	unbooks all the /lesson/s for one of these /student-body/-combinations.++	* If a /lesson/ is deleted, which is part of a runlength, then the other (identical) members will also be deleted+	(they're still identical, even if they result in a different /studentbody-combination/);+	so required runlengths can't erroneously be split, merely completely obliterated.++	* If a /lesson/ is booked at a /time/ specified by the /course/, then it may still be unbooked,+	since it could be replaced by a /lesson/ from a compatible /course/ offered by another /teacher/,+	or by a /lesson/ at the same /time/, but at an alternative /location/.++	* CAVEAT: avoids /lesson/s belonging to /synchronised course/s, because the probability of beneficial mutation is low.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableStudentBodyCombinationDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableStudentBodyCombinationDepleter problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslots studentViewTimetable (+		Data.Foldable.concatMap (+			\studentBody -> map (+				(,) studentBody . Model.TimetableForWeek.getBookedTime	-- Construct coordinates.+			) . filter (+				uncurry (&&) . (+					(== studentViewLesson) . Model.TimetableForWeek.getBookedLesson &&& (== moribundStudentClass) . ($ studentViewTimetable) . StudentView.Timetable.extractStudentClassAt . flip (,) studentViewLesson . Model.TimetableForWeek.getBookedTime+				) -- Select all lessons for this class; even if they're at a specified time, since it can be replaced by a lesson at this same time, but with a different location or teacher.+			) . LinearModel.TimetableForWeek.fromTimetableForWeek $ studentViewTimetable ! studentBody+		) moribundStudentClass+	) {-deplete-} |+		(studentViewLesson, studentClassSet)	<- Data.Map.toList . Data.Map.filter (+			(> 1) . Data.Set.size	-- Select lessons for which more than one combination of student-body has been booked, & therefore with potential for improvement.+		) $ StudentView.Timetable.findStudentClassesByLesson studentViewTimetable,	-- This returns more than just student-body combinations, including identical lessons for mutually exclusive student-classes.+		moribundStudentClass			<- Data.Set.toList studentClassSet,	-- Select in turn, each student-class booked for this lesson.+		Data.Foldable.any (+			\studentBody -> Data.Foldable.any (Data.Set.member studentBody) $ Data.Set.delete moribundStudentClass studentClassSet+		) moribundStudentClass,	-- Select where at least one member student-body exists in one of the other student-class combinations for this studentViewLesson.+		not . Data.Course.isSynchronised $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson	-- One could alternatively unbook all synchronised lessons also, but the chance of a beneficial mutation is low.+ ] -- List-comprehension.++{- |+	* Finds identical consecutive /lesson/s whose runlength exceeds the ideal for the /course/ to which they belong.+	Also attempts to locate a /booking/ at a suitable alternative /time/; which as a side-effect increases the diversity in the population of candidates.++	* Unbooks; excess terminal /lesson/s from the long runlength, any /lesson/s from other /student-class/-members with the same problem, & the /lesson/ at the alternative /time/.++	* CAVEAT: avoids /lesson/s belonging to /synchronised course/s, because the probability of beneficial mutation is low.++	* CAVEAT: avoids /lesson/s whose /course/ specifies the current booking-/time/,+	since the remaining /lesson/s for this /course/ define the /teacher/, preventing enrolment on a compatible /course/ offered by another /teacher/.+-}+studentViewTimetableExcessRunlengthDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableExcessRunlengthDepleter problemAnalysis problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslots studentViewTimetable {-deplete-} . (+		blockingCoordinates :	-- Provide an alternative place for one of the deleted lessons.+	) $ map (,) (+		(+			studentBody :	-- Prepend the original.+		) . filter (+			elem session . (excessiveLessonRunlengthsByTimeByStudentBody !)+		) . Data.Set.toList . Data.Set.delete studentBody . Data.Set.unions $ map (+			(+				`StudentView.Timetable.extractStudentClassAt` studentViewTimetable+			) . flip (,) studentViewLesson {-construct a TimetableForWeek-booking-}+		) terminalTimeRange	-- Identify class-members who've booked the same excessive lesson-runlength.+	) <*> terminalTimeRange {-construct coordinates from the permutations of student-bodies & terminal times-} |+		(studentBody, excessiveLessonRunlengthsByTime)	<- Data.Map.toList excessiveLessonRunlengthsByTimeByStudentBody,+		session						<- excessiveLessonRunlengthsByTime,+		let+			studentViewTimetableForWeek	= studentViewTimetable ! studentBody+			(+				(day, startingTimeslotId),+				(runLength, studentViewLesson)+			 )				= (Temporal.Time.getDay &&& Temporal.Time.getTimeslotId) *** (ToolShed.Data.List.Runlength.getLength &&& ToolShed.Data.List.Runlength.getDatum) $ session	-- Deconstruct.+			studentViewLessonResourceIds	= StudentView.LessonResourceIds.getLocationId &&& StudentView.LessonResourceIds.getTeacherId $ Model.Lesson.getResourceIds studentViewLesson	-- Deconstruct.+			studentViewLessonResources	= (ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters !) *** (ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters !) $ studentViewLessonResourceIds	-- Lookup.+			course				= ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson+			minimumConsecutiveLessons	= Data.Course.getMinimumConsecutiveLessons course	-- Access.+			excessLength			= runLength - minimumConsecutiveLessons,+		not $ Data.Course.isSynchronised course,	-- Leave these for the specialist; 'studentViewTimetableRandomBreederBySynchronisedCourseMutation'.+		(+			Dynamic.StudentViewTimetableForWeekUtilities.countUnbookedByLesson problemParameters studentViewTimetableForWeek ! studentViewLesson+		) + excessLength >= minimumConsecutiveLessons,	-- Ensure there're enough unbooked lessons in this course, to enable booking of a new isolated session of length minimumConsecutiveLessons.+		(+			>= Data.Course.getRequiredLessonsPerWeek course	-- Any fewer & at least one excessive lesson-runlength is inevitable; so accept it & move on.+		) . (+			* minimumConsecutiveLessons+		) $ Data.Resource.countDaysPerWeekAvailable (+			studentViewLessonResources,+			ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters ! studentBody+		), -- We merely want to relocate the lesson, not mutate it, so all its resources must be available on enough other days.+		terminalTimeRange	<- let+			takeWhileRelocatable	= takeWhile (+				not . (`Data.Course.isASpecifiedTime` course)+			 ) . map (+				Temporal.Time.mkTime day+			 )+		in [+			takeWhileRelocatable . uncurry enumFromTo $ (+				id &&& Temporal.Time.shift (+					pred {-fence-post-} excessLength+				)+			) startingTimeslotId,	-- Take from the start of the runlength.+			reverse . takeWhileRelocatable . reverse . uncurry enumFromTo . (+				Temporal.Time.shift (+					negate $ pred {-fence-post-} excessLength+				) &&& id+			) $ Temporal.Time.shift (+				pred {-fence-post-} runLength	-- Derive the timeslotId at the end of the runlength.+			) startingTimeslotId	-- Take from the end of the runlength.+		], -- Find the timeslots at either end of the runlength, in the excess span, none of which are at times specified for the course.+		blockingCoordinates				<- map (+			(,) studentBody	-- Construct coordinates.+		) . filter (+			not . (+				$ studentViewLessonResourceIds	-- Complete the function-application.+			) . uncurry . (+				$ studentBody	-- Progress the function-application slightly.+			) . ProblemConfiguration.ProblemAnalysis.areAnyResourcesBookedForGroupMeeting problemAnalysis	-- Partially apply.+		) $ let+{-+	Ensure that the resources required for the studentViewLesson, are regularly available on the specified alternative day;+	it is assumed that there's an incumbent lesson, so the student-body is known to be available.+	Avoid days on which this lesson has already been booked, to avoid creating a new excessive runlength, or worse, a split session.+-}+			isSuitableAlternativeDay :: Temporal.Day.Day -> Bool+			isSuitableAlternativeDay	= uncurry (&&) . (+				(`Data.Resource.isAvailableOn` studentViewLessonResources) &&& Data.Foldable.notElem (+					Just studentViewLesson+				) . (+					studentViewTimetableForWeek Data.Array.IArray.!+				) -- Inevitably excludes studentViewLesson's current day.+			 )+		in if minimumConsecutiveLessons == 1 {-the typical scenario-}+			then [+				Temporal.Time.mkTime day' timeslotId |+					(day', timetableForDay)	<- Data.Array.IArray.assocs studentViewTimetableForWeek,+					isSuitableAlternativeDay day',+					(timeslotId, Just _)	<- Data.Array.IArray.assocs timetableForDay	-- Select bookings.+			] -- List-comprehension. Locate lessons when one of our extra lessons might alternatively be booked.+			else [+				Temporal.Time.mkTime day' timeslotId |+					(day', generalisedLessonRunlengthsByTimeslotId)	<- Data.Array.IArray.assocs $ Model.Timetable.findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId studentViewTimetable ! studentBody,+					isSuitableAlternativeDay day',+					(+						startingTimeslotId',+						(+							unbookedTimeslotRunlength,+							Nothing	-- i.e. unbooked.+						) -- Pair+					) {-pair-}					<- generalisedLessonRunlengthsByTimeslotId,	-- Select unbooked timeslots.+					unbookedTimeslotRunlength >= pred minimumConsecutiveLessons,					-- Select unbooked timeslot-runlengths that're almost long enough; or longer.+					timeslotId					<- filter (ProblemConfiguration.ProblemAnalysis.isValidTimeslotId problemAnalysis) [+						pred startingTimeslotId',+						Temporal.Time.shift unbookedTimeslotRunlength startingTimeslotId'+					] -- Derive the timeslotIds either side of the unbooked runlength; which if valid, must contain a lesson.+			], -- List-comprehension. Locate unallocated timeslots, then elongate them to the minimum length required to book a runlength of studentViewLessons.+		not . isBookingCumbersome problemParameters studentViewTimetable . (,) blockingCoordinates {-construct a booking-} . Data.Maybe.fromJust $ Model.Timetable.getMaybeLesson blockingCoordinates studentViewTimetable	-- Avoid unbooking lessons which can't easily be relocated.+ ] {-list-comprehension-} where+	excessiveLessonRunlengthsByTimeByStudentBody	= Dynamic.StudentViewTimetableUtilities.findExcessiveLessonRunlengthsByTimeByStudentBody problemParameters studentViewTimetable++{- |+	* Attempts to reduce the incidence of split sessions of identical /lesson/s within a /day/.++	* Locates separated equal-lesson sessions occuring in any one /day/, then unbooks;+	one whole runlength of /lesson/s, leaving the remainder; & any /lesson/s from /student-class/-members with the same problem.++	* CAVEAT: avoids /lesson/s belonging to /synchronised course/s, because the probability of beneficial mutation is low.++	* CAVEAT: avoids unbooking any runlength of /lesson/s, which spans a /time/ specified for the /course/,+	since the remaining /lesson/s for this /course/ define the /location/ & /teacher/, preventing any alternative solution.++	* CAVEAT: /split session/s are only introduced in the first place by 'Implementation.RandomConstructor.mutateStudentViewTimetable',+	so @ ExecutionConfiguration.TimetableBreederFecundity.getDeterministicConstructorFecundity . ExecutionConfiguration.EvolutionStrategies.getSplitSessionMutation @ can be zero,+	or they can be avoided completely by only configuring non-zero fecundity for 'Implementation.DeterministicConstructor.mutateStudentViewTimetable'.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableSplitSessionDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableSplitSessionDepleter problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslots studentViewTimetable {-deplete-} $ map (,) (+		(+			studentBody :	-- Prepend the original.+		) . filter (+			Data.Maybe.maybe False {-this student-body doesn't have any split sessions for this lesson-type-} (+				elem session	-- Select student-bodies which have a split-session with the same starting timeslot & length.+			) . lookup studentViewLesson . (+				Data.Array.IArray.! day+			) . (+				separatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId !+			) -- Identify class-members who've booked the same split session.+		) . Data.Set.toList . Data.Set.delete studentBody . Data.Set.unions $ map (+			(+				`StudentView.Timetable.extractStudentClassAt` studentViewTimetable+			) . flip (,) studentViewLesson {-construct a TimetableForWeek-booking-}+		) timeRange+	) <*> timeRange {-construct coordinates from the permutations of student-bodies & times-} |+		(studentBody, separatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDay)	<- Data.Map.toList separatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId,+		(day, separatedEqualLessonRunlengthsByStartingTimeslotIdByLesson)		<- Data.Array.IArray.assocs separatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDay,+		(studentViewLesson, separatedEqualLessonRunlengthsByStartingTimeslotId)		<- separatedEqualLessonRunlengthsByStartingTimeslotIdByLesson,+		let course	= ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson,+		not $ Data.Course.isSynchronised course,+		session@(startingTimeslotId, runlength)						<- separatedEqualLessonRunlengthsByStartingTimeslotId,+		let timeRange	= map (Temporal.Time.mkTime day) . uncurry enumFromTo $ (id &&& Temporal.Time.shift (pred {-fence-post-} runlength)) startingTimeslotId,+		not $ any (`Data.Course.isASpecifiedTime` course) timeRange+ ] {-list-comprehension-} where+	separatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId	= Model.Timetable.findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId studentViewTimetable++{- |+	* Find groups of synchronous /lesson/s, at coordinates where one might alternatively book a set of /lesson/s for the /course/s of the specified /synchronisationId/.++	* Excludes synchronous /booking/s which include any /lesson/ which can't be easily relocated.+-}+findRelocatableSynchronousLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> synchronisationId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> [StudentView.TimetableCoordinates.Vector timeslotId]+findRelocatableSynchronousLessons problemAnalysis problemParameters synchronisationId	= (+	\(synchronisedStudentBodySet, synchronousBlockingCoordinatesVectors)	-> filter (+		(+			\(bookedStudentBodies, time)	-> all (+				ProblemConfiguration.ProblemAnalysis.isFree problemParameters time . (+					ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters !	-- Lookup the teacher's profile.+				) -- Check that all teachers who're required, are free.+			) (+				Data.Map.keys {-teacherIds-} $ ProblemConfiguration.ProblemAnalysis.getCoursesByTeacherIdBySynchronisationId problemAnalysis ! synchronisationId+			) && Data.Foldable.all (+				ProblemConfiguration.ProblemAnalysis.isFree problemParameters time . (+					ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters !	-- Lookup the student-body's profile.+				)+			) (+				synchronisedStudentBodySet \\ Data.Set.fromList bookedStudentBodies	-- Derive the complementary unbooked student-bodies.+			) -- Check that all those student-bodies who're required but not currently booked, are free.+		) . (+			map Model.TimetableCoordinates.getObserverId {-the student-bodies who're booked-} &&& Model.TimetableCoordinates.getTime . head {-the common booking-time-}+		)+	) synchronousBlockingCoordinatesVectors+ ) . (+	Data.Map.keysSet {-the set of student-bodies, who require the specified synchronised course-} &&& (+		\synchronisedStudentViewTimetable -> map (+			map Model.Timetable.getBookedCoordinates	-- Discard the lesson.+		) . filter (+			not . any (+				isBookingCumbersome problemParameters synchronisedStudentViewTimetable+			) -- Ensure that all bookings can be easily relocated & that they're not already part of the synchronised course we're seeking to book.+		) . Data.List.Extra.groupSortOn (+			Model.TimetableCoordinates.getTime . Model.Timetable.getBookedCoordinates	-- Group into synchronous bookings.+		) $ LinearModel.Timetable.fromTimetable synchronisedStudentViewTimetable+	)+ ) . Data.Map.filterWithKey (+	\studentBody _	-> Data.Set.member studentBody $ ProblemConfiguration.ProblemAnalysis.getStudentBodiesBySynchronisationId problemAnalysis ! synchronisationId	-- Select from the timetable, those student-bodies who require the specified synchronised course.+ ) -- Identify bookings which block a row of synchronous available timeslots.++{- |+	* For each /synchronised course/, mutates the specified /timetable/ by unbooking all the corresponding /lesson/s.+	This is performed without reference to any problem with the current booking.++	* By unbooking all /lesson/s for a /synchronised course/,+	this strategy automatically accounts for the possibility that it might also have a non-trivial /minimumConsecutiveLessons/.++	* Since /student/s are typically fully booked, there will be relatively few unallocated /time-slot/s (other than those reserved for /meeting/s),+	even fewer of which will by coincidence be synchronised;+	therefore most attempts to relocate the /lesson/s of /synchronised course/s, will fail.+	To liberate some space in which improvements might occur,+	any /lesson/s which block the /booking/ of the synchronous /lesson/s required for the deleted /synchronised course/+	(except when that /lesson/ is either at an explicitly specified /time/, or when it completes a runlength of /minimumConsecutiveLessons/),+	are deleted first.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableSynchronisedCourseDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableSynchronisedCourseDepleter problemAnalysis problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslots (+		Data.Maybe.maybe studentViewTimetable (+			Model.Timetable.undefineTimeslots studentViewTimetable+		) . Data.Map.lookup synchronisationId $ Dynamic.StudentViewTimetableUtilities.locateLessonsBySynchronisationId problemParameters studentViewTimetable	-- Unbook any lessons for this synchronisationId.+	) synchronousTimetableCoordinatesVector {-deplete further-} |+		synchronisationId			<- ProblemConfiguration.ProblemAnalysis.findDistinctSynchronisationIds problemAnalysis,+		synchronousTimetableCoordinatesVector	<- findRelocatableSynchronousLessons problemAnalysis problemParameters synchronisationId studentViewTimetable {-the original one-}+ ] -- List-comprehension.++{- |+	* For each /synchronised course/, & then for each /day/, mutates the specified /timetable/ by unbooking all the corresponding /lesson/s.+	This is performed without reference to any problem with the current booking.++	* By unbooking all /lesson/s for one /synchronised course/ in one /day/,+	this strategy automatically accounts for the possibility that it might also have a non-trivial /minimumConsecutiveLessons/.++	* Since /student/s are typically fully booked, there will be relatively few unallocated /time-slot/s (other than those reserved for /meeting/s),+	even fewer of which will by coincidence be synchronised;+	therefore most attempts to relocate the /lesson/s of /synchronised course/s, will fail.+	To liberate some space in which improvements might occur,+	any /lesson/s which block the /booking/ of the synchronous /lesson/s required for the deleted /synchronised course/;+	except when the /lesson/ is at an explicitly specified /time/, or when it completes a runlength of /minimumConsecutiveLessons/;+	are deleted first.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableSynchronisedCourseByDayDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableSynchronisedCourseByDayDepleter problemAnalysis problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslots depletedStudentViewTimetable synchronousTimetableCoordinatesVector {-deplete further-} |+		(synchronisationId, coordinatesVector)	<- Data.Map.toList $ Dynamic.StudentViewTimetableUtilities.locateLessonsBySynchronisationId problemParameters studentViewTimetable,+		depletedStudentViewTimetable		<- map (+			Model.Timetable.undefineTimeslots studentViewTimetable {-deplete-}+		) $ Data.List.Extra.groupSortOn (+			Temporal.Time.getDay . Model.TimetableCoordinates.getTime+		) coordinatesVector {-not null-},+		synchronousTimetableCoordinatesVector	<- filter (+			(+				\day -> Data.Foldable.all {-student-body-} (+					Data.Foldable.all {-timeslotId-} (+						Data.Maybe.maybe True {-no lesson defined-} $ (/= Just synchronisationId) . Data.Course.getMaybeSynchronisationId . ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters+					) . (+						Data.Array.IArray.! day	-- Lookup the timetableForDay.+					) -- Section.+				) depletedStudentViewTimetable+			) . Temporal.Time.getDay . Model.TimetableCoordinates.getTime . head -- Select only those synchronous vectors whose common day doesn't contain any lessons for this synchronisationId.+		) $ findRelocatableSynchronousLessons problemAnalysis problemParameters synchronisationId studentViewTimetable {-the original one-}+ ] -- List-comprehension.++{- |+	* For each /student-body/, unbooks /lesson/s which block the completion of each /course/.++	* Avoids unbooking any /lesson/s whose /course/; requires a non-trivial /minimumConsecutiveLessons/, specifies the current booking-/time/, or is /synchronised/.+-}+studentViewTimetableIncompleteCourseDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableIncompleteCourseDepleter problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslotsFor studentBody studentViewTimetable bookingTimes {-deplete-} |+		(studentBody, incompletelyBookedKnowledge)	<- Data.Map.assocs . Data.Map.filter (+			not . Data.Set.null	-- Select only those student-bodies whose knowledge-requirements are incomplete.+		) . Data.Map.map Data.Student.amalgamateKnowledgeRequirements $ Dynamic.StudentViewTimetableUtilities.findIncompletelyBookedKnowledgeRequirementsByStudentBody problemParameters studentViewTimetable,+		let studentViewTimetableForWeek	= studentViewTimetable ! studentBody,+		studentViewLesson				<- filter (+			(`Data.Set.member` incompletelyBookedKnowledge) . Model.Lesson.getSubject	-- Select lessons from incomplete courses.+		) . Data.Set.toList $ Model.TimetableForWeek.extractDistinctLessons studentViewTimetableForWeek,+		let+			bookingTimes = filter (+				\time -> Model.TimetableForWeek.hasMatchingLessonAt (+					not . uncurry (||) . (+						(+							== studentViewLesson	-- Don't delete more lessons from the incomplete course.+						) &&& isBookingCumbersome problemParameters studentViewTimetable . (,) (studentBody, time) {-construct a booking from the blocking lesson-}+					) -- Predicate.+				) time studentViewTimetableForWeek+			 ) . map (+				Model.TimetableCoordinates.getTime . Model.Timetable.getBookedCoordinates	-- Extract the time at which these lessons were booked.+			 ) . filter (+				(== studentViewLesson) . Model.Timetable.getBookedLesson	-- Select identical lessons (subject, teacher, location), to those from the incomplete course of the original student-body.+			 ) . LinearModel.Timetable.fromTimetable $ Data.Map.delete studentBody studentViewTimetable {-select all the other student-bodies-},+		not $ null bookingTimes+ ] -- List-comprehension.++{- |+	* Unbooks groups of synchronous heterogeneous /lesson/s.++	* Avoids unbooking any /lesson/s, whose runlength is irreducible, or which are booked at /time/s specified by the /course/.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableSynchronousLessonDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableSynchronousLessonDepleter problemParameters _ studentViewTimetable	= map (+	Model.Timetable.undefineTimeslots studentViewTimetable . map Model.Timetable.getBookedCoordinates+ ) . filter (+	not . null+ ) . map (+	filter $ (+		\((studentViewTimetableForWeek, time), course)	-> uncurry (&&) $ (+			Model.TimetableForWeek.isRunlengthReducibleAt studentViewTimetableForWeek time &&& not . Data.Course.isASpecifiedTime time+		) course+	) . (+		(+			(+				(studentViewTimetable !) . Model.TimetableCoordinates.getObserverId &&& Model.TimetableCoordinates.getTime+			) . Model.Timetable.getBookedCoordinates+		) &&& ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . Model.Timetable.getBookedLesson+	)+ ) . Data.List.Extra.groupSortOn (+	Model.TimetableCoordinates.getTime . Model.Timetable.getBookedCoordinates	-- Group into synchronous bookings.+ ) $ LinearModel.Timetable.fromTimetable studentViewTimetable++{- |+	* For each /student-body/ in isolation, remove all /lesson/s from combinations of the specified number of /day/s.++	* If the number of days is unspecified, then try all possible values.++	* Avoids any /lesson/s whose /course/ is /synchronised/, or which specifies precise booking-times on this /day/, even if not at the time of the current /lesson/.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableStudentViewTimetableForDayDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId+ )+	=> Maybe Size.NDays	-- ^ The number of whole /day/s to unbook in a student-view timetable-for-week; no specification is interpreted as all available /day/s.+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableStudentViewTimetableForDayDepleter (Just 0) _ _ _					= []+studentViewTimetableStudentViewTimetableForDayDepleter maybeNDays problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslotsFor studentBody studentViewTimetable $ concatMap (+		\day -> [+			Temporal.Time.mkTime day timeslotId |+				let studentViewTimetableForDay	= studentViewTimetable ! studentBody Data.Array.IArray.! day,+				(timeslotId, Just studentViewLesson)	<- Data.Array.IArray.assocs studentViewTimetableForDay,	-- Select the bookings for this student-body's day.+				not . uncurry (||) . (+					Data.Course.isSynchronised &&& (+						\course -> any (+							(`Data.Course.isASpecifiedTime` course) . Temporal.Time.mkTime day	-- Avoid unbooking this lesson if the runlength here spans a booking-time specified by the course.+						) $ Model.TimetableForDay.spanRunlengthAt timeslotId studentViewTimetableForDay+					) -- Avoid unbooking lessons, either from synchronised courses which are hard to relocate, or booked @ times specified for the course.+				) $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson+		 ] -- List-comprehension.+	) days |+		studentBody	<- Data.Map.keys studentViewTimetable,+		days		<- filter (+			Data.Maybe.maybe (+				not . null	-- The order of the sets of days is irrelevant.+			) (+				\nDays -> (== nDays) . length	-- CAVEAT: assumes that the student-body's availability covers at least this number of days.+			) maybeNDays+		 ) . Data.List.subsequences . Data.Set.toList . Temporal.Availability.deconstruct . Data.Resource.getAvailability $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters ! studentBody+ ] -- List-comprehension.++{- |+	* From the specified /timetable-coordinate/s & /course/, determine any /minimum consecutive lessons/ & /synchronised courses/, & from these locate the coordinates of associated /booking/s.++	* Returns the coordinates of all the associated /booking/s, together with the original coordinates.+-}+locateConsecutivesAndSynchronous :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Eq			teacherId,+	Ord			synchronisationId+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> StudentView.TimetableCoordinates.Coordinates timeslotId+	-> Data.Course.Course synchronisationId level timeslotId+	-> [StudentView.TimetableCoordinates.Coordinates timeslotId]+locateConsecutivesAndSynchronous problemAnalysis studentViewTimetable studentViewTimetableCoordinates course	= (+	\runlengthTimes -> map (+		(,) studentBody	-- Construct coordinates.+	) runlengthTimes ++ Data.Maybe.maybe [] (+		(+			<*> runlengthTimes	-- Construct coordinates from the permutations of each synchronised student-body & each time in the runlength.+		) . map (,) {-partially apply-} . Data.Set.toList . Data.Set.delete studentBody . (+			ProblemConfiguration.ProblemAnalysis.getStudentBodiesBySynchronisationId problemAnalysis !+		)+	) (Data.Course.getMaybeSynchronisationId course)+ ) $ if Data.Course.getMinimumConsecutiveLessons course > 1+	then let+		(day, timeslotId)	= Temporal.Time.getDay &&& Temporal.Time.getTimeslotId $ time	-- Deconstruct.+	in uncurry map $ (+		Temporal.Time.mkTime &&& Model.TimetableForDay.spanRunlengthAt timeslotId . (+			studentViewTimetable ! studentBody Data.Array.IArray.!	-- Lookup the timetableForDay.+		)+	) day	-- Construct consecutive times for each member of the runlength.+	else [time] {-singleton-} where+		(studentBody, time)	= Model.TimetableCoordinates.getObserverId &&& Model.TimetableCoordinates.getTime $ studentViewTimetableCoordinates	-- Deconstruct.++{- |+	* For each /student-body/ in isolation, over the specified number of random trials, unbook a small number of randomly selected /lesson/s.++	* Avoids deleting any /lesson/s which are at /time/s specified for their /course/.++	* If the /course/ for the randomly selected /lesson/, defines a non-trivial /minimumConsecutiveLessons/, then unbooks the whole runlength;+	even if that includes a /lesson/ at a /time/ specified for the /course/, since the runlength could be shifted around this /time/.++	* If any unbooked /lesson/ is from a /synchronised course/, unbooks the synchronised /lesson/s for the other interested /student-bodies/.+-}+studentViewTimetableStudentViewTimetableForWeekDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	System.Random.RandomGen	randomGen+ )+	=> Int			-- ^ The number of random trials.+	-> Size.NTimeslots	-- ^ The number of /lesson/s to unbook in each trial.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableStudentViewTimetableForWeekDepleter 0 {-nTrials-} _ _ _ _ _									= []+studentViewTimetableStudentViewTimetableForWeekDepleter _ 0 {-nTimeslots-} _ _ _ _								= []+studentViewTimetableStudentViewTimetableForWeekDepleter nTrials nTimeslots problemAnalysis problemParameters randomGen studentViewTimetable	= [+	Model.Timetable.undefineTimeslots studentViewTimetable {-deplete-} . Data.Set.fromList {-de-duplicate-} . concatMap (+		uncurry (locateConsecutivesAndSynchronous problemAnalysis studentViewTimetable) . Control.Arrow.first ((,) studentBody) {-construct coordinates-}+	) . take nTimeslots {-potentially fewer-} . ToolShed.System.Random.shuffle randomGen' . filter (+		not . uncurry Data.Course.isASpecifiedTime	-- The probability of improving such bookings, is too low to warrant the effort.+	) . map (+		Model.TimetableForWeek.getBookedTime &&& ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . Model.TimetableForWeek.getBookedLesson+	) $ LinearModel.TimetableForWeek.fromTimetableForWeek studentViewTimetableForWeek |+		(studentBody, studentViewTimetableForWeek)	<- Data.Map.toList studentViewTimetable,+		randomGen'					<- take nTrials $ ToolShed.System.Random.randomGens randomGen+ ] -- List-comprehension.++{- |+	* Over the specified number of random trials, unbook a number of randomly selected /lesson/s.++	* Avoids deleting any /lesson/s which are at /time/s specified for their /course/.++	* If the /course/ for the randomly selected /lesson/, defines a non-trivial /minimumConsecutiveLessons/, then unbooks the whole runlength;+	even if that includes a /lesson/ at a /time/ specified for the /course/, since the runlength could be shifted around this /time/.++	* If any unbooked /lesson/ is from a /synchronised course/, unbooks the synchronised /lesson/s for the other interested /student-bodies/.+-}+studentViewTimetableRandomDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			locationId,+	Eq			level,+	Ord			synchronisationId,+	Ord			teacherId,+	System.Random.RandomGen	randomGen+ )+	=> Int			-- ^ The number of random trials.+	-> Size.NTimeslots	-- ^ The number of /lesson/s to unbook in each trial.+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableRandomDepleter 0 {-nTrials-} _ _ _ _ _								= []+studentViewTimetableRandomDepleter _ 0 {-nTimeslots-} _ _ _ _								= []+studentViewTimetableRandomDepleter nTrials nTimeslots problemAnalysis problemParameters randomGen studentViewTimetable	= map (+	\randomGen'	-> Model.Timetable.undefineTimeslots studentViewTimetable {-deplete-} . Data.Set.fromList {-de-duplicate-} . concatMap (+		uncurry $ locateConsecutivesAndSynchronous problemAnalysis studentViewTimetable+	) . take nTimeslots {-potentially fewer-} . ToolShed.System.Random.shuffle randomGen' . filter (+		not . uncurry Data.Course.isASpecifiedTime . Control.Arrow.first Model.TimetableCoordinates.getTime	-- The probability of improving such bookings, is too low to warrant the effort.+	) . map (+		Model.Timetable.getBookedCoordinates &&& ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . Model.Timetable.getBookedLesson+	) $ LinearModel.Timetable.fromTimetable studentViewTimetable+ ) . take nTrials $ ToolShed.System.Random.randomGens randomGen++{- |+	* For each /student-body/ in isolation, removes all /lesson/s which haven't been merged with another /student-body/ to form a /student-class/.++	* Avoids any /lesson/s whose /course/ is /synchronised/.++	* Similar to 'studentViewTimetableRandomBreederByHomogeneousStudentViewLessonMutation', but only applied to singleton /student-class/es, & to isolated /timetableForWeek/s.++	* The supplied random generator is unused, so the result is deterministic.+-}+studentViewTimetableSingletonStudentClassDepleter :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentViewTimetableRandomBreeder randomGen timeslotId locationId teacherId level+studentViewTimetableSingletonStudentClassDepleter problemParameters _ studentViewTimetable	= [+	Model.Timetable.undefineTimeslotsFor studentBody studentViewTimetable times {-deplete-} |+		(studentViewLesson, studentClassByTime)	<- Data.Map.toList $ StudentView.Timetable.findStudentClassByTimeByLesson studentViewTimetable,+		not . Data.Course.isSynchronised $ ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters studentViewLesson,	-- Exclude lessons for synchronised courses, since these can't be relocated independently.+		(studentBody, times)			<- map (+			Model.TimetableCoordinates.getObserverId . head &&& map Model.TimetableCoordinates.getTime	-- All coordinates exist in the timetableForWeek of a single student-body.+		) . Data.List.Extra.groupSortOn Model.TimetableCoordinates.getObserverId {-student-body-} . map (+			\(time, studentClass)	-> (Data.Set.findMin studentClass {-extract the single student-body-}, time)	-- Construct coordinates.+		) . Data.Map.toList $ Data.Map.filter (+			(== 1) . Data.Set.size	-- Select singleton student-classes; i.e. composed from just one student-body (though potentially more than one student).+		) studentClassByTime+ ] -- List-comprehension.+
+ src-exe/WeekDaze/Implementation/TimetableFitness.hs view
@@ -0,0 +1,277 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the fitness of a /timetable/ for the given configuration,+	as required for selection within one generation of its evolution; <https://en.wikipedia.org/wiki/Evolutionary_algorithm>.+-}++module WeekDaze.Implementation.TimetableFitness(+-- * Functions+--	calculateRatioOfSeparatedEqualLessonsWithinAnyDayCriterion,+--	measureDeviationFromMinimumConsecutiveLessonsCriterion,+--	measureLocationChangesOfTeachers,+	evaluateFitness+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	Control.Monad.Writer	-- The lazy instance.+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	ToolShed.Data.List.Runlength+import qualified	WeekDaze.Aggregate.StudentBody					as Aggregate.StudentBody+import qualified	WeekDaze.Data.Course						as Data.Course+import qualified	WeekDaze.Data.Requirements					as Data.Requirements+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities			as Dynamic.StudentViewTimetableUtilities+import qualified	WeekDaze.Dynamic.TeacherViewTimetableUtilities			as Dynamic.TeacherViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.Criterion			as ExecutionConfiguration.Criterion+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions		as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights	as ExecutionConfiguration.TimetableCriteriaWeights+import qualified	WeekDaze.Model.Timetable					as Model.Timetable+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis			as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters			as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size							as Size+import qualified	WeekDaze.StudentView.Timetable					as StudentView.Timetable+import qualified	WeekDaze.TeacherView.Timetable					as TeacherView.Timetable+import qualified	WeekDaze.Temporal.Day						as Temporal.Day++{- |+	* Counts the number of separated equal /lesson/s, occuring in any single /day/, across the whole /timetable/,+	discounting those implied by the specified /time/s for the /course/ to which they belong.++	* The number of such occurances is weighted by the number of /student/s in the body affected, & finally normalised to the unit-interval.+-}+calculateRatioOfSeparatedEqualLessonsWithinAnyDayCriterion :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		criterionValue,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> ExecutionConfiguration.Criterion.Criterion criterionValue+calculateRatioOfSeparatedEqualLessonsWithinAnyDayCriterion problemParameters problemAnalysis+	| denominator == 0	= error "WeekDaze.Implementation.TimetableFitness.calculateRatioOfSeparatedEqualLessonsWithinAnyDayCriterion:\tattempt to divide by zero (time-slots)."+	| otherwise		= ExecutionConfiguration.Criterion.reflectUnitInterval "ratioOfSeparatedEqualLessonsWithinAnyDay" . (+		/ fromIntegral denominator	-- Normalise to the unit-interval.+	) . fromIntegral . Data.Map.foldrWithKey (+		\studentBody -> (+) . (+			* Aggregate.StudentBody.getSize studentBody	-- Weight according to the number of students affected.+		) . foldr (+			(+) . pred {-two is one too many-} . ToolShed.Data.List.Runlength.getLength+		) 0 . filter (+			(+				`Data.Set.notMember` ProblemConfiguration.ProblemAnalysis.getCoursesRequestingSeparatedLessonsWithinAnyDay problemAnalysis -- No course specifying times, separated within a day, deprecates them; unless it's possible to join them using a contiguous span.+			) . ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters . ToolShed.Data.List.Runlength.getDatum {-Lesson-}+		)+	) 0 . Model.Timetable.findSeparatedEqualLessonsWithinAnyDayByObserverId+	where+		denominator	= (+			ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis - 2		-- Concept doesn't exist until there're three timeslots/day.+		 ) * ProblemConfiguration.ProblemAnalysis.getNAvailableDaysPerStudentTimetable problemAnalysis++{- |+	* Totals over the whole /timetable/, the absolute deviation between the lengths of consecutive equal /lesson/s,+	& the minimum specified for the corresponding /course/.++	* /Course/s where 'Data.Course.getRequiredLessonsPerWeek' isn't an integral multiple of 'Data.Course.getMinimumConsecutiveLessons',+	would show a discrepancy for all /lesson/s,+	to avoid which, deviations smaller than half a /time-slot/ are ignored.++	* The deviation is weighted by the number of /student/s in the body affected, & finally normalised to the unit-interval.++	* When a /course/ specifies consecutive times, it is considered to tacitly approve runlengths of that magnitude.++	* If (requiredLessonsPerWeek `div` minimumConsecutiveLessons) for the course > nAvailableDays for the student, then bookings long tranches is unavoidable.+	This calculation is complicated because the /lesson/s which must be booked each day, (which may well exceed 'Data.Course.calculateIdealConsecutiveLessons'),+	might be partitioned into shorter tranches by other /lesson/s or unallocated /time-slots/, thus reducing the runlength.+	So in practice, there's typically no increase to 'Data.Course.calculateIdealConsecutiveLessons'.+-}+measureDeviationFromMinimumConsecutiveLessonsCriterion :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			locationId,+	Fractional		criterionValue,+	Ord			level,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> ExecutionConfiguration.Criterion.Criterion criterionValue+measureDeviationFromMinimumConsecutiveLessonsCriterion problemParameters problemAnalysis+	| denominator == 0	= error "WeekDaze.Implementation.TimetableFitness.measureDeviationFromMinimumConsecutiveLessonsCriterion:\tattempt to divide by zero (time-slots)."+	| otherwise		= ExecutionConfiguration.Criterion.reflectUnitInterval "ratioOfConsecutiveEqualLessons" . (+		/ fromIntegral denominator	-- Normalise to the unit-interval by dividing by the worse possible case.+	) . fromIntegral . Data.Map.foldrWithKey (+		\studentBody -> (+) . (+			* Aggregate.StudentBody.getSize studentBody	-- Weight the discrepancy according to the number of students affected.+		) . Data.Foldable.foldr (+			flip $ foldr (+				\(_ {-timeslotId-}, generalisedLessonRunlengthCode)	-> let+					(runlength, generalisedLesson)	= ToolShed.Data.List.Runlength.getLength &&& ToolShed.Data.List.Runlength.getDatum $ generalisedLessonRunlengthCode	-- Deconstruct.+				in Data.Maybe.maybe id (+					\lesson -> let+						course	= ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters lesson+					in if Data.Set.member runlength $ ProblemConfiguration.ProblemAnalysis.getDistinctRunlengthsOfSpecifiedTimesByCourse problemAnalysis ! course+						then id	-- No course which specifies consecutive times, of equal duration to that observed, can reasonably deprecate it.+						else (+							+ floor (+								abs $ toRational runlength - Data.Course.calculateIdealConsecutiveLessons course	-- Measure the absolute deviation, to prevent cancellation of deviations resulting from excess & deficit.+							) -- If the ideal lies between two integers, then either is acceptable.+						)+				) generalisedLesson+			)+		) 0+	) 0 . Model.Timetable.findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId+	where+		denominator	= pred {-concept doesn't exist until there're two timeslots/day-} (ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis) * ProblemConfiguration.ProblemAnalysis.getNAvailableDaysPerStudentTimetable problemAnalysis++{- |+	* Gets the number of /location/-changes over all /teacher/s, normalised to the unit-interval.++	* The minimum value of zero; is achieved either by a completely unbooked /timetable/, or by completely booking /lesson/s in the same /location/.+-}+measureLocationChangesOfTeachers :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			locationId,+	Fractional		mean+ )+	=> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> TeacherView.Timetable.Timetable teacherId timeslotId locationId level+	-> mean+measureLocationChangesOfTeachers problemAnalysis	= (+	/ fromIntegral (+		ProblemConfiguration.ProblemAnalysis.getNTeachers {-counts only those offering a service-} problemAnalysis * pred {-fence-post-} (ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis * Temporal.Day.nDaysPerWeek)+	)+ ) . fromIntegral . Data.Foldable.sum . TeacherView.Timetable.countLocationChangesByTeacherId++{- |+	* Evaluates the fitness of the /timetable/ according to the /weighted mean/ of the /timetable-criteria/, which defines the direction of the evolutionary process.++	* Also writes the value of each /timetable-criterion/, for post-analysis.+-}+evaluateFitness :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			criterionValue,+	Enum			timeslotId,+	Eq			campus,+	Fractional		criterionValue,+	Fractional		weightedMean,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	Real			criterionValue,+	Real			criterionWeight,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The /timetable/ to evaluate.+	-> Control.Monad.Writer.Writer [Maybe criterionValue] weightedMean		-- ^ The fitness of the specified /timetable/, including the values of /timetable-criteria/ (where the weight is non-zero).+evaluateFitness problemParameters executionOptions problemAnalysis studentViewTimetable	= ExecutionConfiguration.TimetableCriteriaWeights.calculateWeightedMean (+	ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights executionOptions+ ) (+	ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseComplianceWithFreePeriodPreferencesTag $ (+		Dynamic.StudentViewTimetableUtilities.calculateMeanFreePeriodCompliance problemParameters studentViewTimetable + Dynamic.TeacherViewTimetableUtilities.calculateMeanFreePeriodCompliance problemParameters teacherViewTimetable+	) / 2+ ) (+	ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag $ Dynamic.TeacherViewTimetableUtilities.calculateMeanRatioOfStudentClassSizeToLocationCapacity problemParameters teacherViewTimetable+ ) (+	ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseMeanStudentClassSizeTag $ TeacherView.Timetable.calculateMeanStudentClassSize teacherViewTimetable / fromIntegral (ProblemConfiguration.ProblemAnalysis.getNStudents problemAnalysis)+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseSynchronisationOfSynchronisedCoursesTag $ Dynamic.TeacherViewTimetableUtilities.calculateRatioOfAsynchronousLessonsInSynchronisedCourses problemAnalysis teacherViewTimetable+ ) (+	ExecutionConfiguration.Criterion.mkCriterion ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag . realToFrac $ Dynamic.StudentViewTimetableUtilities.calculateWeightedMeanUtilisationRatio problemParameters problemAnalysis studentViewTimetable+ ) (+	let+		denominator	= pred {-fence-post-} nTimeslotsPerDay	-- Normalise to the unit-interval.+	in if denominator == 0+		then minBound	-- Zero lessons have been booked for courses which define an ideal timeslotId; the concept is void.+		else ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag $ Dynamic.StudentViewTimetableUtilities.calculateAverageAbsoluteDeviationFromIdealTimeslotRequest problemParameters problemAnalysis studentViewTimetable / fromIntegral denominator+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag . (+		* (+			2 / fromIntegral nTimeslotsPerDay+		) -- Normalise to the unit-interval; the maximum average absolute deviation is half the number of timeslots per day.+	) $ Model.Timetable.calculateAverageAbsoluteDeviationOfFreeLessonsPerDay (+		ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+	) studentViewTimetable	-- CAVEAT: ought to be weighted by the size of the student-body.+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag . (+		* (+			2 / fromIntegral nTimeslotsPerDay+		) -- Normalise to the unit-interval; the maximum average absolute deviation is half the number of timeslots-per-day.+	) $ Model.Timetable.calculateAverageAbsoluteDeviationOfFreeLessonsPerDay (ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters) teacherViewTimetable+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseDispersionOfTeacherWorkloadTag . (+		* 2	-- Normalise to the unit-interval; the maximum average absolute deviation in utilisation-ratio is 1/2.+	) $ Dynamic.TeacherViewTimetableUtilities.calculateAverageAbsoluteDeviationInUtilisationRatio problemParameters problemAnalysis teacherViewTimetable+ ) (+	ExecutionConfiguration.Criterion.invertWholeNumbersIntoUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag . (+		/ fromIntegral (+			ProblemConfiguration.ProblemAnalysis.getNAvailableDaysPerStudentTimetable problemAnalysis * pred nTimeslotsPerDay	-- The maximum possible number of migrations.+		) -- Derive mean & normalise.+	) . fromIntegral $ Dynamic.StudentViewTimetableUtilities.countInterCampusMigrations problemParameters studentViewTimetable+ ) (+	ExecutionConfiguration.Criterion.invertWholeNumbersIntoUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag . (+		/ fromIntegral (+			ProblemConfiguration.ProblemAnalysis.getNAvailableDaysPerTeacherTimetable problemAnalysis * pred nTimeslotsPerDay	-- The maximum possible number of migrations.+		) -- Derive mean & normalise.+	) . fromIntegral $ Dynamic.TeacherViewTimetableUtilities.countInterCampusMigrations problemParameters teacherViewTimetable+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanLocationChangesOfTeachersTag $ measureLocationChangesOfTeachers problemAnalysis teacherViewTimetable	-- CAVEAT: may conflict with 'minimiseRatioOfConsecutiveEqualLessons'.+ ) (+	ExecutionConfiguration.Criterion.invertWholeNumbersIntoUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanLocusOperandiOfTeachersTag $ StudentView.Timetable.calculateMeanLocusOperandiOfTeachers studentViewTimetable+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag $ Data.Requirements.getCore meanRatioOfIncompletelyBookedKnowledgeRequirements+ ) (+	ExecutionConfiguration.Criterion.reflectUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag $ Data.Requirements.getOptional meanRatioOfIncompletelyBookedKnowledgeRequirements+ ) (+	ExecutionConfiguration.Criterion.invertNaturalNumbersIntoUnitInterval ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag $ StudentView.Timetable.calculateWeightedMeanStudentBodyCombinationsPerLesson studentViewTimetable	-- CAVEAT: performance-hotspot.+ ) (+	measureDeviationFromMinimumConsecutiveLessonsCriterion problemParameters problemAnalysis studentViewTimetable	-- minimiseRatioOfConsecutiveEqualLessons.+ ) (+	calculateRatioOfSeparatedEqualLessonsWithinAnyDayCriterion problemParameters problemAnalysis studentViewTimetable+ ) where+	nTimeslotsPerDay :: Size.NTimeslots+	nTimeslotsPerDay	= ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis++	teacherViewTimetable					= Dynamic.TeacherViewTimetableUtilities.fromStudentViewTimetable executionOptions problemAnalysis studentViewTimetable+	meanRatioOfIncompletelyBookedKnowledgeRequirements	= Dynamic.StudentViewTimetableUtilities.findMeanRatioOfIncompletelyBookedKnowledgeRequirements problemParameters problemAnalysis studentViewTimetable+
+ src-exe/WeekDaze/Input/CommandLineOption.hs view
@@ -0,0 +1,124 @@+{-+	Copyright (C) 2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	To facilitate processing of command-line options.+-}++module WeekDaze.Input.CommandLineOption(+-- * Types+-- ** Type-synonyms+	Flag,+-- ** Data-types+	CommandLineOption(+--		IOAction,+--		OptionsMutator,+--		ConfigLocationParameter+	),+-- * Constants+	longFlagPrefix,+-- * Functions+	partition3,+	getArgs,+--	read',+	readArg,+	readBoundedIntegral,+-- ** Constructors+	mkIOAction,+	mkOptionsMutator,+	mkConfigLocationParameter+) where++import qualified	Data.List+import qualified	Data.Map++-- | Synonym.+type Flag	= String++-- | The varieties of command-line option.+data CommandLineOption options+	= IOAction (IO ())			-- ^ A command-line option which requests an IO-action.+	| OptionsMutator (options -> options)	-- ^ A command-line option which directly specifies a configuration-parameter.+	| ConfigLocationParameter Flag String	-- ^ A command-line option which specifies the location of some configuration.++-- | Construct an 'IOAction' command-line option, from the required action.+mkIOAction :: IO () -> CommandLineOption options+mkIOAction	= IOAction++-- | Construct an 'OptionsMutator' command-line option from a handler-function.+mkOptionsMutator :: (options -> options) -> CommandLineOption options+mkOptionsMutator	= OptionsMutator++-- | Construct a 'ConfigLocationParameter' command-line option, from the command-line flag used to denote it, & a string explaining its argument-type.+mkConfigLocationParameter :: Flag -> String -> CommandLineOption options+mkConfigLocationParameter	= ConfigLocationParameter++-- | Partition a list of 'CommandLineOption' according to their data-constructor.+partition3 :: [CommandLineOption options] -> ([IO ()], [options -> options], Data.Map.Map Flag String)+partition3 categories	= (+	[action | IOAction action <- categories],+	[mutator | OptionsMutator mutator <- categories],+	Data.Map.fromList [(f, s) | ConfigLocationParameter f s <- categories]+ )++-- | The prefix used to denote the long form of a command-line flag.+longFlagPrefix :: Flag+longFlagPrefix	= "--"++{- |+	* Return the list of arguments extracted from the command-line, which match the specified long flag preceded by "--".++	* CAVEAT:+		to match a long flag, all unique abbreviations must also be supplied.+		doesn't cope with short flags preceded by '-'.+-}+getArgs :: [Flag] -> [String] -> [String]+getArgs flags	= slave where+	slave []	= []+	slave (x : xs)+		| x `elem` flags	= case xs of+			s : remainder	-> s : slave remainder {-recurse-}+			[]		-> error $ "option " ++ show x ++ " requires an argument."+		| any (+			(`Data.List.isPrefixOf` x) . (++ "=")+		) flags			= case dropWhile (/= '=') x of+			_ : remainder	-> remainder : slave xs+			[]		-> error $ "option " ++ show x ++ " requires a non-null argument."+		| otherwise		= slave xs	-- Recurse.++-- | On failure to parse the specified string, returns an explanatory error-message.+read' :: Read a => String -> String -> a+read' errorMessage s	= case reads s of+	[(x, "")]	-> x+	_		-> error . showString errorMessage $ shows s "."++-- | On failure to parse a command-line argument, returns an explanatory error.+readArg :: Read a => String -> a+readArg	= read' "failed to parse command-line argument "++-- | Reads a bounded integral from the command-line, guarding against overflow.+readBoundedIntegral :: Integral i => String -> i+readBoundedIntegral s+	| fromIntegral bounded /= unbounded	= error $ "WeekDaze.Input.CommandLineOption.readBoundedIntegral:\tintegral value exceeds permissible bounds; " ++ show unbounded ++ "."+	| otherwise				= bounded+	where+		unbounded	= readArg s+		bounded		= fromInteger unbounded+
+ src-exe/WeekDaze/OutputFormat/DeterministicStudentViewTimetableSelection.hs view
@@ -0,0 +1,71 @@+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* The structure produced by function "WeekDaze.Implementation.EvolutionaryAlgorithm.selectDeterministicStudentViewTimetable".+-}++module WeekDaze.OutputFormat.DeterministicStudentViewTimetableSelection(+-- * Types+-- ** Type-synonyms+--	QuantifiedTraversalOrder,+-- ** Data-types+	DeterministicStudentViewTimetableSelection(+--		MkDeterministicStudentViewTimetableSelection,+		getInitialTimetableCriteriaValues,+		getStudentViewTimetable,+		getInitialLessonCriteriaStatistics,+		getWeightedMeanOfTimetableCriteria+	),+-- ** Constructor+	mkDeterministicStudentViewTimetableSelection+) where++import qualified	WeekDaze.Implementation.DeterministicConstructor	as Implementation.DeterministicConstructor+import qualified	WeekDaze.Model.TimetableAxisTriple			as Model.TimetableAxisTriple+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable++-- | The weighted mean over all heterogeneous /timetable-criteria/, of the deterministic /timetable/ resulting from a specific raster-scan.+type QuantifiedTraversalOrder weightedMean	= (Model.TimetableAxisTriple.Axes, weightedMean);++-- | The return-type of 'Implementation.EvolutionaryAlgorithm.selectDeterministicStudentViewTimetable'.+data DeterministicStudentViewTimetableSelection criterionValue criterionWeight level locationId mean standardDeviation teacherId timeslotId weightedMean	= MkDeterministicStudentViewTimetableSelection {+	getStudentViewTimetable			:: StudentView.Timetable.Timetable timeslotId locationId teacherId level,						-- ^ The initial deterministic /student-view timetable/.+	getInitialLessonCriteriaStatistics	:: [Maybe (Implementation.DeterministicConstructor.LessonCriteriaStatistics criterionValue mean standardDeviation)],	-- ^ Statistics gathered from the initial deterministic /timetable/ resulting from the best raster-scan, over the value of each unweighted homogeneous /lesson-criterion/.+	getInitialTimetableCriteriaValues	:: [Maybe criterionValue],												-- ^ The heterogeneous /timetable-criteria/ ('Nothing' where the corresponding weight is zero), of the initial deterministic /timetable/ resulting from the best raster-scan.+	getWeightedMeanOfTimetableCriteria	:: Either weightedMean [QuantifiedTraversalOrder weightedMean]								-- ^ The weighted mean over all heterogeneous /timetable-criteria/, of either just the specified initial deterministic /timetable/, or the /timetable/ resulting from each traversal order.+} deriving Show++-- | Constructor.+mkDeterministicStudentViewTimetableSelection+	:: StudentView.Timetable.Timetable timeslotId locationId teacherId level						-- ^ The initial deterministic /student-view timetable/.+	-> [Maybe (Implementation.DeterministicConstructor.LessonCriteriaStatistics criterionValue mean standardDeviation)]	-- ^ Statistics gathered from the initial deterministic /timetable/ resulting from the best raster-scan, over the value of each unweighted homogeneous /lesson-criterion/.+	-> [Maybe criterionValue]												-- ^ The heterogeneous /timetable-criteria/, of the initial deterministic /timetable/ resulting from the best raster-scan.+	-> Either weightedMean [QuantifiedTraversalOrder weightedMean]								-- ^ The weighted mean over all heterogeneous /timetable-criteria/, of either the specified initial deterministic /timetable/, or for each traversal order.+	-> DeterministicStudentViewTimetableSelection criterionValue criterionWeight level locationId mean standardDeviation teacherId timeslotId weightedMean+mkDeterministicStudentViewTimetableSelection studentViewTimetable initialLessonCriteriaStatistics initialTimetableCriteria meanOfWeightedTimetableCriteriaByTraversalOrder	= MkDeterministicStudentViewTimetableSelection {+	getStudentViewTimetable			= studentViewTimetable,+	getInitialLessonCriteriaStatistics	= initialLessonCriteriaStatistics,+	getInitialTimetableCriteriaValues	= initialTimetableCriteria,+	getWeightedMeanOfTimetableCriteria	= meanOfWeightedTimetableCriteriaByTraversalOrder+}+
+ src-exe/WeekDaze/OutputFormat/EvolutionStrategyStatistics.hs view
@@ -0,0 +1,759 @@+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the structure produced by module 'WeekDaze.Implementation.EvolutionaryAlgorithm.evolveStudentViewTimetable'.++	* Renders this structure in either text or XHTML.+-}++module WeekDaze.OutputFormat.EvolutionStrategyStatistics(+-- * Types+-- ** Type-synonyms+--	NGenerations,+	OptimiseLessonCriteriaWeightsLog,+-- ** Data-types+	EvolutionStrategyStatistics(+--		MkEvolutionStrategyStatistics,+--		getDepletionStrategyName,+--		getReconstructionStrategyName,+--		getInitialFecundity,+--		getFinalFecundity,+--		getMaybeImprovementFactor,+		getWeightedMeanOfTimetableCriteria+--		getNGenerations,+--		getMaybeTimetableCriteriaValues+	),+-- * Constants+--	notApplicable,+--	runtimeInformationCSSIdentifier,+--	timetableAxisCSSIdentifier,+-- * Functions+	composeRuntimeLog,+	toHtml,+--	showReal+-- ** Constructor+	mkEvolutionStrategyStatistics,+-- ** Predicates+--	isFecundityUnchanged+) where++import			Control.Arrow((***), (&&&))+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Factory.Math.Statistics+import qualified	Text.Printf+import qualified	Text.XHtml.Strict+import qualified	WeekDaze.Colour.HTMLColour						as Colour.HTMLColour+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight				as ExecutionConfiguration.CriterionWeight+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies			as ExecutionConfiguration.EvolutionStrategies+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions			as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.ExecutionConfiguration.LessonCriteriaWeights			as ExecutionConfiguration.LessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights		as ExecutionConfiguration.OptimiseLessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity		as ExecutionConfiguration.TimetableBreederFecundity+import qualified	WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights		as ExecutionConfiguration.TimetableCriteriaWeights+import qualified	WeekDaze.Model.TimetableAxisTriple					as Model.TimetableAxisTriple+import qualified	WeekDaze.Model.TimetableForWeek						as Model.TimetableForWeek+import qualified	WeekDaze.OutputConfiguration.Options					as OutputConfiguration.Options+import qualified	WeekDaze.OutputFormat.DeterministicStudentViewTimetableSelection	as OutputFormat.DeterministicStudentViewTimetableSelection+import qualified	WeekDaze.Text.CSS							as Text.CSS+import			Text.XHtml.Strict((+++), (<<), (!))++-- | Used in text & html output.+notApplicable :: String+notApplicable	= "N/A"++-- | A CSS class-label, for runtime-information tables.+runtimeInformationCSSIdentifier :: Text.CSS.CSSIdentifier+runtimeInformationCSSIdentifier	= "runtimeInformation"++-- | A number of generations in the evolution of the /timetable/.+type NGenerations	= Int++-- | Identifier used for the CSS-class for timetable-axes+timetableAxisCSSIdentifier :: Text.CSS.CSSIdentifier+timetableAxisCSSIdentifier	= "timetableAxis"++-- | Show the specified real number to a specific number of decimal places.+showReal :: Real r => OutputConfiguration.Options.NDecimalDigits -> r -> String+showReal nDecimalDigits		= (Text.Printf.printf "%.*f" nDecimalDigits :: Double -> String) . realToFrac++-- | Defines the ancillary data written by 'Implementation.EvolutionaryAlgorithm.evolveStudentViewTimetable', for one /evolution-strategy/.+data EvolutionStrategyStatistics weightedMean criterionValue	= MkEvolutionStrategyStatistics {+	getDepletionStrategyName		:: String,							-- ^ The name of the depletion-strategy used to liberate space in the candidate timetable.+	getReconstructionStrategyName		:: String,							-- ^ The name of the reconstruction-strategy used to re-populate the candidate timetable.+	getInitialFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.Fecundity,	-- ^ The initial value of the fecundity.+	getFinalFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.Fecundity,	-- ^ The value to which the initial fecundity was reduced, when the evolutionary process terminated.+	getMaybeImprovementFactor		:: Maybe weightedMean,						-- ^ The relative improvement in the /timetable/ resulting from this evolution-strategy relative to the previous, according to the weighted mean over the values of heterogeneous /timetable-criteria/; infinity is represented by 'Nothing'.+	getWeightedMeanOfTimetableCriteria	:: weightedMean,						-- ^ The /fitness/ of the /timetable/, according to the weighted mean over the values of heterogeneous /timetable-criteria/.+	getNGenerations				:: NGenerations,						-- ^ The number of generations through which the evolution progressed.+	getMaybeTimetableCriteriaValues		:: Maybe [Maybe criterionValue]					-- ^ Given at least one productive generation, the values of heterogeneous /timetable-criteria/ (where the corresponding weight is non-zero), for the selected candidate.+}++-- Constructor.+mkEvolutionStrategyStatistics+	:: String							-- ^ The name of the depletion-strategy used to liberate space in the candidate timetable.+	-> String							-- ^ The name of the reconstruction-strategy used to re-populate the candidate timetable.+	-> ExecutionConfiguration.TimetableBreederFecundity.Fecundity	-- ^ The value of the initial fecundity.+	-> ExecutionConfiguration.TimetableBreederFecundity.Fecundity	-- ^ The value to which the initial fecundity was reduced, when the evolutionary process terminated.+	-> Maybe weightedMean						-- ^ The relative improvement in the /timetable/ resulting from this evolution-strategy relative to the previous, according to the weighted mean over the values of heterogeneous /timetable-criteria/.+	-> weightedMean							-- ^ The /fitness/ of the /timetable/, according to the weighted mean over the values of heterogeneous /timetable-criteria/.+	-> NGenerations							-- ^ The number of generations through which the evolution progressed.+	-> Maybe [Maybe criterionValue]					-- ^ Given at least one productive generation, the values of heterogeneous /timetable-criteria/ (where the corresponding weight is non-zero), for the selected candidate.+	-> EvolutionStrategyStatistics weightedMean criterionValue+mkEvolutionStrategyStatistics depletionStrategyName reconstructionStrategyName initialFecundity finalFecundity maybeImprovement weightedMeanOfTimetableCriteria nGenerations maybeTimetableCriteriaValues	= MkEvolutionStrategyStatistics {+	getDepletionStrategyName		= depletionStrategyName,+	getReconstructionStrategyName		= reconstructionStrategyName,+	getInitialFecundity			= initialFecundity,+	getFinalFecundity			= finalFecundity,+	getMaybeImprovementFactor		= maybeImprovement,+	getWeightedMeanOfTimetableCriteria	= weightedMeanOfTimetableCriteria,+	getNGenerations				= nGenerations,+	getMaybeTimetableCriteriaValues		= maybeTimetableCriteriaValues+}++-- | True if the initial & final fecundities are identical.+isFecundityUnchanged :: EvolutionStrategyStatistics weightedMean criterionValue -> Bool+isFecundityUnchanged	= uncurry (==) . (getInitialFecundity &&& getFinalFecundity)++-- ^ The log of the optimisation of /lesson-criteria weight/s, based on maximisation of the weighted-mean over heterogeneous /timetable-criteria/, for the initial deterministic timetable.+type OptimiseLessonCriteriaWeightsLog criterionWeight weightedMean	= [(Int {-trial-number-}, criterionWeight, weightedMean)]++-- | Compose the text returned lazily at runtime, to aid diagnosis.+composeRuntimeLog :: (+	Real	criterionValue,+	Real	criterionWeight,+	Real	mean,+	Real	standardDeviation,+	Real	weightedMean+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> OutputConfiguration.Options.NDecimalDigits						-- ^ The required precision in decimal digits.+	-> (Bool, Bool)										-- ^ Whether the /traversal-order/ was specified, & whether the input file-path was specified.+	-> Bool											-- ^ Whether the fecundity of all /evolution-strategies/ have been set to zero.+	-> ExecutionConfiguration.LessonCriteriaWeights.LessonCriteriaWeights criterionWeight	-- ^ The unoptimised /lesson-criteria/ weights.+	-> Bool											-- ^ Whether to accept a proposed set of /lesson-criteria weights/ on the basis of the mean (as opposed to the maximum) over the specified raster-scans, of the weighted mean over all heterogeneous /timetable-criteria/.+	-> OptimiseLessonCriteriaWeightsLog criterionWeight weightedMean+	-> OutputFormat.DeterministicStudentViewTimetableSelection.DeterministicStudentViewTimetableSelection criterionValue criterionWeight level locationId mean standardDeviation teacherId timeslotId weightedMean+	-> [EvolutionStrategyStatistics weightedMean criterionValue]+	-> [Maybe criterionValue]								-- ^ The final values of timetable-criteria.+	-> [(String, String)]+composeRuntimeLog executionOptions nDecimalDigits (traversalOrderWasSpecified, inputFilePathWasSpecified) areAllEvolutionStrategiesZero originalLessonCriteriaWeights useMeanOverRasterScans optimiseLessonCriteriaWeightsLog deterministicStudentViewTimetableSelection evolutionStrategyStatisticsList finalTimetableCriteriaValues	= Data.Maybe.catMaybes [+	if null optimiseLessonCriteriaWeightsLog+		then Nothing+		else Just (+			"By randomly mutating lesson-criteria weights by the specified magnitude, the " ++ (+				if useMeanOverRasterScans then "mean over" else "maximum of"+			) ++ " all specified raster-scans, of the weighted mean over heterogeneous timetable-criteria, for the " ++ hintText ++ ", was sequentially improved by",+			showListOfStrings $ map (+				\(trialNumber, changeMagnitude, deltaOverRastersOfWeightedMeanOverTimetableCriteria) -> showChar '(' . shows trialNumber . showChar ',' $ showReal nDecimalDigits changeMagnitude ++ ")=>" ++ showReal nDecimalDigits deltaOverRastersOfWeightedMeanOverTimetableCriteria+			) optimiseLessonCriteriaWeightsLog+		), -- Pair.+	let+		preamble	= "The weighted mean over the values of heterogeneous timetable-criteria, of the "+	in Just . either (+		(,) (preamble ++ hintText) . showUnitInterval+	) (+		\weightedMeanOfTimetableCriteriaByTraversalOrder -> (+			preamble ++ "deterministic timetable resulting from each raster-scan; & the maximum",+			showListOfReals (map snd weightedMeanOfTimetableCriteriaByTraversalOrder) ++ "; " ++ uncurry (++) (+				show *** showString "=>" . showUnitInterval $ Data.List.maximumBy (Data.Ord.comparing snd) weightedMeanOfTimetableCriteriaByTraversalOrder+			)+		) -- Pair.+	) $ OutputFormat.DeterministicStudentViewTimetableSelection.getWeightedMeanOfTimetableCriteria deterministicStudentViewTimetableSelection,+	Just (+		"The value of each timetable-criterion, for the " ++ hintText,+		showListOfReals . map (Data.Maybe.fromMaybe 0) $ OutputFormat.DeterministicStudentViewTimetableSelection.getInitialTimetableCriteriaValues deterministicStudentViewTimetableSelection+	), -- Pair.+	let+		initialLessonCriteriaStatistics	= OutputFormat.DeterministicStudentViewTimetableSelection.getInitialLessonCriteriaStatistics deterministicStudentViewTimetableSelection+	in if null initialLessonCriteriaStatistics+		then Nothing+		else Just (+			"The (weight, (mean, standard deviation), (minimum, maximum)) gathered over the lessons of the " ++ hintText ++ ", for the value of each individual lesson-criterion",+			showListOfStrings . map (+				\((_, lessonCriterionWeightAccessor), maybeLessonCriteriaStatistics)	-> Data.Maybe.maybe notApplicable (+					\lessonCriterionStatistics -> let+						[lessonCriterionWeight, lessonCriterionWeight']	= map (+							showUnitInterval . ExecutionConfiguration.CriterionWeight.deconstruct . lessonCriterionWeightAccessor+						 ) [+							originalLessonCriteriaWeights,+							ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights executionOptions+						 ]++						((mean, standardDeviation), (minimumValue, maximumValue))	= (showUnitInterval *** showUnitInterval) *** (showUnitInterval *** showUnitInterval) $ lessonCriterionStatistics+					in Text.Printf.printf "(%s,(%s,%s),(%s,%s))" (+						if null optimiseLessonCriteriaWeightsLog || lessonCriterionWeight == lessonCriterionWeight'+							then lessonCriterionWeight+							else lessonCriterionWeight ++ "->" ++ lessonCriterionWeight'+					) mean standardDeviation minimumValue maximumValue+				) maybeLessonCriteriaStatistics+			) $ zip ExecutionConfiguration.LessonCriteriaWeights.associationList initialLessonCriteriaStatistics+		), -- Pair+	if areAllEvolutionStrategiesZero+		then Nothing+		else Just (+			"The (weighted mean over heterogeneous timetable-criteria, relative improvement in the weighted mean over heterogeneous timetable-criteria, the number of generations through which the timetable evolved, the fecundity, & the value of each timetable-criterion for the best candidate), for each evolution-strategy",+			showListOfStrings $ map (+				\evolutionStrategyStatistics -> Text.Printf.printf "%s/%s=(%s, %s, %d, %s, %s)" (+					getDepletionStrategyName evolutionStrategyStatistics+				) (+					getReconstructionStrategyName evolutionStrategyStatistics+				) (+					showUnitInterval $ getWeightedMeanOfTimetableCriteria evolutionStrategyStatistics+				) (+					Data.Maybe.maybe "Infinity" (+						\improvementFactor -> if improvementFactor == 0+							then "0"+							else showString (showReal nDecimalDigits (100 * improvementFactor)) "%"+					) $ getMaybeImprovementFactor evolutionStrategyStatistics+				) (+					getNGenerations evolutionStrategyStatistics+				) (+					(+						\(x, y)	-> show x ++ if x == y+							then ""+							else "->" ++ show y+					) $ (getInitialFecundity &&& getFinalFecundity) evolutionStrategyStatistics+				) (+					Data.Maybe.maybe notApplicable showListOfStrings $ map (+						Data.Maybe.maybe notApplicable showUnitInterval+					) `fmap` getMaybeTimetableCriteriaValues evolutionStrategyStatistics+				)+			) evolutionStrategyStatisticsList+		), -- Pair.+	if areAllEvolutionStrategiesZero+		then Nothing+		else Just (+			"The final value of each timetable-criterion, & the improvement, from the " ++ hintText,+			showListOfStrings . zipWith (+				\maybeFinalWeightedTimetableCriterion maybeInitialWeightedTimetableCriterion	-> case (maybeFinalWeightedTimetableCriterion, maybeInitialWeightedTimetableCriterion) of+					(Just finalWeightedTimetableCriterion, Just initialWeightedTimetableCriterion)	-> Text.Printf.printf "(%s,%s)" (+						showUnitInterval finalWeightedTimetableCriterion+					 ) . showUnitInterval $ finalWeightedTimetableCriterion - initialWeightedTimetableCriterion+					_										-> notApplicable+			) finalTimetableCriteriaValues $ OutputFormat.DeterministicStudentViewTimetableSelection.getInitialTimetableCriteriaValues deterministicStudentViewTimetableSelection+		) -- Pair.+ ] where+	hintText :: String+	hintText+		| traversalOrderWasSpecified	= "deterministic timetable resulting from all specified raster-scans"	-- There may be more than one.+		| inputFilePathWasSpecified	= "specified timetable"+		| otherwise			= "best deterministic timetable"++	showListOfStrings :: [String] -> String+	showListOfStrings	= showChar '[' . (`showString` "]") . Data.List.intercalate ", "++	showUnitInterval :: Real r => r -> String+	showUnitInterval 0	= "0"+	showUnitInterval 1	= "1"+	showUnitInterval x	= showReal nDecimalDigits x++	showListOfReals :: Real r => [r] -> String+	showListOfReals	= showListOfStrings . map showUnitInterval++-- | Render the results in XHTML.+toHtml :: (+	RealFrac	criterionValue,+	RealFrac	criterionWeight,+	RealFrac	standardDeviation,+	RealFrac	mean,+	RealFrac	weightedMean,+	Show		criterionValue,+	Show		criterionWeight,+	Show		mean,+	Show		standardDeviation,+	Show		weightedMean+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> OutputConfiguration.Options.NDecimalDigits						-- ^ The required number of decimal digits.+	-> ExecutionConfiguration.LessonCriteriaWeights.LessonCriteriaWeights criterionWeight	-- ^ The unoptimised /lesson-criteria/ weights.+	-> OptimiseLessonCriteriaWeightsLog criterionWeight weightedMean+	-> OutputFormat.DeterministicStudentViewTimetableSelection.DeterministicStudentViewTimetableSelection criterionValue criterionWeight level locationId mean standardDeviation teacherId timeslotId weightedMean+	-> [EvolutionStrategyStatistics weightedMean criterionValue]+	-> Text.XHtml.Strict.Html+toHtml executionOptions nDecimalDigits originalLessonCriteriaWeights optimiseLessonCriteriaWeightsLog deterministicStudentViewTimetableSelection evolutionStrategyStatisticsList	= (+	if null optimiseLessonCriteriaWeightsLog+		then Text.XHtml.Strict.noHtml+		else Text.XHtml.Strict.paragraph ! [+			Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier+		] << (+			"By randomly mutating lesson-criteria weights by the specified magnitude, the " ++ (+				if useMeanOverRasterScans then "mean over" else "maximum of"+			) ++ " all specified raster-scans, of the weighted mean over heterogeneous timetable-criteria, for the initial deterministic timetable, was improved by; " +++ Data.List.intersperse (+				Text.XHtml.Strict.toHtml ", "+			) (+				map (+					\(trialNumber, changeMagnitude, deltaOverRastersOfWeightedMeanOverTimetableCriteria)	-> '(' +++ (+						Text.XHtml.Strict.thespan ! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier,+							Text.XHtml.Strict.title "Trial-number."+						] << trialNumber+					) +++ ',' +++ (+						Text.XHtml.Strict.thespan ! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier,+							Text.XHtml.Strict.title "Change-magnitude."+						] << showReal nDecimalDigits changeMagnitude+					) +++ ')' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.primHtmlChar "rArr" +++ Text.XHtml.Strict.spaceHtml +++ (+						colourUnitIntervalSpan deltaOverRastersOfWeightedMeanOverTimetableCriteria ! [+							Text.XHtml.Strict.title	$ "Incremental improvement in the " ++ (+								if useMeanOverRasterScans then "mean over" else "maximum of"+							) ++ " all specified raster-scans, of the weighted mean over heterogeneous timetable-criteria."+						]+					)+				) optimiseLessonCriteriaWeightsLog+			) +++ "."+		)+ ) +++ either (+	(+		Text.XHtml.Strict.paragraph ! [+			Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier+		] <<+	) . (+		(+			"The weighted mean value over heterogeneous timetable-criteria of the single deterministic timetable" +++ Data.Maybe.maybe Text.XHtml.Strict.noHtml (+				(+					Text.XHtml.Strict.thespan ! [+						Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+					] <<+				) . either (+					showString " resulting from the raster-scan " . show+				) (+					showString " specified in the file " . show+				)+			) (+				ExecutionConfiguration.ExecutionOptions.getMaybeHint executionOptions+			) +++ ", is "+		) ++++	) . (+		+++ "."	-- Terminate+	) . colourUnitIntervalSpan	-- ExecutionConfiguration.ExecutionOptions.getMaybeHint was specified.+ ) (+	\weightedMeanOfTimetableCriteriaByTraversalOrder -> Text.XHtml.Strict.table ! [+		Text.XHtml.Strict.theclass runtimeInformationCSSIdentifier,+		Text.XHtml.Strict.identifier "weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	] << (+		[+			Text.XHtml.Strict.tr << (+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan 4	-- Spans axis-triple & the weighted-mean over the values of heterogeneous timetable-criteria.+				] << (+					"The Weighted Mean over the values of Heterogeneous Timetable-criteria," +++ Text.XHtml.Strict.br +++ "of the Deterministic Timetable resulting from each Raster-scan."+				)+			),+			Text.XHtml.Strict.tr << [+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan 3	-- Spans axis-triple.+				] << "Slowest-changing to Fastest-changing Coordinate.",+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.title "Weighted Mean over the values of Heterogeneous Timetable-criteria."+				] << mu+			]+		] ++ map (+			\(timetableAxisTriple, weightedMeanOfTimetableCriteria)	-> (+				Text.XHtml.Strict.tr ! if timetableAxisTriple == fst (Data.List.maximumBy (Data.Ord.comparing snd) weightedMeanOfTimetableCriteriaByTraversalOrder)+					then [+						Text.XHtml.Strict.identifier "selectedRaster",+						Text.XHtml.Strict.title "Selected Raster-scan."+					]+					else []+			) << let+				(x, y, z)	= Model.TimetableAxisTriple.deconstruct timetableAxisTriple+				renderAxis	= (+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.theclass timetableAxisCSSIdentifier+					] <<+				 ) . show+			in [+				renderAxis x,+				renderAxis y,+				renderAxis z,+				colourUnitIntervalTD weightedMeanOfTimetableCriteria+			]+		) weightedMeanOfTimetableCriteriaByTraversalOrder ++ [+			Text.XHtml.Strict.tr << (+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan 3,	-- Spans axis-triple.+					Text.XHtml.Strict.title "The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+				] << mu +++ colourUnitIntervalTD (+					Factory.Math.Statistics.getMean $ map snd {-weightedMean-} weightedMeanOfTimetableCriteriaByTraversalOrder :: Rational+				)+			)+		]+	)+ ) (+	OutputFormat.DeterministicStudentViewTimetableSelection.getWeightedMeanOfTimetableCriteria deterministicStudentViewTimetableSelection+ ) +++ let+	initialLessonCriteriaStatistics	= OutputFormat.DeterministicStudentViewTimetableSelection.getInitialLessonCriteriaStatistics deterministicStudentViewTimetableSelection+ in (+	if null initialLessonCriteriaStatistics+		then Text.XHtml.Strict.noHtml	-- Otherwise mean of null list fails.+		else Text.XHtml.Strict.table ! [+			Text.XHtml.Strict.theclass runtimeInformationCSSIdentifier,+			Text.XHtml.Strict.identifier "initialLessonCriteriaStatisticsTable"+		] << (+			let+				statisticsHeaders :: [Text.XHtml.Strict.Html]+				statisticsHeaders	= map (+					\(title, contents) -> Text.XHtml.Strict.th ! [+						Text.XHtml.Strict.title title+					] << contents+				 ) [+					(+						"The mean value",+						mu+					), (+						"The standard deviation.",+						sigma+					), (+						"The minimum value.",+						Text.XHtml.Strict.toHtml "Min."+					), (+						"The maximum value.",+						Text.XHtml.Strict.toHtml "Max."+					)+				 ]++				nStatisticsHeaders :: Int+				nStatisticsHeaders	= length statisticsHeaders+			in [+				Text.XHtml.Strict.tr << (+					Text.XHtml.Strict.th ! [+						Text.XHtml.Strict.colspan $ (+							if wereOptimisedLessonCriteriaWeights+								then succ	-- Spans 'Optimised'.+								else id+						) (+							2 {-spans 'Name' & 'Original'-} + nStatisticsHeaders+						)+					] << (+						"Statistics gathered for the values of each Lesson-criterion in isolation," +++ Text.XHtml.Strict.br +++ "Evaluated over each of the lessons of the best Deterministic Timetable."+					)+				),+				Text.XHtml.Strict.tr << (+					[+						Text.XHtml.Strict.th ! [+							Text.XHtml.Strict.rowspan 2+						] << "Name",+						Text.XHtml.Strict.th ! [+							if wereOptimisedLessonCriteriaWeights+								then Text.XHtml.Strict.colspan 2	-- Spans 'Original' & 'Optimised'.+								else Text.XHtml.Strict.rowspan 2,+							Text.XHtml.Strict.title "The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+						] << "Weight"+					] ++ [+						Text.XHtml.Strict.th ! [+							Text.XHtml.Strict.colspan nStatisticsHeaders,+							Text.XHtml.Strict.title "Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+						] << "Statistics"+					]+				),+				Text.XHtml.Strict.tr << (+					if wereOptimisedLessonCriteriaWeights+						then (+							map (Text.XHtml.Strict.th <<) ["Original", "Optimised"] +++						) -- Section.+						else id+				) statisticsHeaders+			] ++ map (+				\((lessonCriterionTag, lessonCriterionWeightAccessor), maybeLessonCriteriaStatistics)	-> Text.XHtml.Strict.tr << (+					(+						(+							Text.XHtml.Strict.td ! [+								Text.XHtml.Strict.theclass "lessonCriterion"+							] << lessonCriterionTag+						) : let+							[lessonCriterionWeight, lessonCriterionWeight']	= map (+								ExecutionConfiguration.CriterionWeight.deconstruct . lessonCriterionWeightAccessor+							 ) [+								originalLessonCriteriaWeights,+								ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights executionOptions+							 ]+						in if wereOptimisedLessonCriteriaWeights+							then if lessonCriterionWeight == lessonCriterionWeight'+								then [+									colourUnitIntervalTD lessonCriterionWeight ! [Text.XHtml.Strict.colspan 2]+								]+								else map colourUnitIntervalTD [lessonCriterionWeight, lessonCriterionWeight']+							else [+								colourUnitIntervalTD lessonCriterionWeight+							]+					) ++ Data.Maybe.maybe [+						Text.XHtml.Strict.td ! [+							Text.XHtml.Strict.colspan nStatisticsHeaders,+							Text.XHtml.Strict.theclass Model.TimetableForWeek.unavailableCSSIdentifier,+							Text.XHtml.Strict.title zeroWeight+						] << notApplicable+					] (+						\((mean, standardDeviation), (min', max'))	-> [+							colourUnitIntervalTD mean,+							colourUnitIntervalTD standardDeviation,+							colourUnitIntervalTD min',+							colourUnitIntervalTD max'+						]+					) maybeLessonCriteriaStatistics+				)+			) (+				zip ExecutionConfiguration.LessonCriteriaWeights.associationList initialLessonCriteriaStatistics+			)+		)+ ) +++ Text.XHtml.Strict.table ! [+	Text.XHtml.Strict.theclass runtimeInformationCSSIdentifier,+	Text.XHtml.Strict.identifier "evolutionStrategyStatisticsTable"+ ] << (+	let+		tableHeaders :: [Text.XHtml.Strict.Html]+		tableHeaders	= map (+			\(title, contents)	-> Text.XHtml.Strict.th ! [+				Text.XHtml.Strict.title title+			] << contents+		 ) [+			(+				"The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation.",+				"Depletion"+			), (+				"The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy.",+				"Reconstruction"+			), (+				"The initial size of the breeding-program for this evolution-strategy.",+				"Initial"+			), (+				"The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive.",+				"Final"+			)+		 ]++		nColumns, nTimetableCriteria :: Int+		nColumns		= length tableHeaders + 3 {-double height headers from previous row-}+		nTimetableCriteria	= length ExecutionConfiguration.TimetableCriteriaWeights.associationList+	in [+		Text.XHtml.Strict.tr << (+			Text.XHtml.Strict.th ! [+				Text.XHtml.Strict.colspan $ nColumns + nTimetableCriteria+			] << (+				"The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where " +++ Data.Maybe.maybe (+					Text.XHtml.Strict.toHtml "a Variable number of"+				) (+					(+++ " Initial") . (+						Text.XHtml.Strict.thespan ! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+						] <<+					) -- Section.+				) (+					ExecutionConfiguration.EvolutionStrategies.getMaybeNInitialScouts $ ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions+				) +++ " Scouts were Dispatched."+			)+		),+		Text.XHtml.Strict.tr ! [+			Text.XHtml.Strict.identifier "timetableCriteriaWeights"+		] << (+			(+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan nColumns+				] << (+					"Timetable-criteria Weights" +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.primHtmlChar "rarr"+				)+			) : map (+				\(timetableCriterionTag, timetableCriterionWeightAccessor)	-> colourUnitIntervalTD (+					ExecutionConfiguration.CriterionWeight.deconstruct . timetableCriterionWeightAccessor $ ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights executionOptions+				) ! [+					Text.XHtml.Strict.title timetableCriterionTag+				]+			) ExecutionConfiguration.TimetableCriteriaWeights.associationList+		),+		Text.XHtml.Strict.tr ! [+			Text.XHtml.Strict.identifier "bestDeterministicWeightedTimetableCriteria"+		] << (+			(+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan nColumns+				] << (+					"The value of each Timetable-criterion, for the Best Deterministic Timetable" +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.primHtmlChar "rarr"+				)+			) : zipWith (+				\(timetableCriterionTag, _)	-> Data.Maybe.maybe (+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.theclass Model.TimetableForWeek.unavailableCSSIdentifier,+						Text.XHtml.Strict.title zeroWeight+					] << notApplicable+				) (+					(! [Text.XHtml.Strict.title timetableCriterionTag]) . colourUnitIntervalTD+				)+			) ExecutionConfiguration.TimetableCriteriaWeights.associationList (+				OutputFormat.DeterministicStudentViewTimetableSelection.getInitialTimetableCriteriaValues deterministicStudentViewTimetableSelection+			)+		)+	] ++ if null evolutionStrategyStatisticsList+		then []+		else [+			Text.XHtml.Strict.tr << [+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan 2,	-- Spans 'Depletion' & 'Reconstruction'.+					Text.XHtml.Strict.title "The means by which a candidate-timetable is mutated, in the search for improvement."+				] << "Chronologically ordered Evolution-strategies",+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.colspan 2,	-- Spans 'Initial' & 'Final'.+					Text.XHtml.Strict.title "The size of the breeding-program for this evolution-strategy."+				] << "Fecundity",+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.rowspan 2,	-- Double height.+					Text.XHtml.Strict.title "The number of generations through which the timetable evolved, using this evolution-strategy."+				] << "Generations",+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.rowspan 2,	-- Double height.+					Text.XHtml.Strict.title "The weighted mean over the values of heterogeneous timetable-criteria."+				] << mu,+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.rowspan 2,	-- Double height.+					Text.XHtml.Strict.title "The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+				] << delta,+				Text.XHtml.Strict.th ! [+					Text.XHtml.Strict.rowspan 2,	-- Double height.+					Text.XHtml.Strict.colspan nTimetableCriteria,+					Text.XHtml.Strict.title "The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+				] << "Timetable-criterion Values"+			],+			Text.XHtml.Strict.tr << tableHeaders+		] ++ map (+			\evolutionStrategyStatistics -> let+				isFecundityUnchanged'	= isFecundityUnchanged evolutionStrategyStatistics+			in Text.XHtml.Strict.tr << (+				[+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.theclass "depletionStrategy"+					] << getDepletionStrategyName evolutionStrategyStatistics,+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.theclass "reconstructionStrategy"+					] << getReconstructionStrategyName evolutionStrategyStatistics,+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.colspan $ if isFecundityUnchanged' then 2 else 1,+						Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+					] << getInitialFecundity evolutionStrategyStatistics,+					if isFecundityUnchanged'+						then Text.XHtml.Strict.noHtml+						else Text.XHtml.Strict.td ! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+						] << getFinalFecundity evolutionStrategyStatistics,+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+					] << getNGenerations evolutionStrategyStatistics+				] ++ Data.Maybe.maybe [+					Text.XHtml.Strict.td ! [+						Text.XHtml.Strict.theclass Model.TimetableForWeek.unavailableCSSIdentifier,+						Text.XHtml.Strict.colspan $ nTimetableCriteria + 2 {-spans mu & delta-},+						Text.XHtml.Strict.title "Zero productive generations of evolution occurred."+					] << notApplicable+				] (+					(+						[+							colourUnitIntervalTD $ getWeightedMeanOfTimetableCriteria evolutionStrategyStatistics,+							Data.Maybe.maybe infiniteValue (+								\improvementFactor -> (+									Text.XHtml.Strict.td ! [+										Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier,+										Text.XHtml.Strict.thestyle $ "color: " ++ Colour.HTMLColour.unitIntervalToHTMLColourCode (1 - recip (1 + improvementFactor))	-- Map the interval [0, infinity) to [0, 1].+									] <<+								) . (`showString` "%") . showReal nDecimalDigits $ 100 * improvementFactor+							) $ getMaybeImprovementFactor evolutionStrategyStatistics+						] +++					) . zipWith (+						\(timetableCriterionTag, _)	-> Data.Maybe.maybe (+							Text.XHtml.Strict.td ! [+								Text.XHtml.Strict.theclass Model.TimetableForWeek.unavailableCSSIdentifier,+								Text.XHtml.Strict.title zeroWeight+							] << notApplicable+						) (+							(! [Text.XHtml.Strict.title timetableCriterionTag]) . colourUnitIntervalTD+						)+					) ExecutionConfiguration.TimetableCriteriaWeights.associationList+				) (+					getMaybeTimetableCriteriaValues evolutionStrategyStatistics+				)+			)+		) evolutionStrategyStatisticsList ++ take 1 {-perhaps none-} (+			map (+				\finalTimetableCriteriaValues -> Text.XHtml.Strict.tr << (+					(+						Text.XHtml.Strict.th ! [+							Text.XHtml.Strict.title "The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable.",+							Text.XHtml.Strict.colspan 7	-- Depletion, Reconstruction, Initial, Final, Generations, Mu, Delta.+						] << delta+					) : Data.List.zipWith3 (+						\(timetableCriterionTag, timetableCriterionWeightAccessor) maybeFinalTimetableCriterionValue maybeInitialTimetableCriterionValue	-> case (maybeFinalTimetableCriterionValue, maybeInitialTimetableCriterionValue) of+							(Just finalTimetableCriterionValue, Just initialTimetableCriterionValue)	-> let+								deltaTimetableCriterionValue	= finalTimetableCriterionValue - initialTimetableCriterionValue+							 in Text.XHtml.Strict.td ! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier,+								Text.XHtml.Strict.thestyle $ "color: " ++ Colour.HTMLColour.unitIntervalToHTMLColourCode ((1 + deltaTimetableCriterionValue) / 2),	-- Map the interval [-1, 1] -> [0, 1].+								Text.XHtml.Strict.title timetableCriterionTag+							 ] << Text.XHtml.Strict.lineToHtml {-embed nbsps-} (+								case deltaTimetableCriterionValue of+									0	-> Text.Printf.printf "%-*d" (nDecimalDigits + 2) (0 :: Int)	-- Left-justify in a fixed-width field.+									_	-> showReal nDecimalDigits . (+										* realToFrac deltaTimetableCriterionValue+									 ) . ExecutionConfiguration.CriterionWeight.deconstruct . timetableCriterionWeightAccessor $ ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights executionOptions+							 )+							_									-> Text.XHtml.Strict.td ! [+								Text.XHtml.Strict.theclass Model.TimetableForWeek.unavailableCSSIdentifier,+								Text.XHtml.Strict.title zeroWeight+							 ] << notApplicable+					) ExecutionConfiguration.TimetableCriteriaWeights.associationList finalTimetableCriteriaValues (+						OutputFormat.DeterministicStudentViewTimetableSelection.getInitialTimetableCriteriaValues deterministicStudentViewTimetableSelection+					)+				)+			) . Data.Maybe.mapMaybe getMaybeTimetableCriteriaValues {-weed-out those with zero productive generations-} $ reverse {-the last set of results is required-} evolutionStrategyStatisticsList+		)+ ) where+	wereOptimisedLessonCriteriaWeights, useMeanOverRasterScans :: Bool+	(wereOptimisedLessonCriteriaWeights, useMeanOverRasterScans)	= ExecutionConfiguration.OptimiseLessonCriteriaWeights.isRequired &&& ExecutionConfiguration.OptimiseLessonCriteriaWeights.getUseMeanOverRasterScans $ ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights executionOptions++	colourUnitInterval :: (RealFrac r, Show r) => (Text.XHtml.Strict.Html -> Text.XHtml.Strict.Html) -> r -> Text.XHtml.Strict.Html+	colourUnitInterval element x	= element ! [+		Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier,+		Text.XHtml.Strict.thestyle $ "color: " ++ Colour.HTMLColour.unitIntervalToHTMLColourCode x+	 ] << (+		Text.XHtml.Strict.lineToHtml {-embed nbsps-} . if x `elem` [0, 1]+			then (+				Text.Printf.printf "%-*d" (nDecimalDigits + 2) :: Int -> String	-- Left-justify in a fixed-width field.+			) . round+			else showReal nDecimalDigits+	 ) x++	colourUnitIntervalSpan, colourUnitIntervalTD :: (RealFrac r, Show r) => r -> Text.XHtml.Strict.Html+	colourUnitIntervalSpan	= colourUnitInterval Text.XHtml.Strict.thespan+	colourUnitIntervalTD	= colourUnitInterval Text.XHtml.Strict.td++	zeroWeight :: String+	zeroWeight	= "Zero weight"++	delta, mu, sigma, infinity :: Text.XHtml.Strict.Html+	[delta, mu, sigma, infinity]	= map (+		uncurry (<<) . (+			(Text.XHtml.Strict.abbr !) . return {-to List-monad-} . Text.XHtml.Strict.title &&& Text.XHtml.Strict.primHtmlChar+		)+	 ) ["Delta", "mu", "sigma", "infin"]++	infiniteValue	= Text.XHtml.Strict.td ! [+		Text.XHtml.Strict.title "Infinity"+	 ] << infinity+
+ src-exe/WeekDaze/OutputFormat/XHTMLFormat.hs view
@@ -0,0 +1,182 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Composes an XHTML-document, according to the specified format.++	* Optionally depicts the specified /timetable/ from alternative points of view.+-}++module WeekDaze.OutputFormat.XHTMLFormat(+-- * Functions+	composeBody,+	renderDocument+) where++import qualified	Data.Array.IArray+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.OutputConfiguration.Options			as OutputConfiguration.Options+import qualified	WeekDaze.OutputConfiguration.View			as OutputConfiguration.View+import qualified	WeekDaze.OutputFormat.XHTMLFormatLocationViewTimetable	as OutputFormat.XHTMLFormatLocationViewTimetable+import qualified	WeekDaze.OutputFormat.XHTMLFormatStudentViewTimetable	as OutputFormat.XHTMLFormatStudentViewTimetable+import qualified	WeekDaze.OutputFormat.XHTMLFormatTeacherViewTimetable	as OutputFormat.XHTMLFormatTeacherViewTimetable+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.Text.CSS					as Text.CSS+import qualified	WeekDaze.Text.XHTML					as Text.XHTML+import			System.FilePath((</>), (<.>))+import			Text.XHtml.Strict((<<), (+++), (!))++-- | Format the body of an XHTML-document, from the required views of the /timetable/.+composeBody :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			campus,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			stream,+	Show			teacherId,+	Show			timeslotId,+	Text.XHtml.Strict.HTML	campus,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	stream,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> OutputConfiguration.Options.Options minimumContrastRatio+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Maybe ([String], Text.XHtml.Strict.Html)	-- ^ A List of warning-messages & a progress-log.+	-> Data.Set.Set OutputConfiguration.View.View+	-> Model.Timetable.AugmentMarkup+	-> Model.TimetableForWeek.GenericTimetableToMarkup minimumContrastRatio (StudentView.Timetable.Timetable timeslotId locationId teacherId level)+composeBody problemParameters executionOptions outputOptions problemAnalysis maybeRuntimeInformation displayViews displaySupplementaryInformation mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom studentViewTimetable	= foldr1 (+++) $ Data.Maybe.maybe id (+	\(warnings, runtimeLog)	-> (+		box << (+			let+				displayState	= False+			in Text.XHTML.mkShowHideButton displayState Text.CSS.consoleOutputCSSIdentifier +++ Text.XHtml.Strict.h2 ! [+				Text.XHtml.Strict.title "Runtime-information."+			] << "Runtime-information" +++ Text.XHtml.Strict.thediv ! (+				if displayState+					then id+					else (Text.XHtml.Strict.thestyle "display: none" :)+			) [+				Text.XHtml.Strict.identifier Text.CSS.consoleOutputCSSIdentifier+			] << (+				Text.XHtml.Strict.unordList (+					map (+						Text.XHtml.Strict.paragraph ! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier+						] <<+					) warnings+				) +++ runtimeLog+			)+		) :+	) -- Section.+ ) maybeRuntimeInformation [+	box << f problemParameters problemAnalysis displaySupplementaryInformation mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom studentViewTimetable |+		(True, f)	<- [+			(+				Data.Set.member OutputConfiguration.View.StudentView displayViews,+				OutputFormat.XHTMLFormatStudentViewTimetable.composeStudentViewTimetable+			), (+				Data.Set.member OutputConfiguration.View.TeacherView displayViews,+				OutputFormat.XHTMLFormatTeacherViewTimetable.composeTeacherViewTimetable executionOptions outputOptions+			), (+				Data.Set.member OutputConfiguration.View.LocationView displayViews,+				OutputFormat.XHTMLFormatLocationViewTimetable.composeLocationViewTimetable executionOptions+			)+		]+ ] where+	box :: Text.XHtml.Strict.Html -> Text.XHtml.Strict.Html+	box	= Text.XHtml.Strict.thediv ! [Text.XHtml.Strict.theclass Text.CSS.boxCSSIdentifier]++-- | Build an XHTML-document, from a title & an arbitrary XHTML-body.+renderDocument+	:: Maybe String			-- ^ An optional URL referencing a /CSS/-file.+	-> String			-- ^ Author.+	-> String			-- ^ Description.+	-> String			-- ^ Keywords.+	-> String			-- ^ The program-name.+	-> String			-- ^ The title of the document-body.+	-> Text.XHtml.Strict.Html	-- ^ The XHTML-content of the document-body.+	-> String			-- ^ The resulting XHTML for the document.+renderDocument maybeCSSURL author description keywords progName documentTitle content	= Text.XHtml.Strict.renderHtmlWithLanguage "en" {- ISO 639-1 -} $ Text.XHtml.Strict.header << [+	Text.XHtml.Strict.meta ! [+		Text.XHtml.Strict.httpequiv "Content-type",+		Text.XHtml.Strict.content "application/xhtml+xml;charset=UTF-8"+	],+	Text.XHtml.Strict.meta ! [+		Text.XHtml.Strict.name "author",+		Text.XHtml.Strict.content author+	],+	Text.XHtml.Strict.meta ! [+		Text.XHtml.Strict.name "description",+		Text.XHtml.Strict.content description+	],+	Text.XHtml.Strict.meta ! [+		Text.XHtml.Strict.name "keywords",+		Text.XHtml.Strict.content keywords+	],+	Text.XHtml.Strict.thelink ! [+		Text.XHtml.Strict.rel "icon",+		Text.XHtml.Strict.href $ ".." </> "images" </> "favicon" <.> "png",+		Text.XHtml.Strict.thetype "image/png"+	] << Text.XHtml.Strict.noHtml,+	Text.XHtml.Strict.thelink ! [+		Text.XHtml.Strict.rel "stylesheet",+		Text.XHtml.Strict.href $ ".." </> Text.CSS.cssSuffix {-use as directory-name-} </> progName <.> Text.CSS.cssSuffix,	-- Default.+		Text.XHtml.Strict.thetype referencedContentType+	] << Text.XHtml.Strict.noHtml,+	Data.Maybe.maybe Text.XHtml.Strict.noHtml (+		\cssURL -> Text.XHtml.Strict.thelink ! [+			Text.XHtml.Strict.rel "stylesheet",+			Text.XHtml.Strict.href cssURL,+			Text.XHtml.Strict.thetype referencedContentType+		] << Text.XHtml.Strict.noHtml+	) maybeCSSURL,+	Text.XHtml.Strict.thetitle << progName+ ] +++ Text.XHtml.Strict.body << [+	Text.XHtml.Strict.h1 ! [+		Text.XHtml.Strict.identifier "commandLine"+	] << documentTitle,+	content+ ] where+	referencedContentType :: String+	referencedContentType	= "text/css"+
+ src-exe/WeekDaze/OutputFormat/XHTMLFormatLocationViewTimetable.hs view
@@ -0,0 +1,116 @@+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Formats a LocationViewTimetable in XHTML, according to the specified format.+-}++module WeekDaze.OutputFormat.XHTMLFormatLocationViewTimetable(+-- * Constants+	locationViewTimetableTag,+-- * Functions+	composeLocationViewTimetable+) where++import qualified	Data.Array.IArray+import qualified	Text.XHtml.Strict+import qualified	WeekDaze.Dynamic.LocationViewTimetableUtilities		as Dynamic.LocationViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.LocationView.Timetable				as LocationView.Timetable+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.Text.CSS					as Text.CSS+import qualified	WeekDaze.Text.XHTML					as Text.XHTML+import			Text.XHtml.Strict((<<), (+++), (!))++-- | A CSS-identifier & base file-name.+locationViewTimetableTag :: String+locationViewTimetableTag	= "locationViewTimetable"++-- | Compose XHTML representing a LocationViewTimetable.+composeLocationViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId,+	Text.XHtml.Strict.HTML	campus,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Model.Timetable.AugmentMarkup+	-> Model.TimetableForWeek.GenericTimetableToMarkup minimumContrastRatio (StudentView.Timetable.Timetable timeslotId locationId teacherId level)+composeLocationViewTimetable executionOptions problemParameters problemAnalysis displaySupplementaryInformation mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom studentViewTimetable	= let+	displayState	= False+ in Text.XHTML.mkShowHideButton displayState locationViewTimetableTag +++ Text.XHtml.Strict.h2 ! [+	Text.XHtml.Strict.title "From the perspective of each location."+ ] << "By Location-id" +++ Text.XHtml.Strict.thediv ! (+	if displayState+		then id+		else (Text.XHtml.Strict.thestyle "display: none" :)+ ) [+	Text.XHtml.Strict.identifier locationViewTimetableTag+ ] << (+	(+		if displaySupplementaryInformation+			then Text.XHtml.Strict.thediv ! [Text.XHtml.Strict.theclass Text.CSS.boxCSSIdentifier] << (+				Text.XHtml.Strict.h3 << "Summary" +++ Text.XHtml.Strict.defList [+					(+						Text.XHtml.Strict.thespan ! [+							Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+							Text.XHtml.Strict.title "The sum over all locations, of available but unallocated time-slots."+						] << "Unallocated time-slots:",+						Text.XHtml.Strict.thespan ! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+						] << Model.Timetable.countUnallocatedAvailableTimeslots locationCatalogue locationViewTimetable+					) -- Pair.+				] ! [+					Text.XHtml.Strict.theclass Text.CSS.timetableViewCSSIdentifier+				]+			)+			else Text.XHtml.Strict.noHtml+	) +++ LocationView.Timetable.toXHtml (+		ProblemConfiguration.ProblemAnalysis.findCourseForLocationViewLesson problemParameters	-- Partially apply.+	) locationCatalogue displaySupplementaryInformation (+		ProblemConfiguration.ProblemAnalysis.getMeetingsByTime problemAnalysis+	) mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom locationViewTimetable +++ Text.XHtml.Strict.br ! [+		Text.XHtml.Strict.theclass Model.TimetableForWeek.observerViewTerminatorCSSIdentifier+	]+ ) where+	locationCatalogue	= ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters+	locationViewTimetable	= Dynamic.LocationViewTimetableUtilities.fromStudentViewTimetable executionOptions problemAnalysis studentViewTimetable+
+ src-exe/WeekDaze/OutputFormat/XHTMLFormatStudentViewTimetable.hs view
@@ -0,0 +1,156 @@+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Formats a StudentViewTimetable in XHTML, according to the specified format.+-}++module WeekDaze.OutputFormat.XHTMLFormatStudentViewTimetable(+-- * Constants+	studentViewTimetableTag,+-- * Functions+	composeStudentViewTimetable+) where++import			Control.Arrow((&&&))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Map+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.Aggregate.StudentBodyRegister			as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Data.Requirements				as Data.Requirements+import qualified	WeekDaze.Dynamic.StudentViewTimetableUtilities		as Dynamic.StudentViewTimetableUtilities+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.Text.CSS					as Text.CSS+import qualified	WeekDaze.Text.XHTML					as Text.XHTML+import			Text.XHtml.Strict((<<), (+++), (!))++-- | A CSS-identifier & base file-name.+studentViewTimetableTag :: String+studentViewTimetableTag	= "studentViewTimetable"++-- | Compose XHTML representing the specified StudentViewTimetable.+composeStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			campus,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			stream,+	Show			teacherId,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	stream,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Model.Timetable.AugmentMarkup+	-> Model.TimetableForWeek.GenericTimetableToMarkup minimumContrastRatio (StudentView.Timetable.Timetable timeslotId locationId teacherId level)+composeStudentViewTimetable problemParameters problemAnalysis displaySupplementaryInformation mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom studentViewTimetable	= let+	displayState	= True+ in Text.XHTML.mkShowHideButton displayState studentViewTimetableTag +++ Text.XHtml.Strict.h2 ! [+	Text.XHtml.Strict.title "From the perspective of each student-body."+ ] << "By Student-body" +++ Text.XHtml.Strict.thediv ! (+	if displayState+		then id+		else (Text.XHtml.Strict.thestyle "display: none" :)+ ) [+	Text.XHtml.Strict.identifier studentViewTimetableTag+ ] << (+	(+		if displaySupplementaryInformation+			then Text.XHtml.Strict.thediv ! [+				Text.XHtml.Strict.theclass Text.CSS.boxCSSIdentifier+			] << (+				Text.XHtml.Strict.h3 << "Summary" +++ (+					Text.XHtml.Strict.thediv ! [+						Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier+					] << Text.XHtml.Strict.defList (+						map (+							Control.Arrow.second (+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+								] <<+							)+						) [+							(+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.title "The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+								] << "Incompletely booked core knowledge-requirements:",+								Aggregate.StudentBodyRegister.countSubjectsRequired incompletelyBookedCoreKnowledgeRequirementsByStudentBody+							), (+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.title "The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+								] << "Incompletely booked optional knowledge-requirements:",+								Aggregate.StudentBodyRegister.countSubjectsRequired incompletelyBookedOptionalKnowledgeRequirementsByStudentBody+							), (+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.title "The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study & meetings."+								] << "Total free-periods:",+								Dynamic.StudentViewTimetableUtilities.countFreeLessons problemParameters problemAnalysis studentViewTimetable+							) -- Pair.+						]+					) ! [+						Text.XHtml.Strict.theclass Text.CSS.timetableViewCSSIdentifier+					]+				)+			)+			else Text.XHtml.Strict.noHtml+	) +++ StudentView.Timetable.toXHtml (+		Dynamic.StudentViewTimetableUtilities.countInterCampusMigrationsByStudentBody problemParameters studentViewTimetable+	) incompletelyBookedKnowledgeRequirementsByStudentBody (+		Dynamic.StudentViewTimetableUtilities.findExcessiveLessonRunlengthsByTimeByStudentBody problemParameters studentViewTimetable+	) (+		Dynamic.StudentViewTimetableUtilities.findShortLessonRunlengthsByTimeByStudentBody problemParameters studentViewTimetable+	) (+		ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis+	) (+		ProblemConfiguration.ProblemAnalysis.findCourseFor problemParameters	-- Partially apply.+	) (+		ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+	) displaySupplementaryInformation (+		ProblemConfiguration.ProblemAnalysis.getMeetingsByTime problemAnalysis+	) mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom studentViewTimetable +++ Text.XHtml.Strict.br ! [+		Text.XHtml.Strict.theclass Model.TimetableForWeek.observerViewTerminatorCSSIdentifier+	]+ ) where+	incompletelyBookedKnowledgeRequirementsByStudentBody@(incompletelyBookedCoreKnowledgeRequirementsByStudentBody, incompletelyBookedOptionalKnowledgeRequirementsByStudentBody)	= ToolShed.Data.Pair.mirror (+		Data.Map.filter (not . Data.Set.null)+	 ) . (+		Data.Map.map Data.Requirements.getCore &&& Data.Map.map Data.Requirements.getOptional+	 ) $ Dynamic.StudentViewTimetableUtilities.findIncompletelyBookedKnowledgeRequirementsByStudentBody problemParameters studentViewTimetable+
+ src-exe/WeekDaze/OutputFormat/XHTMLFormatTeacherViewTimetable.hs view
@@ -0,0 +1,175 @@+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Formats a TeacherViewTimetable in XHTML, according to the specified format.+-}++module WeekDaze.OutputFormat.XHTMLFormatTeacherViewTimetable(+-- * Constants+	teacherViewTimetableTag,+-- * Functions+	composeTeacherViewTimetable+) where++import			Control.Arrow((&&&), (***))+import qualified	Data.Array.IArray+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Ord+import qualified	Text.Printf+import qualified	Text.XHtml.Strict+import qualified	WeekDaze.Data.Teacher					as Data.Teacher+import qualified	WeekDaze.Dynamic.TeacherViewTimetableUtilities		as Dynamic.TeacherViewTimetableUtilities+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.OutputConfiguration.Options			as OutputConfiguration.Options+import qualified	WeekDaze.ProblemConfiguration.ProblemAnalysis		as ProblemConfiguration.ProblemAnalysis+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.TeacherView.Timetable				as TeacherView.Timetable+import qualified	WeekDaze.Text.CSS					as Text.CSS+import qualified	WeekDaze.Text.XHTML					as Text.XHTML+import			Text.XHtml.Strict((<<), (+++), (!))++-- | A CSS-identifier & base file-name.+teacherViewTimetableTag :: String+teacherViewTimetableTag	= "teacherViewTimetable"++-- | Compose XHTML representing a TeacherViewTimetable.+composeTeacherViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			campus,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio+	-> OutputConfiguration.Options.Options minimumContrastRatio+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemConfiguration.ProblemAnalysis.ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Model.Timetable.AugmentMarkup+	-> Model.TimetableForWeek.GenericTimetableToMarkup minimumContrastRatio (StudentView.Timetable.Timetable timeslotId locationId teacherId level)+composeTeacherViewTimetable executionOptions outputOptions problemParameters problemAnalysis displaySupplementaryInformation mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom studentViewTimetable	= let+	displayState	= False+ in Text.XHTML.mkShowHideButton displayState teacherViewTimetableTag +++ Text.XHtml.Strict.h2 ! [+	Text.XHtml.Strict.title "From the perspective of each teacher."+ ] << "By Teacher-id" +++ Text.XHtml.Strict.thediv ! (+	if displayState+		then id+		else (Text.XHtml.Strict.thestyle "display: none" :)+ ) [+	Text.XHtml.Strict.identifier teacherViewTimetableTag+ ] << (+	(+		if displaySupplementaryInformation+			then Text.XHtml.Strict.thediv ! [Text.XHtml.Strict.theclass Text.CSS.boxCSSIdentifier] << (+				Text.XHtml.Strict.h3 << "Summary" +++ Text.XHtml.Strict.defList [+					pair | (True, pair) <- [+						(+							True,+							(+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+									Text.XHtml.Strict.title "The sum over all teachers, of available but unallocated time-slots, excluding those required for administration & meetings."+								] << "Total free-periods:",+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+								] << Dynamic.TeacherViewTimetableUtilities.countFreeLessons problemParameters problemAnalysis teacherViewTimetable+							)+						), (+							True,+							(+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+									Text.XHtml.Strict.title "The mean over all bookings, of the size of student-classes."+								] << "Mean student-class size:",+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+								] << Text.XHtml.Strict.stringToHtml (+									Text.Printf.printf "%.*f" (+										OutputConfiguration.Options.getNDecimalDigits outputOptions+									) (+										TeacherView.Timetable.calculateMeanStudentClassSize teacherViewTimetable :: Double+									)+								)+							)+						), let+							utilisationRatioExtremesByTeacherId	= (+								head {-least-} &&& last {-most-}+							 ) . Data.List.sortBy (+								Data.Ord.comparing snd {-utilisation-ratio-}+							 ) . filter (+								Data.Teacher.offersService . (teacherRegister Data.Map.!) . fst {-teacherId-}	-- Remove pure administrators, whose utilisation-ratio is undefined.+							 ) . Data.Map.assocs $ Dynamic.TeacherViewTimetableUtilities.calculateUtilisationRatioByTeacherId problemParameters problemAnalysis teacherViewTimetable+						in (+							Data.Map.size teacherRegister > 1 && uncurry (/=) (+								snd {-utilisation-ratio-} *** snd {-utilisation-ratio-} $ utilisationRatioExtremesByTeacherId+							), (+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+									Text.XHtml.Strict.title "Time allocated to teaching / time available for teaching."+								] << "(Least,Most) utilised teacher:",+								Text.XHtml.Strict.thespan ! [+									Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+								] << show (+									fst {-teacherId-} *** fst {-teacherId-} $ utilisationRatioExtremesByTeacherId+								)+							)+						) -- Pair.+					]+				] ! [+					Text.XHtml.Strict.theclass Text.CSS.timetableViewCSSIdentifier+				]+			)+			else Text.XHtml.Strict.noHtml+	) +++ TeacherView.Timetable.toXHtml (+		Dynamic.TeacherViewTimetableUtilities.countInterCampusMigrationsByTeacherId problemParameters teacherViewTimetable+	) (+		Dynamic.TeacherViewTimetableUtilities.findUnbookedSpecifiedTimesByTeacherId problemParameters teacherViewTimetable+	) (+		ProblemConfiguration.ProblemAnalysis.getNTimeslotsPerDay problemAnalysis+	) (+		ProblemConfiguration.ProblemAnalysis.findCourseForTeacherViewLesson problemParameters	-- Partially apply.+	) teacherRegister displaySupplementaryInformation (+		ProblemConfiguration.ProblemAnalysis.getMeetingsByTime problemAnalysis+	) mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom teacherViewTimetable +++ Text.XHtml.Strict.br ! [+		Text.XHtml.Strict.theclass Model.TimetableForWeek.observerViewTerminatorCSSIdentifier+	]+ ) where+	teacherRegister		= ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters+	teacherViewTimetable	= Dynamic.TeacherViewTimetableUtilities.fromStudentViewTimetable executionOptions problemAnalysis studentViewTimetable+
+ src-exe/WeekDaze/SignalHandlers.hs view
@@ -0,0 +1,56 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Provides signal-handlers.+-}+module WeekDaze.SignalHandlers (+-- * Functions+	handleSignals+) where++import qualified	Control.Concurrent+import qualified	System.IO+import qualified	System.Posix.Signals	-- CAVEAT: the package 'unix' to which this module belongs, requires a POSIX environment (such as Cygwin) for compilation on Windows++-- | Provide basic handlers for common signals.+handleSignals :: IO ()+handleSignals	= do+	threadId	<- Control.Concurrent.myThreadId++	mapM_ (+		\(signal, s)	-> System.Posix.Signals.installHandler signal (+			System.Posix.Signals.Catch $ do+				System.IO.hPutStrLn System.IO.stderr $ "WARNING:\tSIG" ++ s ++ " caught; exiting."++				Control.Concurrent.killThread threadId+		 ) Nothing+	 ) [+		(+			System.Posix.Signals.sigINT,			"INT"	-- '^C'.+		), (+			System.Posix.Signals.softwareTermination,	"TERM"	-- Default signal for 'kill'.+		), (+			System.Posix.Signals.sigQUIT,			"QUIT"	-- '^\'.+		)+	 ]+
+ src-lib/WeekDaze/Aggregate/GroupCatalogue.hs view
@@ -0,0 +1,133 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the name & attributes, of all /group/s.+-}++module WeekDaze.Aggregate.GroupCatalogue(+-- * Types+-- ** Type-synonyms+	GroupCatalogue,+	ResourceIdsByGroupId,+-- * Constants+	tag,+-- * Functions+	extractDistinctMeetingLocationIds,+	getMeetingTimes+#ifdef USE_HDBC+-- ** Translation+	,fromDatabase+#endif+) where++import qualified	Data.Map+import			Data.Map((!))+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	WeekDaze.Data.Group		as Data.Group+import qualified	WeekDaze.Data.Location		as Data.Location+import qualified	WeekDaze.Data.Resource		as Data.Resource+import qualified	WeekDaze.Temporal.Time		as Temporal.Time++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	WeekDaze.Database.Selector	as Database.Selector+import qualified	WeekDaze.Temporal.Day		as Temporal.Day++-- | Construct from the specified database-connection.+fromDatabase :: (+	Database.HDBC.IConnection	connection,+	Data.Convertible.Convertible	Database.HDBC.SqlValue locationId,	-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue timeslotId,	-- Flexible context.+	Ord				timeslotId+ )+	=> connection			-- ^ An abstract database-connection.+	-> Database.HDBC.SqlValue	-- ^ The project-id.+	-> IO (GroupCatalogue timeslotId locationId)+fromDatabase connection	projectIdSql	= let+	groupCatalogueIdColumnName :: Database.Selector.ColumnName+	groupCatalogueIdColumnName	= showString tag "Id";++	groupCatalogueTableName, meetingTimesTableName :: Database.Selector.TableName+	groupCatalogueTableName	= showString Database.Selector.tablePrefix tag+	meetingTimesTableName	= showString Database.Selector.tablePrefix "meetingTime"+ in do+#ifdef USE_HDBC_ODBC+	selectMeetingTimesForGroupCatalogueId	<- Database.Selector.prepare connection [Temporal.Day.tag, Database.Selector.timeslotIdColumnName] [meetingTimesTableName] [groupCatalogueIdColumnName]+#endif+	Database.Selector.select connection [+		groupCatalogueIdColumnName,+		Data.Group.groupIdTag,+		Database.Selector.locationIdColumnName,+		Data.Group.mandatesAttendanceTag+	 ] [groupCatalogueTableName] [(Database.Selector.projectIdColumnName, projectIdSql)] >>= fmap Data.Map.fromList . mapM (+		\groupRow -> case groupRow of+			[groupCatalogueIdSql, groupIdSql, locationIdSql, mandatesAttendanceSql]	-> do+				meetingTimes	<- (+					Data.Set.fromList . map (+						\meetingTimesRow -> case meetingTimesRow of+							[day, timeslotId]	-> Temporal.Time.mkTimeFromSql day timeslotId+							_			-> error . showString "WeekDaze.Aggregate.GroupCatalogue.fromDatabase:\tunexpected number of columns=" . shows (length meetingTimesRow) . showString " in row of table " . shows meetingTimesTableName . showString ", where " . showString Data.Group.groupIdTag . showChar '=' $ shows groupIdSql "."+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectMeetingTimesForGroupCatalogueId [groupCatalogueIdSql] >> Database.HDBC.fetchAllRows' selectMeetingTimesForGroupCatalogueId+				 )+#else+				 ) `fmap` Database.Selector.select connection [+					Temporal.Day.tag,+					Database.Selector.timeslotIdColumnName+				 ] [meetingTimesTableName] [(groupCatalogueIdColumnName, groupCatalogueIdSql)]+#endif+				return {-to IO-monad-} (+					Data.Maybe.fromMaybe (+						error . showString "WeekDaze.Aggregate.GroupCatalogue.fromDatabase:\tnull " $ shows Data.Group.groupIdTag "."+					) $ Database.HDBC.fromSql groupIdSql,+					Data.Group.mkProfile meetingTimes (+						Database.HDBC.fromSql locationIdSql	-- Returns Nothing for SqlNull.+					) $ Data.Maybe.fromMaybe Data.Group.defaultMandatesAttendance . either (+						error . showString "WeekDaze.Aggregate.GroupCatalogue.fromDatabase:\tfailed to parse the value for " . shows Data.Group.mandatesAttendanceTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql mandatesAttendanceSql+				 ) -- Pair.+			_						-> error . showString "WeekDaze.Aggregate.GroupCatalogue.fromDatabase:\tunexpected number of columns=" . shows (length groupRow) . showString " in row of table " $ shows groupCatalogueTableName "."+	 )+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag	= "groupCatalogue"++-- | The complete set of 'Data.Group.Profile', indexed by 'Data.Group.Id'.+type GroupCatalogue timeslotId locationId	= Data.Resource.ResourceMap Data.Group.Id (Data.Group.Profile timeslotId locationId)++-- | A map indexed by a /group/-id, of /resource-id/s.+type ResourceIdsByGroupId resourceId	= Data.Map.Map Data.Group.Id (Data.Set.Set resourceId)++-- | Extracts the set of distinct 'locationId's, from the /group-catalogue/.+extractDistinctMeetingLocationIds :: Ord locationId => GroupCatalogue timeslotId locationId -> Data.Location.Locus locationId+extractDistinctMeetingLocationIds	= Data.Map.foldr (\profile locus -> Data.Maybe.maybe locus (`Data.Set.insert` locus) $ Data.Group.getMaybeLocationId profile) Data.Set.empty++-- | Gather the set of /meeting-time/s corresponding to the specified set of /group/s.+getMeetingTimes :: Ord timeslotId => GroupCatalogue timeslotId locationId -> Data.Group.Membership -> Temporal.Time.TimeSet timeslotId+getMeetingTimes groupCatalogue	= Data.Set.foldr (Data.Set.union . Data.Group.getMeetingTimes . (groupCatalogue !)) Data.Set.empty+
+ src-lib/WeekDaze/Aggregate/LocationCatalogue.hs view
@@ -0,0 +1,185 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the names & attributes of all /location/s available to be booked in the /timetable/.++-}++module WeekDaze.Aggregate.LocationCatalogue(+-- * Types+-- ** Type-synonyms+	LocationCatalogue,+-- * Constants+	tag,+-- * Functions+	countDaysByFacilityName,+--	countDistinctCampuses,+	extractDistinctFacilityNames,+	findSuitableLocations,+-- ** Accessors+	getLocationIds,+#ifdef USE_HDBC+-- ** Constructor+	fromDatabase,+#endif+-- ** Predicates+	hasAnyFacilities,+	isSingleCampus+) where++import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Set+import qualified	WeekDaze.Data.Location		as Data.Location+import qualified	WeekDaze.Data.Resource		as Data.Resource+import qualified	WeekDaze.Size			as Size++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Default+import qualified	Data.IntMap+import qualified	Data.Maybe+import qualified	WeekDaze.Database.Selector	as Database.Selector+import qualified	WeekDaze.Temporal.Availability	as Temporal.Availability++{- |+	* Construct from the specified database-connection.++	* CAVEAT: though the database may not permit a null value for many fields (applying its own default value when the value is unspecified),+	default values are applied here should the SQL-query return one.+-}+fromDatabase :: (+	Database.HDBC.IConnection		connection,+	Data.Convertible.Convertible		Database.HDBC.SqlValue campus,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue locationId,	-- Flexible context.+	Data.Default.Default			campus,+	Ord					locationId,+	Show					campus+ )+	=> connection			-- ^ An abstract database-connection.+	-> Database.HDBC.SqlValue	-- ^ The project-id.+	-> IO (LocationCatalogue locationId campus)+fromDatabase connection	projectIdSql	= let+	locationCatalogueIdColumnName :: Database.Selector.ColumnName+	locationCatalogueIdColumnName	= showString tag "Id";++	facilityTableName, locationCatalogueTableName :: Database.Selector.TableName+	facilityTableName		= showString Database.Selector.tablePrefix "facility"+	locationCatalogueTableName	= showString Database.Selector.tablePrefix tag+ in do+	facilityNameByFacilityTypeId			<- Data.Location.findFacilityNameByFacilityTypeId connection projectIdSql++#ifdef USE_HDBC_ODBC+	selectFacilityTypeIdsForLocationCatalogueId	<- Database.Selector.prepare connection [Data.Location.facilityTypeIdTag] [facilityTableName] [locationCatalogueIdColumnName]	-- Select the facilityTypeIds at a locationId to be defined. CAVEAT: prepared statements don't seem to work reliably with HDBC-mysql.+#endif+	Database.Selector.select connection [+		locationCatalogueIdColumnName,+		Database.Selector.locationIdColumnName,+		Temporal.Availability.tag,+		Data.Location.capacityTag,+		Database.Selector.campusColumnName+	 ] [locationCatalogueTableName] [(Database.Selector.projectIdColumnName, projectIdSql)] >>= fmap Data.Map.fromList . mapM (+		\locationRow -> case locationRow of+			[locationCatalogueIdSql, locationIdSql, availabilitySql, capacitySql, campusSql]	-> do+				facilityNames	<- map (+					\locationCatalogueRow -> case locationCatalogueRow of+						[facilityTypeIdSql]	-> let+							facilityTypeId	= Data.Maybe.fromMaybe (+								error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tnull " $ shows Data.Location.facilityTypeIdTag "."+							 ) . either (+								error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tfailed to parse the value for " . shows Data.Location.facilityTypeIdTag . showString " read from the database; " . show+							 ) id $ Database.HDBC.safeFromSql facilityTypeIdSql+						 in Data.Maybe.fromMaybe (+							error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tunknown " . showString Data.Location.facilityTypeIdTag . showChar '=' $ shows facilityTypeId "."+						 ) $ Data.IntMap.lookup facilityTypeId facilityNameByFacilityTypeId+						_			-> error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tunexpected number of columns=" . shows (length locationCatalogueRow) . showString" in row of table " $ shows facilityTableName "."+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectFacilityTypeIdsForLocationCatalogueId [locationCatalogueIdSql] >> Database.HDBC.fetchAllRows' selectFacilityTypeIdsForLocationCatalogueId+				 )+#else+				 ) `fmap` Database.Selector.select connection [Data.Location.facilityTypeIdTag] [facilityTableName] [(locationCatalogueIdColumnName, locationCatalogueIdSql)]	-- Select the facilityTypeIds at this locationId.+#endif+				return {-to IO-monad-} (+					Data.Maybe.fromMaybe (+						error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tnull " $ shows Database.Selector.locationIdColumnName "."+					) $ Database.HDBC.fromSql locationIdSql,+					Data.Location.mkProfile (+						Data.Maybe.fromMaybe (+							error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tnull " $ shows Data.Location.capacityTag "."+						) . either (+							error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tfailed to parse the value for " . shows Data.Location.capacityTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql capacitySql+					) (+						Data.Set.fromList facilityNames+					) (+						Data.Maybe.fromMaybe Data.Default.def $ Database.HDBC.fromSql availabilitySql+					) . Data.Maybe.fromMaybe Data.Default.def $ Database.HDBC.fromSql campusSql+				 ) -- Pair.+			_											-> error . showString "WeekDaze.Aggregate.LocationCatalogue.fromDatabase:\tunexpected number of columns=" . shows (length locationRow) . showString " in row of table " $ shows locationCatalogueTableName "."+	 )+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag	= "locationCatalogue"++-- | The complete set of /location/s, indexed by their 'locationId'.+type LocationCatalogue locationId campus	= Data.Resource.ResourceMap locationId (Data.Location.Profile campus)++-- | Accessor.+getLocationIds :: LocationCatalogue locationId campus -> [locationId]+getLocationIds	= Data.Map.keys++-- | Count the total available /day/s, of those /location/s offering each type of /facility/.+countDaysByFacilityName :: LocationCatalogue locationId campus -> Data.Map.Map Data.Location.FacilityName Size.NDays+countDaysByFacilityName	= Data.Map.foldr (+	\profile m	-> Data.Set.foldr (+		\facilityName -> Data.Map.insertWith (+) facilityName (Data.Resource.countDaysPerWeekAvailable profile)+	) m $ Data.Location.getFacilityNames profile+ ) Data.Map.empty++-- | Count the number of distinct /campus/es which have been configured.+countDistinctCampuses :: Ord campus => LocationCatalogue locationId campus -> Int+countDistinctCampuses	= Data.Set.size . Data.Foldable.foldr (Data.Set.insert . Data.Location.getCampus) Data.Set.empty++-- | Whether all /location/s exist on the same /campus/.+isSingleCampus :: Ord campus => LocationCatalogue locationId campus -> Bool+isSingleCampus	= (== 1) . countDistinctCampuses++-- | Extracts the set of distinct /facilities/, from the catalogue.+extractDistinctFacilityNames :: LocationCatalogue locationId campus -> Data.Location.FacilityNames+extractDistinctFacilityNames	= Data.Map.foldr (Data.Set.union . Data.Location.getFacilityNames) Data.Set.empty++-- | Find those /locations/ which meet or exceed, the specified criteria.+findSuitableLocations+	:: Size.NStudents+	-> Data.Location.FacilityNames+	-> LocationCatalogue locationId campus+	-> LocationCatalogue locationId campus+findSuitableLocations requiredCapacity requiredFacilityNames	= Data.Map.filter (Data.Location.isSuitable requiredCapacity requiredFacilityNames)++-- | True if any /location/ offers any /facilities/.+hasAnyFacilities :: LocationCatalogue locationId campus -> Bool+hasAnyFacilities	= Data.Foldable.any Data.Location.hasFacilities+
+ src-lib/WeekDaze/Aggregate/StudentBody.hs view
@@ -0,0 +1,156 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Individual /students/ can be grouped into a /body/ composed from those with identical /profiles/.++	* This reduces the number of personal timetables that must ultimately be constructed.++	* This is a relationship persists for the duration of a configuration-file, & in this respect differs from a /class/ of /student/s,+	which is a transient relationship formed for the duration of a single booking in the timetable, or perhaps for the bookings in a single /course/.++ [@TODO@]++	* The requirement to specify all the /student-Ids/, could be replaced with merely an anonymous head-count,+	since the application make very little use of this data.+-}++module WeekDaze.Aggregate.StudentBody(+-- * Types+-- ** Type-synonyms+	Mnemonic,+--	Members,+	StudentBody(+--		MkStudentBody,+		getMnemonic,+		getStudentIds+	),+-- * Constants+--	tag,+	mnemonicTag,+--	studentTag,+	studentIdTag,+-- * Functions+	getSize,+	toPair,+-- ** Constructor+	mkStudentBody+) where++import qualified	Control.Arrow+import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.List+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<), (!))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Data.Student		as Data.Student+import qualified	WeekDaze.Size			as Size++-- | Used to qualify CSS & XML.+tag :: String+tag		= "studentBody"++-- | Used to qualify SQL & XML.+mnemonicTag :: String+mnemonicTag	= "mnemonic"++-- | Used to qualify XML.+studentTag :: String+studentTag	= "student"++-- | Used to qualify SQL & XML.+studentIdTag :: String+studentIdTag	= "studentId"++-- | The type of the mnemonic by which a /student-body/ is known.+type Mnemonic	= String++-- | The type the member-/student/s.+type Members	= Data.Set.Set Data.Student.Id++{- |+	* A group of /student/s with identical /profile/s; i.e. with identical requirements.++	* Because this data-type forms part of the results for the application, & can become excessively verbose, a concise /mnemonic/ is provided.+-}+data StudentBody	= MkStudentBody {+	getMnemonic	:: Mnemonic,	-- ^ A mnemonic for the whole /student-body/; e.g. "2/B" or "Remedial".+	getStudentIds	:: Members	-- ^ The identifiers of the member-/student/s.+}++-- 'compare' is a performance-hotspot, & therefore has a specialised implementation.+instance Ord StudentBody where+	MkStudentBody mnemonicL _ `compare` MkStudentBody mnemonicR _	= mnemonicL `compare` mnemonicR++-- CAVEAT: because of the specialised 'Ord'-implementation, a compatible specialised 'Eq'-implementation is required; otherwise two unequal StudentBodies may be neither '<' nor '>'.+instance Eq StudentBody where+	MkStudentBody mnemonicL _ == MkStudentBody mnemonicR _	= mnemonicL == mnemonicR++instance Read StudentBody where+	readsPrec _	= map (Control.Arrow.first $ uncurry mkStudentBody . Control.Arrow.second Data.Set.fromList) . reads++-- This instance-declaration hides the internal structure.+instance Show StudentBody where+	showsPrec _	= shows . Control.Arrow.second Data.Set.toList . toPair++instance Text.XHtml.Strict.HTML StudentBody where+	toHtml studentBody	= Text.XHtml.Strict.thespan ! [+		Text.XHtml.Strict.theclass tag,+		Text.XHtml.Strict.title . Data.List.intercalate ", " . map show {-display double-quotes-} . Data.Set.toList $ getStudentIds studentBody+	 ] << getMnemonic studentBody++instance ToolShed.SelfValidate.SelfValidator StudentBody where+	getErrors studentBody	= ToolShed.SelfValidate.extractErrors [+		(null $ getMnemonic studentBody,		"null mnemonic for student-ids; " ++ show (getStudentIds studentBody)),+		(Data.Set.null $ getStudentIds studentBody,	"zero student-ids are members of the student-body of mnemonic " ++ show (getMnemonic studentBody))+	 ]++instance HXT.XmlPickler StudentBody where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry mkStudentBody . Control.Arrow.second Data.Set.fromList,	-- Construct from a Pair.+		Control.Arrow.second Data.Set.toList . toPair			-- Deconstruct to a Pair.+	 ) $ HXT.xpTextAttr mnemonicTag {-can't be null-} `HXT.xpPair` (+		HXT.xpList1 {-can't be null-} . HXT.xpElem studentTag $ HXT.xpTextAttr studentIdTag {-can't be null-}+	 )++instance Control.DeepSeq.NFData StudentBody where+	rnf	= Control.DeepSeq.rnf . toPair++-- | Smart constructor.+mkStudentBody :: Mnemonic -> Members -> StudentBody+mkStudentBody mnemonic students+	| ToolShed.SelfValidate.isValid studentBody	= studentBody+	| otherwise					= error $ "WeekDaze.Aggregate.StudentBody.mkStudentBody:\t" ++ ToolShed.SelfValidate.getFirstError studentBody ++ "."+	where+		studentBody	= MkStudentBody	mnemonic students++-- | Deconstruct.+toPair :: StudentBody -> (Mnemonic, Members)+toPair	= getMnemonic &&& getStudentIds++-- | The number of /student/s in the body.+getSize :: StudentBody -> Size.NStudents+getSize	= Data.Set.size . getStudentIds+
+ src-lib/WeekDaze/Aggregate/StudentBodyRegister.hs view
@@ -0,0 +1,316 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Provides a catalogue of /student-profile/s, indexed by the /student-body/ by whom it's shared.+-}++module WeekDaze.Aggregate.StudentBodyRegister(+-- * Types+-- ** Type-synonyms+	StudentBodyRegister,+	KnowledgeByStudentBody,+-- * Constants+	tag,+-- * Functions+	countAvailableStudentDays,+	countSubjectsRequired,+	extractDistinctSubjects,+	reduce,+	reduce',+-- ** Accessors+	getStudentBodies,+#ifdef USE_HDBC+-- ** Constructor+	fromDatabase,+#endif+-- ** Predicates+	hasAnyFreePeriodPreference,+	hasAnyCoreKnowledgeRequirements,+	hasAnyOptionalKnowledgeRequirements+) where++import			Control.Arrow((&&&))+import qualified	Control.Monad.Writer+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Set+import qualified	WeekDaze.Aggregate.StudentBody		as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Data.HumanResource		as Data.HumanResource+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Data.Student			as Data.Student+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Size				as Size++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Default+import qualified	Data.IntMap+import qualified	Data.Maybe+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector		as Database.Selector+import qualified	WeekDaze.Data.Group			as Data.Group+import qualified	WeekDaze.Data.Requirements		as Data.Requirements+import qualified	WeekDaze.Temporal.Availability		as Temporal.Availability+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference++-- | Construct from the specified database-connection.+fromDatabase :: (+	Database.HDBC.IConnection		connection,+	Data.Convertible.Convertible		Database.HDBC.SqlValue level,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue stream,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue teachingRatio,	-- Flexible context.+	Data.Default.Default			stream,+	Data.Typeable.Typeable			teachingRatio,+	Ord					level,+	RealFrac				teachingRatio,+	Show					level+ )+	=> connection			-- ^ An abstract database-connection.+	-> Database.HDBC.SqlValue	-- ^ The project-id.+	-> IO (StudentBodyRegister level stream teachingRatio)+fromDatabase connection	projectIdSql	= let+	priorityColumnName, streamIdColumnName, streamNameColumnName, studentBodyRegisterIdColumnName :: Database.Selector.ColumnName+	priorityColumnName		= "priority"+	streamIdColumnName		= "streamId"+	streamNameColumnName		= "streamName"	-- CAVEAT: known merely as 'stream' in Data.Student & the DTD.+	studentBodyRegisterIdColumnName	= showString tag "Id";++	knowledgeRequirementsTableName, streamTableName, studentBodyRegisterTableName, studentBodyMembershipTableName, studentGroupMembershipTableName :: Database.Selector.TableName+	[knowledgeRequirementsTableName, streamTableName, studentBodyRegisterTableName, studentBodyMembershipTableName, studentGroupMembershipTableName]	= map (showString Database.Selector.tablePrefix) ["knowledgeRequirement", "stream", tag, "studentBodyMembership", "studentGroupMembership"]+ in do+	streamNameByStreamId	<- (+		Data.IntMap.fromList . map (+			\row -> case row of+				[streamIdSql, streamNameSql]	-> (+					either (+						error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tfailed to parse the value for " . shows streamIdColumnName . showString " read from the database; " . show+					 ) id $ Database.HDBC.safeFromSql streamIdSql,+					Database.HDBC.fromSql streamNameSql+				 ) -- Pair.+				_				-> error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tunexpected number of columns=" . shows (length row) . showString " in row of table " $ shows streamTableName "."+		)+	 ) `fmap` Database.Selector.select connection [streamIdColumnName, streamNameColumnName] [streamTableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++#ifdef USE_HDBC_ODBC+	[+		selectStudentIdsForStudentBodyRegisterId,+		selectKnowledgeRequirementsForStudentBodyRegisterId,+		selectGroupIdsForStudentBodyRegisterId+	 ] <- mapM (+		\(columnNames, tableName)	-> Database.Selector.prepare connection columnNames [tableName] [studentBodyRegisterIdColumnName]+	 ) [+		(+			[Aggregate.StudentBody.studentIdTag],+			studentBodyMembershipTableName+		), (+			[+				priorityColumnName,+				Data.Subject.topicTag,+				Data.Subject.levelTag+			],+			knowledgeRequirementsTableName+		), (+			[Data.Group.groupIdTag],+			studentGroupMembershipTableName+		)+	 ] -- Prepare statements for execution with each studentBodyRegisterId.+#endif /* USE_HDBC_ODBC */+	Database.Selector.select connection [+		studentBodyRegisterIdColumnName,+		Aggregate.StudentBody.mnemonicTag,+		Temporal.Availability.tag,+		streamIdColumnName,+		Data.Student.teachingRatioTag,+		Temporal.FreePeriodPreference.tag+	 ] [studentBodyRegisterTableName] [(Database.Selector.projectIdColumnName, projectIdSql)] >>= fmap Data.Map.fromList . mapM (+		\studentRow -> case studentRow of+			[studentBodyRegisterIdSql, mnemonicSql, availabilitySql, streamIdSql, teachingRatioSql, freePeriodPreferenceSql]	-> do+#ifndef USE_HDBC_ODBC+				let primaryKey	= [(studentBodyRegisterIdColumnName, studentBodyRegisterIdSql)]+#endif+				studentIds	<- map (+					Database.HDBC.fromSql . head {-select the only column-}+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectStudentIdsForStudentBodyRegisterId [studentBodyRegisterIdSql] >> Database.HDBC.fetchAllRows' selectStudentIdsForStudentBodyRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [Aggregate.StudentBody.studentIdTag] [studentBodyMembershipTableName] primaryKey+#endif+				knowledgeRequirements	<- (+					(+						Data.Maybe.fromMaybe Data.Set.empty . Data.Map.lookup Data.Requirements.coreTag &&& Data.Maybe.fromMaybe Data.Set.empty . Data.Map.lookup Data.Requirements.optionalTag+					) . Data.Map.fromListWith Data.Set.union . map (+						\knowledgeRequirementRow -> case knowledgeRequirementRow of+							[prioritySql, topicSql, levelSql]	-> (+								Data.Maybe.fromMaybe (+									error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tnull " $ shows priorityColumnName "."+								) $ Database.HDBC.fromSql prioritySql,+								Data.Set.singleton $ Data.Subject.mkSubjectFromSql topicSql levelSql+							 ) -- Pair+							_					-> error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tunexpected number of columns=" . shows (length knowledgeRequirementRow) . showString " in row of table " $ shows knowledgeRequirementsTableName "."+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectKnowledgeRequirementsForStudentBodyRegisterId [studentBodyRegisterIdSql] >> Database.HDBC.fetchAllRows' selectKnowledgeRequirementsForStudentBodyRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [+					priorityColumnName,+					Data.Subject.topicTag,+					Data.Subject.levelTag+				 ] [knowledgeRequirementsTableName] primaryKey+#endif++				groupMembership		<- (+					Data.Set.fromList . map (+						either (+							error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tfailed to parse the value for " . shows Data.Group.groupIdTag . showString " read from the database; " . show+						) id . Database.HDBC.safeFromSql . head {-select the only column-}+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectGroupIdsForStudentBodyRegisterId [studentBodyRegisterIdSql] >> Database.HDBC.fetchAllRows' selectGroupIdsForStudentBodyRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [Data.Group.groupIdTag] [studentGroupMembershipTableName] primaryKey+#endif+				return {-to IO-monad-} (+					Aggregate.StudentBody.mkStudentBody (+						either (+							error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tfailed to parse the value for " . shows Aggregate.StudentBody.mnemonicTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql mnemonicSql+					) . Data.Set.fromList $ map (+						Data.Maybe.fromMaybe (+							error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tnull " $ shows Aggregate.StudentBody.studentIdTag "."+						)+					) studentIds,+					Data.Student.mkProfile (+						Data.Maybe.maybe Data.Default.def (+							Data.Maybe.fromMaybe (+								error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tfailed to find a " . shows streamNameColumnName . showString " corresponding to the value for " $ shows streamIdColumnName " read from the database."+							) . (+								`Data.IntMap.lookup` streamNameByStreamId+							)+						) . either (+							error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tfailed to parse the value for " . shows streamIdColumnName . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql streamIdSql+					) knowledgeRequirements (+						Data.Maybe.fromMaybe (+							error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tnull " $ shows Temporal.Availability.tag "."+						) $ Database.HDBC.fromSql availabilitySql+					) (+						Database.Selector.fromSqlFractional Data.Student.defaultTeachingRatio teachingRatioSql+					) groupMembership $ Database.HDBC.fromSql freePeriodPreferenceSql	-- Returns Nothing for SqlNull.+				 ) -- Pair.+			_ -> error . showString "WeekDaze.Aggregate.StudentBodyRegister.fromDatabase:\tunexpected number of columns=" . shows (length studentRow) . showString" in row of table " $ shows studentBodyRegisterTableName "."+	 )+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag		= "studentBodyRegister"++-- | A map indexed by /student-body/, of /profile/s shared amongst /student/s in the /body/.+type StudentBodyRegister level stream teachingRatio	= Data.Resource.ResourceMap Aggregate.StudentBody.StudentBody (Data.Student.Profile level stream teachingRatio)++-- | Accessor.+getStudentBodies :: StudentBodyRegister level stream teachingRatio -> [Aggregate.StudentBody.StudentBody]+getStudentBodies	= Data.Map.keys++-- | Extracts the set of distinct /subjects/ required, gathered from all /students/.+extractDistinctSubjects :: Ord level => StudentBodyRegister level stream teachingRatio -> Data.Subject.Knowledge level+extractDistinctSubjects	= Data.Map.foldr (Data.Set.union . Data.Student.deriveAmalgamatedKnowledgeRequirement) Data.Set.empty++{- |+	* Merges those /student-bodies/ whose /profile/s are identical, into a single larger /student-body/.++	* Writes the lists of merged /student-bodies/.++	* Checks that any new /mnemonic/s, composed from those of /student-bodies/ with identical profiles, differ from existing ones.+	This shouldn't matter, because the key of 'StudentBodyRegister' is the whole /student-body/ not just the /mnemonic/,+	regrettably, for efficiency, /StudentBody/ implements 'Eq' & 'Ord' using only the /mnemonic/.+-}+reduce :: (+	Ord	level,+	Ord	stream,+	Ord	teachingRatio+ )+	=> Aggregate.StudentClass.MnemonicSeparator+	-> StudentBodyRegister level stream teachingRatio+	-> Control.Monad.Writer.Writer [[Aggregate.StudentBody.StudentBody]] (StudentBodyRegister level stream teachingRatio)+reduce mnemonicSeparator studentBodyRegister+	| null ambiguousMnemonics	= Control.Monad.Writer.writer (studentBodyRegister', mergeableStudentBodies)+	| otherwise			= error . showString "WeekDaze.Aggregate.StudentBodyRegister.reduce:\tsome of the mnemonics composed by merging those of student-bodies with identical profiles, are ambiguous; " $ shows ambiguousMnemonics "."+	where+		(studentBodyRegister', (ambiguousMnemonics, mergeableStudentBodies))	= (+			Data.Map.fromList . map (+				\(sharedStudentProfile, studentClass)	-> (Aggregate.StudentClass.merge mnemonicSeparator studentClass, sharedStudentProfile)	-- Reverse the mapping back to the original.+			) . Data.Map.toList &&& (+				Data.Set.toList . Data.Set.intersection (+					Data.Set.map Aggregate.StudentBody.getMnemonic $ Data.Map.keysSet studentBodyRegister+				) . Data.Set.fromList . map (+					Aggregate.StudentBody.getMnemonic . Aggregate.StudentClass.merge mnemonicSeparator+				) &&& map Data.Set.toList+			) . filter (+				(/= 1) . Data.Set.size	-- Select student-bodies that can be merged.+			) . Data.Map.elems+		 ) . Data.Map.fromListWith Data.Set.union . map (+			\(studentBody, studentProfile)	-> (studentProfile, Data.Set.singleton studentBody)	-- Reverse the mapping.+		 ) $ Data.Map.toList studentBodyRegister++-- | Merges those /student-bodies/ whose /profile/s are identical, into a single larger /student-body/.+reduce' :: (+	Ord	level,+	Ord	stream,+	Ord	teachingRatio+ )+	=> Aggregate.StudentClass.MnemonicSeparator+	-> StudentBodyRegister level stream teachingRatio+	-> StudentBodyRegister level stream teachingRatio+reduce' s	= fst {-StudentBodyRegister-} . Control.Monad.Writer.runWriter . reduce s++-- | The sum of the number of /day/s worked by each /student/.+countAvailableStudentDays :: StudentBodyRegister level stream teachingRatio -> Size.NDays+countAvailableStudentDays	= Data.Map.foldrWithKey (\studentBody -> (+) . (* Aggregate.StudentBody.getSize studentBody) . Data.Resource.countDaysPerWeekAvailable) 0++-- | /Knowlege-requirement/, indexed by /student-body/.+type KnowledgeByStudentBody level	= Data.Map.Map Aggregate.StudentBody.StudentBody (Data.Subject.Knowledge level)++-- | Count the total number of /subject/s required by all /student/s.+countSubjectsRequired :: KnowledgeByStudentBody level -> Int+countSubjectsRequired	= Data.Map.foldrWithKey (\studentBody -> (+) . (* Aggregate.StudentBody.getSize studentBody) . Data.Set.size) 0++-- | True if any /student-body/ has specified a free-period preference.+hasAnyFreePeriodPreference :: RealFrac teachingRatio => StudentBodyRegister level stream teachingRatio -> Bool+hasAnyFreePeriodPreference	= Data.Foldable.any Data.HumanResource.hasFreePeriodPreference++-- | True if any /student-body/ has specified a core /subject/ in their knowledge-requirements.+hasAnyCoreKnowledgeRequirements :: StudentBodyRegister level stream teachingRatio -> Bool+hasAnyCoreKnowledgeRequirements	= Data.Foldable.any Data.Student.hasAnyCoreKnowledgeRequirements++-- | True if any /student-body/ has specified an optional /subject/ in their knowledge-requirements.+hasAnyOptionalKnowledgeRequirements :: StudentBodyRegister level stream teachingRatio -> Bool+hasAnyOptionalKnowledgeRequirements	= Data.Foldable.any Data.Student.hasAnyOptionalKnowledgeRequirements+
+ src-lib/WeekDaze/Aggregate/StudentClass.hs view
@@ -0,0 +1,96 @@+{-+	Copyright (C) 2013-2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* This is a group of /student-bodies/, merged for the duration of a single booking in the timetable, or the bookings required for a single /course/.++	* In contrast to a /student-body/, the members of a /student-class/ don't have identical 'Data.Student.Profile's,+	but their requirements are sufficiently similar to permit them to study a /course/ together.++	* Temporarily merging /student-bodies/, better utilises the available /teacher/s & /location/s,+	by increasing the pool of /student/s available to be taught simultaneously.+-}++module WeekDaze.Aggregate.StudentClass(+-- * Types+-- ** Type-synonyms+	StudentClass,+	MnemonicSeparator,+-- * Constants+	tag,+-- * Functions+	merge,+	getSize,+-- ** Translation+	toHtml+) where++import			Control.Arrow((***))+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	WeekDaze.Aggregate.StudentBody	as Aggregate.StudentBody+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++-- | Used to qualify XML & CSS.+tag :: String+tag	= "studentClass"++{- |+	Whilst a /student-body/ represents a group with identical requirements,+	when one or more /student-bodies/ have similar requirements for a single /subject/,+	they can be temporarily merged to form a /class/.+-}+type StudentClass	= Data.Set.Set Aggregate.StudentBody.StudentBody++-- | Used to separate /mnemonic/s, when merging a /student-class/ into a /student-body/.+type MnemonicSeparator	= String++{- |+	* Remove the boundaries separating the groups of /student/s within a class, to form a single /student-body/.++	* The mnemonics for the constituent /student-bodies/ are concatenated to form a composite mnemonic for the new /student-body/.++	* CAVEAT: any /student-Ids/ common to more than one /student-body/ within the /student-class/, will be merged.++	* CAVEAT: a null set, will result in a null mnemonic, which will be rejected by 'Aggregate.StudentBody.mkStudentBody'.+-}+merge :: MnemonicSeparator -> StudentClass -> Aggregate.StudentBody.StudentBody+merge mnemonicSeparator	= uncurry Aggregate.StudentBody.mkStudentBody . (+	Data.List.intercalate mnemonicSeparator *** Data.Set.unions {-members-}+ ) . unzip . map Aggregate.StudentBody.toPair . Data.Set.toList++{- |+	* Counts the number of /student/s in a class.++	* CAVEAT: assumes that the /student-bodies/, from which the class is composed, are distinct.+-}+getSize :: Data.Foldable.Foldable foldable => foldable Aggregate.StudentBody.StudentBody -> Size.NStudents+getSize	= Data.Foldable.foldr ((+) . Aggregate.StudentBody.getSize) 0++-- | Convert to XHTML.+toHtml :: StudentClass -> Text.XHtml.Strict.Html+toHtml	= (Text.XHTML.mkXHTMLSpan tag <<) . Data.List.intersperse (Text.XHtml.Strict.stringToHtml ", ") . map Text.XHtml.Strict.toHtml . Data.Set.toList+
+ src-lib/WeekDaze/Aggregate/TeacherRegister.hs view
@@ -0,0 +1,550 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes all the /teacher/s available to be booked in the timetable, in terms of their name & their attributes.+-}++module WeekDaze.Aggregate.TeacherRegister(+-- * Types+-- ** Type-synonyms+	TeacherRegister,+	CoursesByTeacherId,+	CoursesByTeacherIdBySynchronisationId,+	NTimeslotsByTeacherIdBySubject,+-- * Constants+	tag,+-- * Functions+	calculateWorkloadBoundsBySubject,+	countAvailableTeacherDays,+	extractDistinctCourses,+	extractDistinctOwnLocationIds,+	extractDistinctSubjects,+--	extractDistinctRequiredFacilityNames,+	findSuitableCourseByTeacherId,+	findCoursesByTeacherIdBySynchronisationId,+	findDistinctCoursesBySynchronisationId,+	findSpecifiedTimes,+	findSubjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek,+	mergeConstraintsOnSynchronisedCourses,+	countLessonsPerWeekByFacilityName,+-- ** Accessors+	getTeacherIds,+	getTeacherProfiles,+#ifdef USE_HDBC+-- ** Constructor+	fromDatabase,+#endif+-- ** Predicates+	hasAnyFreePeriodPreference,+	hasAnySynchronisedCourses,+	hasAnyIdealTimeslotRequests,+	hasAnyCourseMaximumClassSizes,+	hasAnySpecificTimeRequests,+	hasAnyTimeslotRequests,+	hasAnySpecialists,+	isInhabited+) where++import qualified	Control.Arrow+import			Control.Arrow((&&&), (***))+import qualified	Data.Foldable+import qualified	Data.Map+import			Data.Map((!))+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.HumanResource		as Data.HumanResource+import qualified	WeekDaze.Data.Location			as Data.Location+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Data.Teacher			as Data.Teacher+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest	as Temporal.TimeslotRequest+import qualified	WeekDaze.Temporal.Workload		as Temporal.Workload++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.IntMap+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector		as Database.Selector+import qualified	WeekDaze.Data.Group			as Data.Group+import qualified	WeekDaze.Temporal.Availability		as Temporal.Availability+import qualified	WeekDaze.Temporal.Day			as Temporal.Day+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference++{- |+	* Construct from the specified database-connection.++	* CAVEAT: though the database may not permit a null value for many fields (applying its own default value when the value is unspecified),+	default values are applied here should the SQL-query return one.+-}+fromDatabase :: (+	Database.HDBC.IConnection	connection,+	Data.Convertible.Convertible	Database.HDBC.SqlValue level,			-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue locationId,		-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue synchronisationId,	-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue teacherId,		-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue teachingRatio,		-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue timeslotId,		-- Flexible context.+	Data.Typeable.Typeable		teachingRatio,+	Ord				level,+	Ord				synchronisationId,+	Ord				teacherId,+	Ord				timeslotId,+	RealFrac			teachingRatio,+	Show				level,+	Show				synchronisationId,+	Show				timeslotId+ )+	=> connection			-- ^ An abstract database-connection.+	-> Database.HDBC.SqlValue	-- ^ The project-id.+	-> IO (TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio)+fromDatabase connection	projectIdSql	= let+	idealTimeslotRequestColumnName, teacherRegisterIdColumnName :: Database.Selector.ColumnName+	idealTimeslotRequestColumnName	= "idealTimeslotRequest"+	teacherRegisterIdColumnName	= showString tag "Id";++	requiredFacilityTableName, serviceTableName, specialtyTopicTableName, specificTimeRequestsTableName, teacherGroupMembershipTableName, teacherRegisterTableName :: Database.Selector.TableName+	[requiredFacilityTableName, serviceTableName, specialtyTopicTableName, specificTimeRequestsTableName, teacherGroupMembershipTableName, teacherRegisterTableName]	= map (showString Database.Selector.tablePrefix) ["requiredFacility", Data.Teacher.serviceTag, Data.Teacher.specialtyTopicTag, "specificTimeRequest", "teacherGroupMembership", tag]+ in do+	facilityNameByFacilityTypeId	<- Data.Location.findFacilityNameByFacilityTypeId connection projectIdSql++#ifdef USE_HDBC_ODBC+	[+		selectRequiredFacilitiesForTeacherRegisterId,+		selectSpecificTimeRequestsForTeacherRegisterId,+		selectServiceForTeacherRegisterId,+		selectGroupIdsForTeacherRegisterId,+		selectSpecialtyTopicForTeacherRegisterId+	 ] <- mapM (+		\(columnNames, tableName)	-> Database.Selector.prepare connection columnNames [tableName] [teacherRegisterIdColumnName]+	 ) [+		(+			[+				Data.Subject.topicTag,+				Data.Subject.levelTag,+				Data.Location.facilityTypeIdTag+			],+			requiredFacilityTableName+		), (+			[+				Data.Subject.topicTag,+				Data.Subject.levelTag,+				Temporal.Day.tag,+				Database.Selector.timeslotIdColumnName+			],+			specificTimeRequestsTableName+		), (+			[+				Data.Subject.topicTag,+				Data.Subject.levelTag,+				Data.Course.requiredLessonsPerWeekTag,+				Data.Course.minimumConsecutiveLessonsTag,+				Data.Course.maximumClassSizeTag,+				Database.Selector.synchronisationIdColumnName,+				idealTimeslotRequestColumnName+			],+			serviceTableName+		), (+			[Data.Group.groupIdTag],+			teacherGroupMembershipTableName+		), (+			[Data.Subject.topicTag],+			specialtyTopicTableName+		)+	 ] -- Prepare statements for execution with each teacherRegisterId.+#endif /* USE_HDBC_ODBC */+	Database.Selector.select connection [+		teacherRegisterIdColumnName,+		Database.Selector.teacherIdColumnName,+		Temporal.Availability.tag,+		Database.Selector.locationIdColumnName,+		Data.Teacher.maximumTeachingRatioTag,+		Temporal.FreePeriodPreference.tag+	 ] [teacherRegisterTableName] [(Database.Selector.projectIdColumnName, projectIdSql)] >>= fmap Data.Map.fromList . mapM (+		\teacherRow -> case teacherRow of+			[+				teacherRegisterIdSql,+				teacherIdSql,+				availabilitySql,+				locationIdSql,+				maximumTeachingRatioSql,+				freePeriodPreferenceSql+			 ] -> do+#ifndef USE_HDBC_ODBC+				let primaryKey	= [(teacherRegisterIdColumnName, teacherRegisterIdSql)]+#endif+				requiredFacilityNamesBySubject	<- (+					Data.Map.fromListWith Data.Set.union . map (+						\requiredFacilityRow -> case requiredFacilityRow of+							[topicSql, levelSql, facilityTypeIdSql]	-> let+								facilityTypeId	= Data.Maybe.fromMaybe (+									error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tnull " $ shows Data.Location.facilityTypeIdTag "."+								 ) . either (+									error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tfailed to parse the value for " . shows Data.Location.facilityTypeIdTag . showString " read from the database; " . show+								 ) id $ Database.HDBC.safeFromSql facilityTypeIdSql+							 in (+								(,) (Data.Subject.mkSubjectFromSql topicSql levelSql) . Data.Set.singleton+							 ) . Data.Maybe.fromMaybe (+								error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tunknown " . showString Data.Location.facilityTypeIdTag . showChar '=' $ shows facilityTypeId "."+							 ) $ Data.IntMap.lookup facilityTypeId facilityNameByFacilityTypeId+							_					-> error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tunexpected number of columns=" . shows (length requiredFacilityRow) . showString " in row of table " $ shows requiredFacilityTableName "."+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectRequiredFacilitiesForTeacherRegisterId [teacherRegisterIdSql] >> Database.HDBC.fetchAllRows' selectRequiredFacilitiesForTeacherRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [+					Data.Subject.topicTag,+					Data.Subject.levelTag,+					Data.Location.facilityTypeIdTag+				 ] [requiredFacilityTableName] primaryKey+#endif+				specificTimeRequestsBySubject	<- (+					Data.Map.fromListWith Data.Set.union . map (+						\specificTimeRow -> case specificTimeRow of+							[topic, level, day, timeslotId]	-> (+								Data.Subject.mkSubjectFromSql topic level,+								Data.Set.singleton $ Temporal.Time.mkTimeFromSql day timeslotId+							 ) -- Pair+							_				-> error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tunexpected number of columns=" . shows (length specificTimeRow) . showString " in row of table " $ shows specificTimeRequestsTableName "."+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectSpecificTimeRequestsForTeacherRegisterId [teacherRegisterIdSql] >> Database.HDBC.fetchAllRows' selectSpecificTimeRequestsForTeacherRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [+					Data.Subject.topicTag,+					Data.Subject.levelTag,+					Temporal.Day.tag,+					Database.Selector.timeslotIdColumnName+				 ] [specificTimeRequestsTableName] primaryKey+#endif+				service	<- (+					Data.Set.fromList . map (+						\courseRow -> case courseRow of+							[topicSql, levelSql, requiredLessonsPerWeekSql, minimumConsecutiveLessonsSql, maximumClassSizeSql, synchronisationIdSql, idealTimeslotRequestSql]	-> let+								subject	= Data.Subject.mkSubjectFromSql topicSql levelSql+							 in Data.Course.mkCourse subject (+								Data.Maybe.fromMaybe (+									error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tnull " $ shows Data.Course.requiredLessonsPerWeekTag "."+								) . either (+									error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tfailed to parse the value for " . shows Data.Course.requiredLessonsPerWeekTag . showString " read from the database; " . show+								) id $ Database.HDBC.safeFromSql requiredLessonsPerWeekSql+							 ) (+								Data.Maybe.fromMaybe Data.Set.empty $ Data.Map.lookup subject requiredFacilityNamesBySubject+							 ) (+								Data.Maybe.maybe (+									Temporal.TimeslotRequest.Specifically . Data.Maybe.fromMaybe Data.Set.empty $ Data.Map.lookup subject specificTimeRequestsBySubject+								) Temporal.TimeslotRequest.Ideally $ Database.HDBC.fromSql idealTimeslotRequestSql+							 ) (+								Data.Maybe.fromMaybe Data.Course.defaultMinimumConsecutiveLessons . either (+									error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tfailed to parse the value for " . shows Data.Course.minimumConsecutiveLessonsTag . showString " read from the database; " . show+								) id $ Database.HDBC.safeFromSql minimumConsecutiveLessonsSql+							 ) (+								either (+									error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tfailed to parse the value for " . shows Data.Course.maximumClassSizeTag . showString " read from the database; " . show+								) id $ Database.HDBC.safeFromSql maximumClassSizeSql	-- Returns Nothing for SqlNull.+							 ) $ Database.HDBC.fromSql synchronisationIdSql	-- Returns Nothing for SqlNull.+							_	-> error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tunexpected number of columns=" . shows (length courseRow) . showString " in row of table " $ shows serviceTableName "."+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectServiceForTeacherRegisterId [teacherRegisterIdSql] >> Database.HDBC.fetchAllRows' selectServiceForTeacherRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [+					Data.Subject.topicTag,+					Data.Subject.levelTag,+					Data.Course.requiredLessonsPerWeekTag,+					Data.Course.minimumConsecutiveLessonsTag,+					Data.Course.maximumClassSizeTag,+					Database.Selector.synchronisationIdColumnName,+					idealTimeslotRequestColumnName+				 ] [serviceTableName] primaryKey+#endif+				groupMembership	<- (+					Data.Set.fromList . map (+						Data.Maybe.fromMaybe (+							error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tnull " $ shows Data.Group.groupIdTag "."+						) . Database.HDBC.fromSql . head {-select the only column-}+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectGroupIdsForTeacherRegisterId [teacherRegisterIdSql] >> Database.HDBC.fetchAllRows' selectGroupIdsForTeacherRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [Data.Group.groupIdTag] [teacherGroupMembershipTableName] primaryKey+#endif+				maybeSpecialtyTopic	<- (+					Data.Maybe.listToMaybe . map (+						Database.HDBC.fromSql . head {-select the only column-}+					)+#ifdef USE_HDBC_ODBC+				 ) `fmap` (+					Database.HDBC.execute selectSpecialtyTopicForTeacherRegisterId [teacherRegisterIdSql] >> Database.HDBC.fetchAllRows' selectSpecialtyTopicForTeacherRegisterId+				 )+#else+				 ) `fmap` Database.Selector.select connection [Data.Subject.topicTag] [specialtyTopicTableName] primaryKey+#endif+				return {-to IO-monad-} (+					Data.Maybe.fromMaybe (+						error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tnull " $ shows Database.Selector.teacherIdColumnName "."+					) $ Database.HDBC.fromSql teacherIdSql,+					Data.Teacher.mkProfile service (+						Database.HDBC.fromSql locationIdSql	-- Returns 'Nothing' for SqlNull.+					) (+						Data.Maybe.fromMaybe (+							error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tnull " $ shows Temporal.Availability.tag "."+						) $ Database.HDBC.fromSql availabilitySql+					) (+						Database.Selector.fromSqlFractional (+							error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tnull " $ shows Data.Teacher.maximumTeachingRatioTag "."+						) maximumTeachingRatioSql+					) groupMembership maybeSpecialtyTopic $ Database.HDBC.fromSql freePeriodPreferenceSql	-- Returns Nothing for SqlNull.+				 ) -- Pair.+			_ -> error . showString "WeekDaze.Aggregate.TeacherRegister.fromDatabase:\tunexpected number of columns=" . shows (length teacherRow) . showString " in row of table " $ shows teacherRegisterTableName "."+	 )+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag	= "teacherRegister"++-- | The complete set of 'Data.Teacher.Profile', indexed by 'teacherId'.+type TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio	= Data.Resource.ResourceMap teacherId (Data.Teacher.Profile synchronisationId level timeslotId locationId teachingRatio)++-- | Accessor.+getTeacherIds :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> [teacherId]+getTeacherIds	= Data.Map.keys++-- | Accessor.+getTeacherProfiles :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> [Data.Teacher.Profile synchronisationId level timeslotId locationId teachingRatio]+getTeacherProfiles	= Data.Map.elems++-- | Extracts the set of all 'Data.Course.Course's, from the /teacher-register/.+extractDistinctCourses :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Data.Teacher.Service synchronisationId level timeslotId+extractDistinctCourses	= Data.Map.foldr (Data.Set.union . Data.Teacher.getService) Data.Set.empty++-- | Extracts the set of distinct 'locationId's, from the /teacher-register/.+extractDistinctOwnLocationIds :: Ord locationId => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Data.Location.Locus locationId+extractDistinctOwnLocationIds	= Data.Map.foldr (\profile locus -> Data.Maybe.maybe locus (`Data.Set.insert` locus) $ Data.Teacher.getMaybeOwnLocationId profile) Data.Set.empty++-- | Extracts the set of all 'Data.Subject.Subject's, from the /teacher-register/.+extractDistinctSubjects :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Data.Subject.Knowledge level+extractDistinctSubjects	= Data.Set.map Data.Course.getSubject . extractDistinctCourses++-- | Extracts the set of distinct required 'Data.Location.Facility's, from the /teacher-register/.+extractDistinctRequiredFacilityNames :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Data.Location.FacilityNames+extractDistinctRequiredFacilityNames	= Data.Set.foldr (Data.Set.union . Data.Course.getRequiredFacilityNames) Data.Set.empty . extractDistinctCourses++{- |+	* Determine the total number of /lesson/s required for each /subject/, according to the 'Data.Course.Course's offered.++	* Since each /course/ may be offered by more than one 'teacherId', the actual workload can only be constrained within bounds.+-}+calculateWorkloadBoundsBySubject :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Data.Map.Map (Data.Subject.Subject level) Temporal.Workload.Bounds+calculateWorkloadBoundsBySubject	= Data.Map.map (minimum &&& maximum) . Data.Map.fromListWith (++) . map (Data.Course.getSubject &&& return {-to List-monad-} . Data.Course.getRequiredLessonsPerWeek) . Data.Set.toList . extractDistinctCourses++-- | Find those /teacher/s offering a /course/ in the specified /subject/.+findSuitableCourseByTeacherId+	:: Eq level+	=> Size.NStudents	-- ^ The number of /student/s, who need to be placed.+	-> Data.Subject.Subject level+	-> TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio+	-> Data.Map.Map teacherId (Data.Course.Course synchronisationId level timeslotId)+findSuitableCourseByTeacherId nStudents subject	= Data.Map.mapMaybe (Data.Teacher.lookupSuitableCourse nStudents subject)++-- | The sum of the number of /day/s worked by each /teacher/.+countAvailableTeacherDays :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Size.NDays+countAvailableTeacherDays	= Data.Map.foldr ((+) . Data.Resource.countDaysPerWeekAvailable) 0++{- |+	* The total number of /lesson/s per week, required by all those /course/s requiring each /facility/.++	* CAVEAT: all /course/s are counted, not just those for which there's some demand from /student/s.+-}+countLessonsPerWeekByFacilityName :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Data.Map.Map Data.Location.FacilityName Size.NTimeslots+countLessonsPerWeekByFacilityName	= Data.Map.foldr (+	\profile m	-> Data.Set.foldr (+		\course m'	-> Data.Set.foldr (+			Data.Map.insertWith (+) `flip` Data.Course.getRequiredLessonsPerWeek course+		) m' $ Data.Course.getRequiredFacilityNames course+	) m $ Data.Teacher.getService profile+ ) Data.Map.empty++-- | True if a /teacher/ typically inhabits the specified 'locationId'.+isInhabited :: Eq locationId => locationId -> TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+isInhabited locationId	= Data.Foldable.any (Data.Teacher.inhabits locationId)++-- | A map indexed by /teacherId/, of /course/s.+type CoursesByTeacherId synchronisationId teacherId level timeslotId	= Data.Map.Map teacherId (Data.Course.Course synchronisationId level timeslotId)++-- | A map indexed by /synchronisationId/, of 'CoursesByTeacherId'.+type CoursesByTeacherIdBySynchronisationId synchronisationId teacherId level timeslotId	= Data.Map.Map synchronisationId (CoursesByTeacherId synchronisationId teacherId level timeslotId)++{- |+	* Returns /course/s which reference a /synchronisationId/, indexed by that /synchronisationId/, sub-indexed by the /teacher-Id/ who offers them.++	* CAVEAT: If a /teacher/ erroneously offers two /course/s with the same /synchronisationId/, then the second will overwrite the first.++	* CAVEAT: /course/s are returned irrespective of whether any /student/ requires them.+-}+findCoursesByTeacherIdBySynchronisationId :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	teacherId,+	Ord	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> CoursesByTeacherIdBySynchronisationId synchronisationId teacherId level timeslotId+findCoursesByTeacherIdBySynchronisationId	= Data.Map.foldrWithKey (+	\teacherId -> flip $ Data.Set.foldr (+		uncurry (Data.Map.insertWith Data.Map.union) . Control.Arrow.second (Data.Map.singleton teacherId)+	)+ ) Data.Map.empty . Data.Map.map (+	Data.Set.map (+		Data.Maybe.fromJust . Data.Course.getMaybeSynchronisationId &&& id+	) . Data.Set.filter Data.Course.isSynchronised . Data.Teacher.getService+ )++-- | Returns the set of /course/s corresponding to each /synchronisationId/, irrespective of whether they're required by any /student/.+findDistinctCoursesBySynchronisationId :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => CoursesByTeacherIdBySynchronisationId synchronisationId teacherId level timeslotId -> Data.Map.Map synchronisationId (Data.Set.Set (Data.Course.Course synchronisationId level timeslotId))+findDistinctCoursesBySynchronisationId	= Data.Map.map $ Data.Set.fromList . Data.Map.elems++-- | True if any /teacher/ has specified a /free-period preference/.+hasAnyFreePeriodPreference :: RealFrac teachingRatio => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnyFreePeriodPreference	= Data.Foldable.any Data.HumanResource.hasFreePeriodPreference++-- | True if any /teacher/ has offered a /synchronised course/ in their /service/.+hasAnySynchronisedCourses :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnySynchronisedCourses	= Data.Foldable.any Data.Teacher.offersAnySynchronisedCourse++-- | True if any /teacher/ has requested an /ideal timeslot/ in their /service/.+hasAnyIdealTimeslotRequests :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnyIdealTimeslotRequests	= Data.Foldable.any Data.Teacher.hasAnyIdealTimeslotRequest++-- | True if any /teacher/ has specified a /maximum class-size/ in their /service/.+hasAnyCourseMaximumClassSizes :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnyCourseMaximumClassSizes	= Data.Foldable.any (Data.Maybe.isJust . Data.Course.getMaybeMaximumClassSize) . extractDistinctCourses++-- | True if any /teacher/ has requested a /specific time/ in their /service/.+hasAnySpecificTimeRequests :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnySpecificTimeRequests	= Data.Foldable.any Data.Teacher.hasAnySpecificTimeRequest++-- | True if any /teacher/ has requested a /specific time/ in their /service/.+hasAnyTimeslotRequests :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnyTimeslotRequests	= Data.Foldable.any (uncurry (||) . (Data.Teacher.hasAnyIdealTimeslotRequest &&& Data.Teacher.hasAnySpecificTimeRequest))++-- | True if any /teacher/ has requested an /ideal timeslot/ in their /service/.+hasAnySpecialists :: TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnySpecialists	= Data.Foldable.any Data.Teacher.hasSpecialtyTopic++-- | Find the set of all specified /time/s, for any /course/, offered by any /teacher/.+findSpecifiedTimes :: Ord timeslotId => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> Temporal.Time.TimeSet timeslotId+findSpecifiedTimes	= Data.Map.foldr (Data.Set.union . Data.Teacher.findSpecifiedTimes) Data.Set.empty++-- | The type returned by 'subjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek'.+type NTimeslotsByTeacherIdBySubject level teacherId	= Data.Map.Map (Data.Subject.Subject level) (Data.Map.Map teacherId Size.NTimeslots)++-- | Finds /subject/s offered by more than one /teacher/, but as /course/s requiring different /lesson/s per week.+findSubjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek+	:: (Ord level, Ord teacherId)+	=> TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio+	-> NTimeslotsByTeacherIdBySubject level teacherId+findSubjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek	= Data.Map.filter (+	(> 1) . Data.Set.size . Data.Set.fromList . Data.Map.elems {-lessonsPerWeek-}+ ) . Data.Map.foldrWithKey (+	\teacherId teacherProfile m	-> Data.Set.foldr (+		\course -> uncurry (+			Data.Map.insertWith Data.Map.union+		) (+			Data.Course.getSubject &&& Data.Map.singleton teacherId . Data.Course.getRequiredLessonsPerWeek $ course+		)+	) m $ Data.Teacher.getService teacherProfile+ ) Data.Map.empty++-- | Tightens the constraints on each member of a set of synchronised /course/s, to a level compatible with the requirements of other members.+mergeConstraintsOnSynchronisedCourses :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	teacherId,+	Ord	timeslotId,+	Show	synchronisationId,+	Show	timeslotId+ ) => TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio -> TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio+mergeConstraintsOnSynchronisedCourses teacherRegister	= Data.Map.map (+	\profile -> profile {+		Data.Teacher.getService	= Data.Set.map (+			\course -> Data.Maybe.maybe course (+				\synchronisationId -> let+					distinctCourses	= findDistinctCoursesBySynchronisationId (findCoursesByTeacherIdBySynchronisationId teacherRegister) ! synchronisationId+				in course {+					Data.Course.getMinimumConsecutiveLessons	= Data.Set.findMax $ Data.Set.map Data.Course.getMinimumConsecutiveLessons distinctCourses,+					Data.Course.getTimeslotRequest			= let+						timeslotRequests			= Data.Set.map Data.Course.getTimeslotRequest distinctCourses+						(idealTimeslotIds, specifiedTimes)	= (+							Data.Set.map (Data.Maybe.fromJust . Temporal.TimeslotRequest.getMaybeIdealTimeslotId) *** Data.Set.unions . map Temporal.TimeslotRequest.getSpecifiedTimes . Data.Set.toList+						 ) $ Data.Set.partition Temporal.TimeslotRequest.isIdeally timeslotRequests++						hasZeroIdealTimeslotIds, hasZeroSpecifiedTimes :: Bool+						hasZeroIdealTimeslotIds	= Data.Set.null idealTimeslotIds+						hasZeroSpecifiedTimes	= Data.Set.null specifiedTimes+					in if hasZeroIdealTimeslotIds && hasZeroSpecifiedTimes+						then Data.Course.getTimeslotRequest course	-- Unchanged.+						else if Data.Set.size idealTimeslotIds == 1 && hasZeroSpecifiedTimes+							then Temporal.TimeslotRequest.Ideally $ Data.Set.findMin idealTimeslotIds+							else if hasZeroIdealTimeslotIds && not hasZeroSpecifiedTimes+								then Temporal.TimeslotRequest.Specifically specifiedTimes+								else error . showString "WeekDaze.Aggregate.TeacherRegister.mergeConstraintsOnSynchronisedCourses:\tincompatible TimeslotRequests; " $ shows (synchronisationId, Data.Set.toList timeslotRequests) "."+				}+			 ) $ Data.Course.getMaybeSynchronisationId course+		) $ Data.Teacher.getService profile+	}+ ) teacherRegister+
+ src-lib/WeekDaze/Colour/HTMLColour.hs view
@@ -0,0 +1,102 @@+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@] Exports some colour-composition functions for HTML.+-}++module WeekDaze.Colour.HTMLColour(+-- * Functions+	unitIntervalToHTMLColourCode,+	unitIntervalToRGB,+-- ** Translation+	htmlColourCodeToRGB,+	rgbUnitIntervalToHTMLColourCode+) where++import qualified	Text.Printf+import qualified	ToolShed.Data.Triple+import qualified	WeekDaze.Colour.HTMLColourCode	as Colour.HTMLColourCode+import qualified	WeekDaze.Colour.RGB		as Colour.RGB++-- | Represents the specified HTML colour-code as RGB 24-bit.+htmlColourCodeToRGB :: (Integral i, Show i) => Colour.HTMLColourCode.HTMLColourCode -> Colour.RGB.RGB i+htmlColourCodeToRGB	= Colour.RGB.fromIntegral' . Colour.HTMLColourCode.readHex . tail++-- | Represents the specified RGB as an HTML colour-code.+rgbUnitIntervalToHTMLColourCode+	:: RealFrac unitInterval+	=> Colour.RGB.RGB unitInterval	-- ^ Red, green & blue component-colours, each in the unit-interval.+	-> Colour.HTMLColourCode.HTMLColourCode+rgbUnitIntervalToHTMLColourCode rgb	= ToolShed.Data.Triple.uncurry3 (Text.Printf.printf $ Colour.HTMLColourCode.htmlColourCodePrefix : "%02x%02x%02x") $ Colour.RGB.toTriple (Colour.RGB.fromRGBUnitInterval rgb :: Colour.RGB.RGB Int)++{- |+	* Maps the specified value from the unit-interval to the corresponding spectral colour represented as RGB.++	* The mapping from the spectrum to RGB is performed by modeling the spectrum as a circular arc drawn on the colour triangle,+	of radius equal to the specified saturation, & centered on green.+	CAVEAT: this algorithm has no solid basis.++	* One may specify the angular span & angular offset of this arc, to define the values to which /0/ & /1/ map.+-}+unitIntervalToRGB :: (+	Fractional	alpha,+	Fractional	unitInterval,+	Real		alpha,+	Real		unitInterval,+	Show		alpha,+	Show		unitInterval+ )+	=> alpha	-- ^ The angular span in the range [0 .. 2 * pi radians], to which the unit-interval is mapped.+	-> alpha	-- ^ The angular offset in radians.+	-> unitInterval	-- ^ The saturation in the unit-interval; /0/ will always result in black.+	-> unitInterval	-- ^ The value in the unit-interval which is to be represented by a colour.+	-> Colour.RGB.RGB unitInterval+unitIntervalToRGB _ _ 0 _	= Colour.RGB.black+unitIntervalToRGB angularSpan angularOffset saturation x+	| angularSpan < 0 || realToFrac angularSpan > 2 * pi'	= error $ "WeekDaze.Colour.HTMLColour.unitIntervalToRGB:\tthe specified angular span must be in the range [0 .. 2 * Pi]; " ++ show angularSpan+	| saturation < 0 || saturation > 1			= error $ "WeekDaze.Colour.HTMLColour.unitIntervalToRGB:\tthe specified saturation must be in the unit-interval; " ++ show saturation+	| x < 0 || x > 1					= error $ "WeekDaze.Colour.HTMLColour.unitIntervalToRGB:\tthe specified value must be in the unit-interval; " ++ show x+	| otherwise						= let+		alpha	= realToFrac $ angularSpan * realToFrac x + angularOffset	-- Map the specified value onto a circular arc spanning the specified range of angles, offset by the specified angle.+	in (+		realToFrac . (* realToFrac saturation) . (/ 2) . (+ 1)	-- Translate & scale the result from [-1 .. 1] to [0 .. saturation].+	) `fmap` Colour.RGB.mkRGB (+		cos $ alpha + 5 * pi' / 6+	) (+		sin alpha+	) (+		cos $ alpha + pi' / 6+	)+	where+		pi' :: Double	-- Choose a working floating-point type.+		pi'	= pi++{- |+	* Calls 'unitIntervalToRGB', with default parameters to make /0/ map to /blue/ & /1/ to /red/, & with a moderately high saturation.++	* Calls 'rgbUnitIntervalToHTMLColourCode' to convert to an HTML colour-code.+-}+unitIntervalToHTMLColourCode :: (+	RealFrac	unitInterval,+	Show		unitInterval+ ) => unitInterval -> Colour.HTMLColourCode.HTMLColourCode+unitIntervalToHTMLColourCode	= rgbUnitIntervalToHTMLColourCode . unitIntervalToRGB (4 * pi / 3 :: Double) (negate pi / 6) (3 / 4) {-rather arbitrary-}+
+ src-lib/WeekDaze/Colour/HTMLColourCode.hs view
@@ -0,0 +1,76 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@] Exports some colour-manipulation functions for HTML.+-}++module WeekDaze.Colour.HTMLColourCode(+-- * Types+-- ** Type-synonyms+	HTMLColourCode,+-- * Constants+--	htmlColourCodeHexDigits,+	htmlColourCodePrefix,+-- * Functions+	deriveComplementaryHTMLColourCode,+	generateHTMLColourCodeFrom,+--	hash,+	readHex+) where++import qualified	Crypto.Hash+import qualified	Data.Bits+import			Data.Bits((.&.))+import qualified	Data.ByteString.Char8+import qualified	Numeric+import qualified	Text.Printf++-- | The representation in HTML of 24-bit colour.+type HTMLColourCode	= String++-- | The number of hex-digits required to represent 24-bit colour in HTML.+htmlColourCodeHexDigits :: Int+htmlColourCodeHexDigits	= 6++-- | The prefix used when specifying an HTML colour-code.+htmlColourCodePrefix :: Char+htmlColourCodePrefix	= '#'++-- | Hash the specified string.+hash :: String -> String+hash	= (show :: Crypto.Hash.Digest Crypto.Hash.MD5 {-arbitrarily-} -> String) . Crypto.Hash.hash . Data.ByteString.Char8.pack++-- | Generate an arbitrary HTML colour-code using a hash of the specified string.+generateHTMLColourCodeFrom :: String -> HTMLColourCode+generateHTMLColourCodeFrom	= (htmlColourCodePrefix :) . take htmlColourCodeHexDigits . hash++-- | Interpret the specified string as hexadecimal.+readHex :: (Eq i, Num i) => String -> i+readHex s	= case Numeric.readHex s of+	[(hex, [])]	-> hex+	_		-> error $ "WeekDaze.Colour.HTMLColourCode.readHex:\tfailed to interpret '" ++ s ++ "' as hexadecimal."++-- | Return the complement of the specified HTML colour-code.+deriveComplementaryHTMLColourCode :: HTMLColourCode -> HTMLColourCode+deriveComplementaryHTMLColourCode htmlColourCode	= Text.Printf.printf (htmlColourCodePrefix : "%0*x") htmlColourCodeHexDigits $ bitMask .&. Data.Bits.complement (readHex $ tail htmlColourCode) where+	bitMask :: Int+	bitMask	= 0xffffff	-- 24-bit colour.+
+ src-lib/WeekDaze/Colour/RGB.hs view
@@ -0,0 +1,156 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@] Exports a representation of a colour as primary components.+-}++module WeekDaze.Colour.RGB(+-- * Types+-- ** Data-types+	RGB(),+-- * Constants+	black,+	white24Bit,+	radix,+--	saturated,+-- * Functions+	absDifference,+--	combine,+	toTriple,+-- ** Constructors+	mkRGB,+--	mkRGBUnitInterval,+	mkRGB24Bit,+	fromIntegral',+-- ** Operators+--	(>-<),+	(>+<),+-- ** Translation+	toRGBUnitInterval,+	fromRGBUnitInterval+) where++import qualified	Control.Arrow++infixl 6 >+<	-- Like (+).+infixl 6 >-<	-- Like (-).++-- | The representation of a colour as three primary components.+data RGB primaryColour	= MkRGB primaryColour primaryColour primaryColour	deriving (Eq, Show)++-- | Constructor.+mkRGB+	:: a	-- ^ Red.+	-> a	-- ^ Green.+	-> a	-- ^ Blue.+	-> RGB a+mkRGB = MkRGB++instance Functor RGB where+	f `fmap` MkRGB red green blue	= mkRGB (f red) (f green) (f blue)	-- CAVEAT: the bounds are neither checked nor even known.++-- | Smart-constructor.+mkRGBUnitInterval+	:: (Fractional a, Ord a, Show a)+	=> a	-- ^ Red.+	-> a	-- ^ Green.+	-> a	-- ^ Blue.+	-> RGB a+mkRGBUnitInterval red green blue+	| any ($ [red, green, blue]) [any (< 0), any (> 1)]	= error $ "WeekDaze.Colour.RGB.mkRGBUnitInterval:\teach of the specified fractional component-colours must be in the unit-interval; " ++ show (red, green, blue)+	| otherwise						= mkRGB red green blue++-- | Smart-constructor.+mkRGB24Bit+	:: (Integral a, Show a)+	=> a	-- ^ Red.+	-> a	-- ^ Green.+	-> a	-- ^ Blue.+	-> RGB a+mkRGB24Bit red green blue+	| any ($ [red, green, blue]) [any (< 0), any (> saturated)]	= error $ "WeekDaze.Colour.RGB.mkRGB24Bit:\teach of the specified integral component-colours must be in the closed interval [0," ++ show (saturated :: Int) ++ "]; " ++ show (red, green, blue)+	| otherwise							= mkRGB red green blue++-- | Constant base of number-system used to represent 24-bit colours in HTML.+radix :: Integral i => i+radix	= 2 ^ (8 :: Int)++-- | Represents the specified positive integral value as RGB 24-bit.+fromIntegral' :: (Integral i, Show i) => i -> RGB i+fromIntegral' i+	| i < 0				= error $ "WeekDaze.Colour.RGB.fromIntegral':\tthe specified value can't be negative; " ++ show i+	| i > radix ^ (3 :: Int)	= error $ "WeekDaze.Colour.RGB.fromIntegral':\tthe specified value is too large; " ++ show i+	| otherwise		= (+		\((red, green), blue)	-> mkRGB24Bit red green blue+	) . Control.Arrow.first (`divMod` radix) $ i `divMod` radix++-- | Deconstructor.+toTriple :: RGB a -> (a, a, a)+toTriple (MkRGB red green blue)	= (red, green, blue)++-- | The constant base of number-system used to represent colours in HTML.+saturated :: Integral i => i+saturated	= pred radix++-- | The constant representation of /black/ in RGB.+black :: Num n => RGB n+black	= mkRGB 0 0 0++-- | The constant representation of /white/ in RGB.+white24Bit :: (Integral n, Show n) => RGB n+white24Bit	= mkRGB24Bit saturated saturated saturated++-- | Combine two RGB-representations using the specified function to combine each primary colour.+combine+	:: (a -> a -> a)+	-> RGB a+	-> RGB a+	-> RGB a+combine f (MkRGB rL gL bL) (MkRGB rR gR bR)	= mkRGB (rL `f` rR) (gL `f` gR) (bL `f` bR)++{- |+	* Add the matching component colours.++	* CAVEAT: this may result in overflow.+-}+(>+<) :: Num n => RGB n -> RGB n -> RGB n+(>+<)	= combine (+)++{- |+	* Find the difference between the matching component colours.++	* CAVEAT: negative values may result.+-}+(>-<) :: Num n => RGB n -> RGB n -> RGB n+(>-<)	= combine (-)++-- | Find the absolute difference between the matching component colours.+absDifference :: Num n => RGB n -> RGB n -> RGB n+absDifference x y	= abs `fmap` (x >-< y)++-- | Convert RGB 24-bit to RGB UnitInterval, i.e. map from the closed interval [0,255] to the semi-closed interval [0,1).+toRGBUnitInterval :: (Integral i, Fractional f) => RGB i -> RGB f+toRGBUnitInterval	= fmap $ (/ fromInteger radix) . fromIntegral++-- | Convert RGB UnitInterval to RGB 24-bit, i.e. map from the semi-closed interval [0,1) to the closed interval [0,255].+fromRGBUnitInterval :: (Integral i, RealFrac f) => RGB f -> RGB i+fromRGBUnitInterval	= fmap $ min saturated {-CAVEAT: regrettably, we actually have to work with the closed interval [0,1] and 1 must still map to 255 not 256 (i.e. 0 in modulo-256 arithmetic-} . floor . (* fromInteger radix)+
+ src-lib/WeekDaze/Configuration.hs view
@@ -0,0 +1,31 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the operations common to different parts of the configuration.+-}++module WeekDaze.Configuration (+-- * Type-classes+	Configuration(..)+) where++class Configuration c where+	issueWarnings :: c -> [String]
+ src-lib/WeekDaze/Data/Course.hs view
@@ -0,0 +1,352 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes the attributes of a /course/; <https://en.wikipedia.org/wiki/Course_(education)>.+-}++module WeekDaze.Data.Course(+-- * Types+-- ** Data-types+	Course(+--		MkCourse,+		getSubject,+		getRequiredLessonsPerWeek,+		getRequiredFacilityNames,+		getTimeslotRequest,+		getMinimumConsecutiveLessons,+		getMaybeMaximumClassSize,+		getMaybeSynchronisationId+	),+-- * Constants+--	tag,+	maximumClassSizeTag,+	minimumConsecutiveLessonsTag,+	requiredFacilitiesTag,+	requiredLessonsPerWeekTag,+	defaultMinimumConsecutiveLessons,+-- * Functions+	countStudentPlaces,+	calculateIdealConsecutiveLessons,+-- ** Constructor+	mkCourse,+-- ** Predicates+	isSuitable,+	specifiesTimes,+	isASpecifiedTime,+	isASpecifiedDay,+	isFluid,+	isRigid,+	hasRigidlySpecifiedDays,+	requiresConsecutiveLessons,+--	countImplicitlySpecifiedLessons,+	requestsSeparatedTimelotsWithinAnyDay,+	isSynchronised+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Data.Location			as Data.Location+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.Temporal.Day			as Temporal.Day+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest	as Temporal.TimeslotRequest++-- | Used to qualify Output & XML.+tag :: String+tag				= "course"++-- | Used to qualify Output, SQL & XML.+minimumConsecutiveLessonsTag :: String+minimumConsecutiveLessonsTag	= "minimumConsecutiveLessons"++-- | Used to qualify Output, SQL & XML.+maximumClassSizeTag :: String+maximumClassSizeTag		= "maximumClassSize"++-- | Used to qualify Output & XML.+requiredFacilitiesTag :: String+requiredFacilitiesTag		= "requiredFacilities"++-- | Used to qualify Output, SQL & XML.+requiredLessonsPerWeekTag :: String+requiredLessonsPerWeekTag	= "requiredLessonsPerWeek"++-- | The default value for 'getMinimumConsecutiveLessons'.+defaultMinimumConsecutiveLessons :: Size.NTimeslots+defaultMinimumConsecutiveLessons	= 1++-- | The attributes of a /course/.+data Course synchronisationId level timeslotId	= MkCourse {+	getSubject			:: Data.Subject.Subject level,+	getRequiredLessonsPerWeek	:: Size.NTimeslots,					-- ^ The /subject/ is assumed to take a minimum time-duration to teach, & for ease of scheduling, we assume that this is divided into a constant number of /lesson/s per week.+	getRequiredFacilityNames	:: Data.Location.FacilityNames,				-- ^ The specific strings used to designate these, must match those in 'Data.Location.Profile'.+	getTimeslotRequest		:: Temporal.TimeslotRequest.TimeslotRequest timeslotId,	-- ^ Either the /ideal time-slot/ or the specified /times/, at which to book /lesson/s in this /course/.+	getMinimumConsecutiveLessons	:: Size.NTimeslots,					-- ^ Some /topic/s may require too great a preparation-time for an isolated /lesson/ to be practical; e.g. "games", or possibly "cookery". The specified value represents an ideal number of periods, which can be exceeded if necessary.+	getMaybeMaximumClassSize	:: Maybe Size.NStudents,				-- ^ The optional upper bound on the number of /student/s for whom the /teacher/ can cater; which is independent of 'Data.Location.getCapacity'.+	getMaybeSynchronisationId	:: Maybe synchronisationId				-- ^ The optional identifier, shared by /course/s whose /booking/s must be synchronised.+} deriving (Eq, Ord)++instance (Show synchronisationId, Show level, Show timeslotId) => Show (Course synchronisationId level timeslotId) where+	showsPrec _ MkCourse {+		getSubject			= subject,+		getRequiredLessonsPerWeek	= requiredLessonsPerWeek,+		getRequiredFacilityNames	= requiredFacilityNames,+		getTimeslotRequest		= timeslotRequest,+		getMinimumConsecutiveLessons	= minimumConsecutiveLessons,+		getMaybeMaximumClassSize	= maybeMaximumClassSize,+		getMaybeSynchronisationId	= maybeSynchronisationId+	} = foldr (.) (+		showChar '}'	-- Initial value.+	 ) . (+		showString (tag ++ "={") :	-- Delimiter.+	 ) . Data.List.intersperse (+		showString ", "	-- Separator.+	 ) $ [+		showString Data.Subject.tag . showChar '=' . shows subject,+		showString requiredLessonsPerWeekTag . showChar '=' . shows requiredLessonsPerWeek,+		showString requiredFacilitiesTag . showChar '=' . shows (Data.Set.toList requiredFacilityNames),+		shows timeslotRequest,+		showString minimumConsecutiveLessonsTag . showChar '=' . shows minimumConsecutiveLessons+	 ] ++ Data.Maybe.catMaybes [+		fmap (\s -> showString maximumClassSizeTag . showChar '=' . shows s) maybeMaximumClassSize,+		fmap shows maybeSynchronisationId+	 ]++instance (+#if !MIN_VERSION_containers(0,5,2)+	Ord	timeslotId,+#endif+	Show	level,+	Show	synchronisationId,+	Show	timeslotId+ ) => ToolShed.SelfValidate.SelfValidator (Course synchronisationId level timeslotId) where+	getErrors course@MkCourse {+		getRequiredLessonsPerWeek	= requiredLessonsPerWeek,+		getTimeslotRequest		= timeslotRequest,+		getMinimumConsecutiveLessons	= minimumConsecutiveLessons,+		getMaybeMaximumClassSize	= maybeMaximumClassSize+	} = ToolShed.SelfValidate.extractErrors [+		(+			requiredLessonsPerWeek <= 0,+			show requiredLessonsPerWeekTag ++ " must exceed zero; " ++ show course+		), (+			minimumConsecutiveLessons <= 0,+			show minimumConsecutiveLessonsTag ++ " must exceed zero; " ++ show course+		), (+			requiredLessonsPerWeek < max minimumConsecutiveLessons (Temporal.TimeslotRequest.countSpecifiedTimes timeslotRequest),+			show requiredLessonsPerWeekTag ++ " must be greater than or equal to both, '" ++ minimumConsecutiveLessonsTag ++ "', & the number of specified times; " ++ show course+		), (+			requiredLessonsPerWeek < Temporal.TimeslotRequest.countSpecifiedDays timeslotRequest * minimumConsecutiveLessons,+			show requiredLessonsPerWeekTag ++ " must be greater than or equal to '" ++ minimumConsecutiveLessonsTag ++ "' multiplied by the number of distinct days on which times are specified; " ++ show course+		), (+			Data.Maybe.maybe False (<= 0) maybeMaximumClassSize,+			show maximumClassSizeTag ++ " must exceed zero; " ++ show course+		)+	 ]++instance (+	HXT.XmlPickler	level,+	HXT.XmlPickler	synchronisationId,+	HXT.XmlPickler	timeslotId,+	Ord		timeslotId,+	Show		level,+	Show		synchronisationId,+	Show		timeslotId+ ) => HXT.XmlPickler (Course synchronisationId level timeslotId) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g)	-> mkCourse a b c d e f g,	-- Construct from a tuple.+		\MkCourse {+			getSubject			= subject,+			getRequiredLessonsPerWeek	= requiredLessonsPerWeek,+			getRequiredFacilityNames	= requiredFacilityNames,+			getTimeslotRequest		= timeslotRequest,+			getMinimumConsecutiveLessons	= minimumConsecutiveLessons,+			getMaybeMaximumClassSize	= maybeMaximumClassSize,+			getMaybeSynchronisationId	= maybeSynchronisationId+		} -> (+			subject,+			requiredLessonsPerWeek,+			requiredFacilityNames,+			timeslotRequest,+			minimumConsecutiveLessons,+			maybeMaximumClassSize,+			maybeSynchronisationId+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp7Tuple HXT.xpickle {-subject-} (+		HXT.xpAttr requiredLessonsPerWeekTag HXT.xpInt+	 ) (+		HXT.xpDefault Data.Location.defaultFacilityNames . HXT.xpElem requiredFacilitiesTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) . HXT.xpList1 {-the default is null-} . HXT.xpElem Data.Location.facilityNameTag $ HXT.xpTextAttr Data.Location.facilityValueTag {-can't be null-}+	 ) HXT.xpickle {-timeslotRequest-} (+		defaultMinimumConsecutiveLessons `HXT.xpDefault` HXT.xpAttr minimumConsecutiveLessonsTag HXT.xpInt+	 ) (+		HXT.xpAttrImplied maximumClassSizeTag HXT.xpInt+	 ) (+		HXT.xpOption HXT.xpickle	-- maybeSynchronisationId.+	 )++instance (+	Control.DeepSeq.NFData	level,+	Control.DeepSeq.NFData	synchronisationId,+	Control.DeepSeq.NFData	timeslotId+ ) => Control.DeepSeq.NFData (Course synchronisationId level timeslotId) where+	rnf (MkCourse x0 x1 x2 x3 x4 x5 x6)	= Control.DeepSeq.rnf (x0, x1, x2, x3, x4, x5, x6)++-- | Smart constructor.+mkCourse :: (+	Show	level,+	Show	synchronisationId,+	Show	timeslotId+ )+	=> Data.Subject.Subject level				-- ^ The /topic/ & /level/ at which it is to be taught.+	-> Size.NTimeslots					-- ^ The required number of /time-slot/s per week.+	-> Data.Location.FacilityNames				-- ^ The set of things required for the /course/.+	-> Temporal.TimeslotRequest.TimeslotRequest timeslotId	-- ^ The /ideal time-slot/ or specified /times/, at which to book /lesson/s in this /course/.+	-> Size.NTimeslots					-- ^ The minimum number of consecutive /time-slot/s required for any booking in this /subject/.+	-> Maybe Size.NStudents					-- ^ The maximum class-size.+	-> Maybe synchronisationId				-- ^ The optional identifier of a set of /course/s, whose /lesson/s must be synchronised.+	-> Course synchronisationId level timeslotId+mkCourse subject requiredLessonsPerWeek facilityNames timeslotRequest minimumConsecutiveLessons maybeMaximumClassSize maybeSynchronisationId+	| ToolShed.SelfValidate.isValid course	= course+	| otherwise				= error $ "WeekDaze.Data.Course.mkCourse:\t" ++ ToolShed.SelfValidate.getFirstError course ++ "."+	where+		course	= MkCourse {+			getSubject			= subject,+			getRequiredLessonsPerWeek	= requiredLessonsPerWeek,+			getRequiredFacilityNames	= facilityNames,+			getTimeslotRequest		= timeslotRequest,+			getMinimumConsecutiveLessons	= minimumConsecutiveLessons,+			getMaybeMaximumClassSize	= maybeMaximumClassSize,+			getMaybeSynchronisationId	= maybeSynchronisationId+		}++-- | Get the number of /student/-places, when accounting for the capacity-limits imposed by both the /course/ & the /location/; but not for any /student/s already booked.+countStudentPlaces :: Course synchronisationId level timeslotId -> Data.Location.Profile campus -> Size.NStudents+countStudentPlaces course	= (\locationCapacity -> Data.Maybe.maybe locationCapacity (min locationCapacity) $ getMaybeMaximumClassSize course) . Data.Location.getCapacity++{- |+	* The /required lessons per week/ would typically be an integral multiple of the /minimum consecutive lessons/,+	but otherwise some sessions must be longer to absorb the fractional remainder.++	* Ideally the required number of /lesson/s would be divided equally amongst the maximum possible number of sessions,+	to make the session-durations as equal as possible.++	* This function returns that ideal mean fractional duration, of the integral session-durations.+	Eg:++>	requiredLessonsPerWeek	minimumConsecutiveLessons	isolated sessions	ideal mean session-duration+>	======================	=========================	=================	===========================+>	7			2				3			7/3 == 2.33+>	7			3				2			7/2 == 3.5+>	7			4				1			7+>	11			3				3			11/3 == 3.67++	* CAVEAT: when the ideal is non-integral, it can never be achieved in practice;+	deviations from this ideal of less than half a /time-slot/, are therefore insignificant.+-}+calculateIdealConsecutiveLessons :: Fractional f => Course synchronisationId level timeslotId -> f+calculateIdealConsecutiveLessons course+	| minimumConsecutiveLessons == 1	= 1+	| maximumSeparateSessions == 0		= error "WeekDaze.Data.Course.calculateIdealConsecutiveLessons:\tattempt to divide by zero (maximum separate sessions)."+	| otherwise				= fromIntegral requiredLessonsPerWeek / fromIntegral maximumSeparateSessions	-- Divide the required number of lessons evenly over the maximum possible number of sessions.+	where+		(requiredLessonsPerWeek, minimumConsecutiveLessons)	= getRequiredLessonsPerWeek &&& getMinimumConsecutiveLessons $ course+		maximumSeparateSessions					= requiredLessonsPerWeek `div` minimumConsecutiveLessons++-- | 'True' if the /course/ is in the required /subject/ & its /teacher/ can cater for the required number of /student/s.+isSuitable :: Eq level+	=> Size.NStudents+	-> Data.Subject.Subject level+	-> Course synchronisationId level timeslotId+	-> Bool+isSuitable requiredClassSize requiredSubject course = getSubject course == requiredSubject && Data.Maybe.maybe True (>= requiredClassSize) (getMaybeMaximumClassSize course)++-- | True if /time/s have been specified.+specifiesTimes :: Course synchronisationId level timeslotId -> Bool+specifiesTimes	= not . Temporal.TimeslotRequest.isNull . getTimeslotRequest++-- | True if the /course/ requests /booking/ of a /lesson/ at the specified /time/.+isASpecifiedTime :: Ord timeslotId => Temporal.Time.Time timeslotId -> Course synchronisationId level timeslotId -> Bool+isASpecifiedTime time	= Temporal.TimeslotRequest.isASpecifiedTime time . getTimeslotRequest++-- | True if the one of the specified /time/s for the /course/, falls on the specified /day/.+isASpecifiedDay :: Temporal.Day.Day -> Course synchronisationId level timeslotId -> Bool+isASpecifiedDay day	= Temporal.TimeslotRequest.isASpecifiedDay day . getTimeslotRequest++-- | True if zero /lesson/s of the /course/ are to be booked at /specified time/s.+isFluid :: Course synchronisationId level timeslotId -> Bool+isFluid	= Temporal.TimeslotRequest.isNull . getTimeslotRequest++-- | True if all /lesson/s of the /course/ are required to be booked at /specified time/s.+isRigid :: Course synchronisationId level timeslotId -> Bool+isRigid	= uncurry (==) . (getRequiredLessonsPerWeek &&& Temporal.TimeslotRequest.countSpecifiedTimes . getTimeslotRequest)++{- |+	* True if the /day/s on which /lesson/s must be booked, is known.++	* CAVEAT: this result doesn't account for the case where multiple times have been specified for one /day/,+	but can't be booked as one span of /minimumConsecutiveLessons/ because of the extent of the gaps between.+-}+hasRigidlySpecifiedDays ::+#if !MIN_VERSION_containers(0,5,2)+	Ord	timeslotId =>+#endif+	Course synchronisationId level timeslotId -> Bool+hasRigidlySpecifiedDays course	= isRigid course || getRequiredLessonsPerWeek course == Temporal.TimeslotRequest.countSpecifiedDays (getTimeslotRequest course) * getMinimumConsecutiveLessons course++-- | True if all /booking/s require more than one consecutive identical /lesson/.+requiresConsecutiveLessons :: Course synchronisationId level timeslotId -> Bool+requiresConsecutiveLessons	= (> 1) . getMinimumConsecutiveLessons++-- | Count the total number of /lesson/s implied by specifically requested times, assuming that a split session isn't acceptable.+countImplicitlySpecifiedLessons :: (Enum timeslotId, Ord timeslotId) => Course synchronisationId level timeslotId -> Size.NTimeslots+countImplicitlySpecifiedLessons course	= Data.Foldable.foldr (+	(+) . max (+		getMinimumConsecutiveLessons course	-- Any span between specified times, which is shorter than this must be elongated.+	) . succ {-fence-post-} . uncurry Temporal.Time.calculateAbsoluteDistance . (+		Data.Set.findMax &&& Data.Set.findMin	-- Delimit the span between specified times.+	) -- Assuming that a split session is not permissible, count the lessons implied by the specifically requested times on this day.+ ) 0 . Temporal.Time.categoriseByDay . Temporal.TimeslotRequest.getSpecifiedTimes $ getTimeslotRequest course++-- | True if the /course/ specifies times which can't be satisfied without splitting the session in at least one /day/.+requestsSeparatedTimelotsWithinAnyDay :: (Enum timeslotId, Ord timeslotId) => Course synchronisationId level timeslotId -> Bool+requestsSeparatedTimelotsWithinAnyDay	= uncurry (>) . (+	countImplicitlySpecifiedLessons &&& getRequiredLessonsPerWeek	-- If so, then the assumption in 'countImplicitlySpecifiedLessons' that a split-session isn't acceptable, is no longer tenable.+ )++{- |+	* True if the /course/ references a /synchronisationId/.++	* CAVEAT: doesn't account for the possibility that this is the only /course/ to reference this specified /synchronisationId/.+-}+isSynchronised :: Course synchronisationId level timeslotId -> Bool+isSynchronised	= Data.Maybe.isJust . getMaybeSynchronisationId+
+ src-lib/WeekDaze/Data/Group.hs view
@@ -0,0 +1,171 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes groups of /student/s or /teacher/s.++	* Any number of different /group/s can exist.++	* /Student/s & /teacher/s can belong to any number of /group/s, & any /group/ can include both /student/s & /teacher/s.++	* This concept exists because of the probable requirement to book staff-meetings interleaved with the booking of normal classes;+	the requirement for /student/-groups isn't so clear, though perhaps Muslim student may need to pray at certain times within the normal working day.++	* Practice for a drama or choir, lunch or morning-assembly, might be other examples of /group-meeting/s,+	because in contrast to a normal /lesson/, more than one /teacher/ might be required to attend.+-}++module WeekDaze.Data.Group(+-- * Types+-- ** Type-synonyms+	Id,+	Membership,+-- ** Data-types+	Profile(+--		MkProfile,+		getMeetingTimes,+		getMaybeLocationId,+		getMandatesAttendance+	),+-- * Constants+--	tag,+	groupIdTag,+	memberTag,+	mandatesAttendanceTag,+	meetingTimesTag,+--	defaultMeetingTimes,+	defaultMandatesAttendance,+-- * Functions+	countNTimeslotsPerWeek,+-- ** Constructor+	mkProfile,+-- ** Predicates+--	hasLocation+) where++import qualified	Control.DeepSeq+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.DOM.Util+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Time		as Temporal.Time+import			WeekDaze.Enhanced.EnhancedBool()++-- | Used to qualify XML.+tag :: String+tag			= "groupProfile"++-- | Used to qualify CSS, SQL & XML.+groupIdTag :: String+groupIdTag		= "groupId"++-- | Used to qualify XML.+memberTag :: String+memberTag		= "member"++-- | Used to qualify SQL & XML.+mandatesAttendanceTag :: String+mandatesAttendanceTag	= "mandatesAttendance"++-- | Used to qualify XML.+meetingTimesTag :: String+meetingTimesTag		= "meetingTimes"++-- | The default value for 'getMeetingTimes'.+defaultMeetingTimes :: Temporal.Time.TimeSet timeslotId+defaultMeetingTimes		= Data.Set.empty++-- | The default value for 'getMandatesAttendance'.+defaultMandatesAttendance :: Bool+defaultMandatesAttendance	= False++-- | Names a /group/ to which /human-resource/ may belong.+type Id	= String++-- | Aggregates the attributes of a /group/.+data Profile timeslotId locationId	= MkProfile {+	getMeetingTimes		:: Temporal.Time.TimeSet timeslotId,	-- ^ The list of meeting-times required of members of this group.+	getMaybeLocationId	:: Maybe locationId,			-- ^ The optional (it might be a teleconference, or there might currently be no meeting-times) /location/ at which all meetings will be held.+	getMandatesAttendance	:: Bool					-- ^ Whether each group-member is required to attend all meetings.+} deriving (Eq, Read, Show)++instance ToolShed.SelfValidate.SelfValidator (Profile timeslotId locationId) where+	getErrors _	= []++instance (+	HXT.XmlPickler	locationId,+	HXT.XmlPickler	timeslotId,+	Ord		timeslotId+ ) => HXT.XmlPickler (Profile timeslotId locationId) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		Text.XML.HXT.DOM.Util.uncurry3 mkProfile,	-- Construct from a Triple.+		\MkProfile {+			getMeetingTimes		= meetingTimes,+			getMaybeLocationId	= maybeLocationId,+			getMandatesAttendance	= mandatesAttendance+		} -> (+			meetingTimes,+			maybeLocationId,+			mandatesAttendance+		) -- Deconstruct to a Triple.+	 ) $ HXT.xpTriple (+		HXT.xpDefault defaultMeetingTimes . HXT.xpElem meetingTimesTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct into a List.+		) $ HXT.xpList1 {-the default is null-} HXT.xpickle+	 ) (+		HXT.xpOption HXT.xpickle	-- maybeLocationId.+	 ) (+		defaultMandatesAttendance `HXT.xpDefault` HXT.xpAttr mandatesAttendanceTag HXT.xpickle {-Bool-}+	 )++instance (+	Control.DeepSeq.NFData	locationId,+	Control.DeepSeq.NFData	timeslotId+ ) => Control.DeepSeq.NFData (Profile timeslotId locationId) where+	rnf (MkProfile x0 x1 x2)	= Control.DeepSeq.rnf (x0, x1, x2)++-- | Smart constructor.+mkProfile :: Temporal.Time.TimeSet timeslotId -> Maybe locationId -> Bool -> Profile timeslotId locationId+mkProfile meetingTimes locationId mandatesAttendance+	| ToolShed.SelfValidate.isValid profile	= profile+	| otherwise				= error $ "WeekDaze.Data.Group.mkProfile:\t" ++ ToolShed.SelfValidate.getFirstError profile ++ "."+	where+		profile	= MkProfile meetingTimes locationId mandatesAttendance++{- |+	* Counts the number of /time-slot/s per week required for /meeting/s of this /group/.++	* CAVEAT: this total is independent of the individual member, but if attendance isn't mandated, it should be reduced according to individual availability.+-}+countNTimeslotsPerWeek :: Profile timeslotId locationId -> Size.NTimeslots+countNTimeslotsPerWeek	= Data.Set.size . getMeetingTimes++-- | Whether the /meeting/s of the specified /group/ have a designated /location/.+hasLocation :: Profile timeslotId locationId -> Bool+hasLocation	= Data.Maybe.isJust . getMaybeLocationId++-- | The /group/s to which a /human-resource/ belongs.+type Membership	= Data.Set.Set Id+
+ src-lib/WeekDaze/Data/HumanResource.hs view
@@ -0,0 +1,109 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes an aspect of either a /teacher/ or /student/.++	* These /resource/s have a requirement to devote a portion of their week to teaching,+	whereas a /location/ doesn't care what it's being used for.++	* They can also be members of heterogenous groups of other /human-resources/.+-}++module WeekDaze.Data.HumanResource(+-- * Type-classes+	HumanResource(..),+-- * Constants+	groupMembershipTag,+	defaultGroupMembership,+-- * Functions+	calculateNTimeslotsPerWeekAvailable,+	extractDistinctGroupMembership,+	extractGroupMembersOf,+	extractCombinedGroupMembership,+-- ** Predicates+	hasFreePeriodPreference+) where++import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	WeekDaze.Data.Group			as Data.Group+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference++-- | Used to qualify XML.+groupMembershipTag :: String+groupMembershipTag	= "groupMembership"++-- | The default value for 'getGroupMembership'.+defaultGroupMembership :: Data.Group.Membership+defaultGroupMembership	= Data.Set.empty++-- | Describes a /resource/, which is also a person.+class HumanResource h where+	getNTimeslotsPerWeekOfTeaching+		:: Size.NTimeslots										-- ^ The number of /time-slot/s per /day/.+		-> h+		-> Size.NTimeslots										-- ^ The number of those /time-slot/s when the person is available, devoted to teaching or being taught.++	getNTimeslotsPerWeekOfNonTeaching+		:: Size.NTimeslots										-- ^ The number of /time-slot/s per /day/.+		-> h+		-> Size.NTimeslots										-- ^ The number of those /time-slot/s when the person is available, devoted to any activity other than teaching; e.g. lunch, meetings, administration, free-study.++	getGroupMembership		:: h -> Data.Group.Membership						-- ^ The /group/s to which this /human-resource/ belongs.++	getMaybeFreePeriodPreference	:: h -> Maybe Temporal.FreePeriodPreference.FreePeriodPreference	-- ^ Any preference for the position within each /day/, of unallocated /time-slot/s.++-- | The number of /time-slot/s in each week, that this /resource/ is regularly scheduled to be /available/.+calculateNTimeslotsPerWeekAvailable+	:: Data.Resource.Resource resource+	=> Size.NTimeslots+	-> resource+	-> Size.NTimeslots+calculateNTimeslotsPerWeekAvailable nTimeslotsPerDay	= (nTimeslotsPerDay *) . Data.Resource.countDaysPerWeekAvailable++-- | Finds the set of /group/s, of which at least one /human-resource/ claims membership.+extractDistinctGroupMembership :: HumanResource humanResource => Data.Resource.ResourceMap humanResourceId humanResource -> Data.Group.Membership+extractDistinctGroupMembership	= Data.Map.foldr (Data.Set.union . getGroupMembership) Data.Set.empty++-- | Identify those /human-resource/s, in the specified /resource/-map, who belong to the specified /group/.+extractGroupMembersOf+	:: HumanResource humanResource+	=> Data.Group.Id+	-> Data.Resource.ResourceMap humanResourceId humanResource+	-> Data.Resource.ResourceMap humanResourceId humanResource+extractGroupMembersOf groupId	= Data.Map.filter (Data.Set.member groupId . getGroupMembership)++-- | Get the union of all group-memberships.+extractCombinedGroupMembership+	:: HumanResource humanResource+	=> Data.Resource.ResourceMap humanResourceId humanResource+	-> Data.Group.Membership+extractCombinedGroupMembership	= Data.Set.unions . map getGroupMembership . Data.Map.elems++-- | Whether the /human-resource/ has specified a preference for the position, within each /day/ on which they're /available/, of free /time-slot/s.+hasFreePeriodPreference :: HumanResource humanResource => humanResource -> Bool+hasFreePeriodPreference	= Data.Maybe.isJust . getMaybeFreePeriodPreference+
+ src-lib/WeekDaze/Data/Location.hs view
@@ -0,0 +1,276 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the attributes of a /location/, in terms of its; /capacity/, /facilities/, whether it's /off-site/, & its /availability/.++	* It refers to a more general concept than a merely a /class-room/, including for example, an assembly-hall or a games-field.+-}++module WeekDaze.Data.Location(+-- * Types+-- ** Type-synonyms+	FacilityName,+	FacilityNames,+	WastedResources,+	Locus,+-- ** Data-types+	Profile(+--		MkProfile,+		getCapacity,+		getFacilityNames,+		getAvailability,+		getCampus+	),+-- * Constants+--	tag,+	capacityTag,+--	facilitiesTag,+	facilityTypeIdTag,+	facilityNameTag,+	facilityValueTag,+--	facilityTypeTableName,+	defaultFacilityNames,+-- * Functions+	calculateWaste,+	calculateRelativeWaste,+	calculateRelativeUse,+#ifdef USE_HDBC+	findFacilityNameByFacilityTypeId,+#endif+-- ** Accessors+--	getWastedCapacity,+	getWastedFacilityNames,+-- ** Constructor+	mkProfile,+-- ** Predicates+	hasFacilities,+	isSuitable+) where++import			Control.Arrow((&&&), (***))+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Set+import			Data.Set((\\))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.DOM.Util+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Data.Resource		as Data.Resource+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Availability	as Temporal.Availability++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.IntMap+import qualified	WeekDaze.Database.Selector	as Database.Selector++-- | Used to qualify XML.+facilityTypeTableName :: Database.Selector.TableName+facilityTypeTableName	= Database.Selector.tablePrefix ++ "facilityType"++-- | Queries the database to build a map of /facilityName/s by /facilityTypeId/.+findFacilityNameByFacilityTypeId+	:: Database.HDBC.IConnection	connection+	=> connection+	-> Database.HDBC.SqlValue	-- ^ ProjectId+	-> IO (Data.IntMap.IntMap FacilityName)+findFacilityNameByFacilityTypeId connection projectIdSql	= (+	Data.IntMap.fromList . map (+		\row -> case row of+			[facilityTypeIdSql, facilityNameSql]	-> (+				either (+					error . showString "WeekDaze.Data.Location.findFacilityNameByFacilityTypeId:\tfailed to parse the value for " . shows facilityTypeIdTag . showString " read from the database; " . show+				) id $ Database.HDBC.safeFromSql facilityTypeIdSql,+				Database.HDBC.fromSql facilityNameSql+			 ) -- Pair.+			_					-> error $ "WeekDaze.Data.Location.findFacilityNameByFacilityTypeId:\tunexpected number of columns=" ++ show (length row) ++ " in row of table " ++ show facilityTypeTableName ++ "."+	)+ ) `fmap` Database.Selector.select connection [facilityTypeIdTag, facilityNameTag] [facilityTypeTableName] [(Database.Selector.projectIdColumnName, projectIdSql)]+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag			= "locationProfile"++-- | Used to qualify SQL & XML.+capacityTag :: String+capacityTag		= "capacity"++-- | Used to qualify XML.+facilitiesTag :: String+facilitiesTag		= "facilities"++-- | Used to qualify SQL & XML.+facilityTypeIdTag :: String+facilityTypeIdTag	= "facilityTypeId"++-- | Used to qualify SQL & XML.+facilityNameTag :: String+facilityNameTag		= "facilityName"++-- | Used to qualify XML.+facilityValueTag :: String+facilityValueTag	= "value"++{- |+	* A /subject/-specific /facility/, e.g. "desks", "musical instruments", or "goal-posts".++	* The specific string used to designate these must match those defined for /course/s.+-}+type FacilityName	= String++-- | The set of facility-names advertised by a /location/.+type FacilityNames	= Data.Set.Set FacilityName++-- | The default value for /facilityNames/.+defaultFacilityNames :: FacilityNames+defaultFacilityNames	= Data.Set.empty++-- | Aggregates the attributes of a /location/, which a generalisation of a room, since it also includes games-fields.+data Profile campus	= MkProfile {+	getCapacity		:: Size.NStudents,			-- ^ Typically the number of seats. N.B.: though the games-field has a rather ill-defined /capacity/, the changing-rooms don't.+	getFacilityNames	:: FacilityNames,			-- ^ The /location/ may advertise /facilities/ to support specific activities.+	getAvailability		:: Temporal.Availability.Availability,	-- ^ The /location/ may have a periodic /availability/.+	getCampus		:: campus				-- ^ Proximate /locations/ are grouped into /campus/es, between which intra-day migration is trivial.+} deriving (Eq, Show)++instance Show campus => ToolShed.SelfValidate.SelfValidator (Profile campus) where+	getErrors profile@MkProfile {+		getAvailability	= availability+	}+		| not $ ToolShed.SelfValidate.isValid availability	= ToolShed.SelfValidate.getErrors availability+		| otherwise						= ToolShed.SelfValidate.extractErrors [+			(getCapacity profile <= 0,	show capacityTag ++ " must exceed zero; " ++ show profile)+		]++instance Data.Resource.Resource (Profile campus) where+	getAvailability	= getAvailability++instance (+	Data.Default.Default			campus,+	Eq					campus,+	HXT.XmlPickler				campus,+	Show					campus+ ) => HXT.XmlPickler (Profile campus) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		Text.XML.HXT.DOM.Util.uncurry4 mkProfile,	-- Construct from a quadruple.+		\MkProfile {+			getCapacity		= capacity,+			getFacilityNames	= facilityNames,+			getAvailability		= availability,+			getCampus		= campus+		} -> (+			capacity,+			facilityNames,+			availability,+			campus+		) -- Deconstruct to a quadruple.+	 ) $ HXT.xp4Tuple (+		HXT.xpAttr capacityTag HXT.xpInt+	 ) (+		HXT.xpDefault defaultFacilityNames . HXT.xpElem facilitiesTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) . HXT.xpList1 {-the default is null-} . HXT.xpElem facilityNameTag $ HXT.xpTextAttr facilityValueTag {-can't be null-}+	 ) (+		HXT.xpDefault Data.Default.def HXT.xpickle	-- Availability.+	 ) (+		HXT.xpDefault Data.Default.def HXT.xpickle	-- Campus.+	 )++instance Control.DeepSeq.NFData	campus => Control.DeepSeq.NFData (Profile campus) where+	rnf (MkProfile x0 x1 x2 x3)	= Control.DeepSeq.rnf (x0, x1, x2, x3)++-- | Smart constructor.+mkProfile+	:: Show campus+	=> Size.NStudents+	-> FacilityNames+	-> Temporal.Availability.Availability+	-> campus+	-> Profile campus+mkProfile capacity facilityNames availability campus+	| ToolShed.SelfValidate.isValid profile	= profile+	| otherwise				= error $ "WeekDaze.Data.Location.mkProfile:\t" ++ ToolShed.SelfValidate.getFirstError profile ++ "."+	where+		profile	= MkProfile capacity facilityNames availability campus++{- |+	* True if the 'Profile' meets or exceeds the specified criteria.++	* Takes no account of either /availability/ or /campus/.+-}+isSuitable+	:: Size.NStudents+	-> FacilityNames+	-> Profile campus+	-> Bool+isSuitable requiredCapacity requiredFacilityNames profile	= requiredCapacity <= getCapacity profile && requiredFacilityNames `Data.Set.isSubsetOf` getFacilityNames profile++-- | True if the /location/ has some facilities.+hasFacilities :: Profile campus -> Bool+hasFacilities	= not . Data.Set.null . getFacilityNames++-- | A measure of the /capacity/ & specific /facilities/, which are available at a /location/, but are unused in some context.+type WastedResources	= (Size.NStudents, FacilityNames)++-- | Accessor.+getWastedCapacity :: WastedResources -> Size.NStudents+getWastedCapacity	= fst++-- | Accessor.+getWastedFacilityNames :: WastedResources -> FacilityNames+getWastedFacilityNames	= snd++{- |+	* Measures the excess /capacity/ & unused /facilities/, of the specified /location/.++	* All /facilities/ are considered equal.++	* CAVEAT: each /location/ must have previously passed 'isSuitable'.+-}+calculateWaste+	:: Size.NStudents	-- ^ The required /capacity/.+	-> FacilityNames	-- ^ The required /facilities/.+	-> Profile campus	-- ^ The /location/ whose /resources/ are to be compared with requirements.+	-> WastedResources+calculateWaste requiredCapacity requiredFacilities	= subtract requiredCapacity . getCapacity &&& (\\ requiredFacilities) . getFacilityNames++-- | Convert 'WastedResources' to a pair of ratios.+calculateRelativeWaste :: Fractional relativeWaste => Profile campus -> WastedResources -> (relativeWaste, relativeWaste)+calculateRelativeWaste profile wastedResources	= (+	fromIntegral (getWastedCapacity wastedResources) / fromIntegral (getCapacity profile),+	let+		nFacilities	= Data.Set.size $ getFacilityNames profile+	in if nFacilities == 0+		then 0	-- If the location hasn't any facilities, none can be wasted.+		else fromIntegral (Data.Set.size $ getWastedFacilityNames wastedResources) / fromIntegral nFacilities+ ) -- Pair.++-- | The relative extent to which /capacity/ & /facilities/ are used.+calculateRelativeUse :: Fractional relativeUse => Profile campus -> WastedResources -> (relativeUse, relativeUse)+calculateRelativeUse profile	= ((1 -) *** (1 -)) . calculateRelativeWaste profile++-- | A collection of distinct /location-ids/.+type Locus locationId	= Data.Set.Set locationId
+ src-lib/WeekDaze/Data/Requirements.hs view
@@ -0,0 +1,56 @@+{-+	Copyright (C) 2013 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Partitions a set of arbitrary requirements, into those which are required & those which are merely desired.+-}++module WeekDaze.Data.Requirements(+-- * Types+-- ** Type-synonyms+	Requirements,+-- * Constants+	coreTag,+	optionalTag,+-- * Functions+-- ** Accessors+	getCore,+	getOptional+) where++-- | Used to qualify XML.+coreTag :: String+coreTag		= "core"++-- | Used to qualify XML.+optionalTag :: String+optionalTag	= "optional"++-- | The /core/ & /optional/ requirements, of some unspecified type.+type Requirements a	= (a, a)++-- | Accessor.+getCore :: Requirements a -> a+getCore		= fst++-- | Accessor.+getOptional :: Requirements a -> a+getOptional	= snd+
+ src-lib/WeekDaze/Data/Resource.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* An abstract description of the properties common to /student/s, /teacher/s or /location/s.++	* Currently just their /availability/, but in principle other common facets of these entities may be added as they're discovered.++	* The simultaneous /availability/ of largely arbitrary collections of tuples can also be determined.+-}++module WeekDaze.Data.Resource(+-- * Type-classes+	Resource(..),+-- * Types+-- ** Type-synonyms+	ResourceMap,+-- * Functions+--	findCommonAvailability,+	countDaysPerWeekAvailable,+	isAvailable,+	extractAvailableResources+) where++import qualified	Data.Foldable+import qualified	Data.Functor+import qualified	Data.Map+import qualified	Data.Set+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Availability	as Temporal.Availability+import qualified	WeekDaze.Temporal.Day		as Temporal.Day++-- | Describes a finite resource, or group of finite resources.+class Resource resource where+	getAvailability :: resource -> Temporal.Availability.Availability	-- ^ The set of /day/s on which the /resource/s are all regularly /available/ to be booked.++	isAvailableOn :: Temporal.Day.Day -> resource -> Bool			-- ^ True if on the specified /day/, all /resource/s are regularly scheduled to be /available/.+	isAvailableOn day	= Temporal.Availability.isAvailableOn day . getAvailability	-- Default implementation.++-- | The number of /day/s in any week, on which all the /resource/s are simultaneously /available/.+countDaysPerWeekAvailable :: Resource resource => resource -> Size.NDays+countDaysPerWeekAvailable	= Temporal.Availability.countDaysPerWeekAvailable . getAvailability++-- | True if on any /day/, all the /resource/s are regularly scheduled to be simultaneously /available/.+isAvailable :: Resource resource => resource -> Bool+isAvailable	= not . Temporal.Availability.isUnavailable . getAvailability++-- Properties of homogeneous resources ...++-- | Returns the /day/s on which all the specified /resource/s are /available/.+findCommonAvailability :: (Data.Foldable.Foldable f, Data.Functor.Functor f, Resource resource) => f resource -> Temporal.Availability.Availability+findCommonAvailability	= Temporal.Availability.findIntersections . fmap getAvailability++instance Resource resource => Resource [resource] where+	getAvailability		= findCommonAvailability+	isAvailableOn day	= all (isAvailableOn day)++instance Resource resource => Resource (Data.Map.Map k resource) where+	getAvailability		= findCommonAvailability+	isAvailableOn day	= Data.Foldable.all (isAvailableOn day)++instance (+#if !MIN_VERSION_containers(0,5,2)+	Ord		resource,	-- Not required after "Data.Set-7.8.1".+#endif+	Resource	resource+ ) => Resource (Data.Set.Set resource) where+	getAvailability		= Temporal.Availability.findIntersections . Data.Set.map getAvailability+	isAvailableOn day	= Data.Foldable.all (isAvailableOn day)++-- Properties of heterogenous resources ...++instance (Resource a, Resource b) => Resource (a, b) where+	getAvailability (x, y)		= getAvailability x `Temporal.Availability.findIntersection` getAvailability y+	isAvailableOn day (x, y)	= all (Temporal.Availability.isAvailableOn day) [getAvailability x, getAvailability y]++instance (Resource a, Resource b, Resource c) => Resource (a, b, c) where+	getAvailability (x, y, z)	= Temporal.Availability.findIntersections [getAvailability x, getAvailability y, getAvailability z]+	isAvailableOn day (x, y, z)	= all (Temporal.Availability.isAvailableOn day) [getAvailability x, getAvailability y, getAvailability z]++-- | Describes a map indexed by unique /resource/-identifiers.+type ResourceMap resourceId resource	= Data.Map.Map resourceId resource++-- | Extract those /resource/s from the map provided, which are /available/ on the specified /day/.+extractAvailableResources :: Resource resource => Temporal.Day.Day -> ResourceMap resourceId resource -> ResourceMap resourceId resource+extractAvailableResources day	= Data.Map.filter (isAvailableOn day)+
+ src-lib/WeekDaze/Data/Student.hs view
@@ -0,0 +1,280 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes the attributes of a /student/.+-}++module WeekDaze.Data.Student(+-- * Types+-- ** Type-synonyms+	Id,+	KnowledgeRequirements,+-- ** Data-types+	Profile(+--		MkProfile,+		getStream,+		getKnowledgeRequirements,+--		getWorkingWeek,+		getTeachingRatio,+--		getGroupMembership,+		getMaybeFreePeriodPreference+	),+-- * Constants+--	tag,+	knowledgeRequirementsTag,+--	streamTag,+	teachingRatioTag,+	defaultTeachingRatio,+-- * Functions+	amalgamateKnowledgeRequirements,+	deriveAmalgamatedKnowledgeRequirement,+	unsubscribe,+-- ** Constructor+	mkProfile,+-- ** Predicates+	hasAnyCoreKnowledgeRequirements,+	hasAnyOptionalKnowledgeRequirements,+	requiresAnySubjectBy+) where++import			Control.Arrow((&&&), (***))+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Data.Group				as Data.Group+import qualified	WeekDaze.Data.HumanResource			as Data.HumanResource+import qualified	WeekDaze.Data.Requirements			as Data.Requirements+import qualified	WeekDaze.Data.Resource				as Data.Resource+import qualified	WeekDaze.Data.Subject				as Data.Subject+import qualified	WeekDaze.Temporal.Availability			as Temporal.Availability+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference++-- | Used to qualify XML.+tag :: String+tag				= "studentProfile"++-- | Used to qualify SQL & XML.+streamTag :: String+streamTag			= "stream"++-- | Used to qualify XML.+knowledgeRequirementsTag :: String+knowledgeRequirementsTag	= "knowledgeRequirements"++-- | Used to qualify SQL & XML.+teachingRatioTag :: String+teachingRatioTag		= "teachingRatio"++-- | The default value for 'getTeachingRatio'.+defaultTeachingRatio :: Num teachingRatio => teachingRatio+defaultTeachingRatio	= 1++{- |+	* A unique identifier, which may be merely their name, or more likely a registration-number of some unspecified format.++	* Though arbitrary, a /string/ adequately covers all possibilities.+-}+type Id	= String++-- | A specification of /subject/-requirements, partitioned into those considered /core/ & the /optional/ remainder.+type KnowledgeRequirements level	= Data.Requirements.Requirements (Data.Subject.Knowledge level)++-- | A combination of the /core/ & /optional/ /knowledge-requirements/.+amalgamateKnowledgeRequirements :: Ord level => KnowledgeRequirements level -> Data.Subject.Knowledge level+amalgamateKnowledgeRequirements	= uncurry Data.Set.union++-- | The attributes of a /student/.+data Profile level stream teachingRatio	= MkProfile {+	getStream			:: stream,							-- ^ The common academic year & potentially also the topic-independent ability-stream of the member-/student/s.+	getKnowledgeRequirements	:: KnowledgeRequirements level,					-- ^ The core & optional /subject/s required for the education of the member-/student/s.+	getWorkingWeek			:: Temporal.Availability.Availability,				-- ^ /Student/s are typically unavailable at the weekends.+	getTeachingRatio		:: teachingRatio,						-- ^ The ratio in the semi-closed unit-interval (0,1], of the time when the member-/student/s are available, which is allocated to tuition; the remainder by inference being allocated to free study (as often required by final year /student/s), or /meeting/s.+	getGroupMembership		:: Data.Group.Membership,					-- ^ The member-/student/s may meet regularly with various /group/s.+	getMaybeFreePeriodPreference	:: Maybe Temporal.FreePeriodPreference.FreePeriodPreference	-- ^ Any preference for the position within each /day/, of unallocated /time-slot/s.+} deriving (Eq, Ord)++instance (Show level, Show stream, Show teachingRatio) => Show (Profile level stream teachingRatio) where+	showsPrec _ MkProfile {+		getStream			= stream,+		getKnowledgeRequirements	= knowledgeRequirements,+		getWorkingWeek			= workingWeek,+		getTeachingRatio		= teachingRatio,+		getGroupMembership		= groupMembership,+		getMaybeFreePeriodPreference	= maybeFreePeriodPreference+	} = showString tag . showString "={" . showString streamTag . showChar '=' . shows stream . showChar ',' . showString knowledgeRequirementsTag . showChar '=' . shows (+		Data.Set.toList *** Data.Set.toList $ knowledgeRequirements+	 ) . showChar ',' . showString Temporal.Availability.tag . showChar '=' . shows workingWeek . showChar ',' . showString teachingRatioTag . showChar '=' . shows teachingRatio . showChar ',' . showString Data.HumanResource.groupMembershipTag . showChar '=' . shows (+		Data.Set.toList groupMembership+	 ) . showChar ',' . showString Temporal.FreePeriodPreference.tag . showChar '=' . showString (+		Data.Maybe.maybe "<none>" show maybeFreePeriodPreference+	 ) . showChar '}'++instance (+	Ord	level,+	Real	teachingRatio,+	Show	level+ ) => ToolShed.SelfValidate.SelfValidator (Profile level stream teachingRatio) where+	getErrors MkProfile {+		getKnowledgeRequirements	= knowledgeRequirements,+		getWorkingWeek			= workingWeek,+		getTeachingRatio		= teachingRatio+	}+		| not $ ToolShed.SelfValidate.isValid workingWeek	= ToolShed.SelfValidate.getErrors workingWeek+		| otherwise						= ToolShed.SelfValidate.extractErrors [+			let+				duplicateKnowledgeRequirements	= uncurry Data.Set.intersection knowledgeRequirements+			in (+				not $ Data.Set.null duplicateKnowledgeRequirements,+				"overlapping " ++ show knowledgeRequirementsTag ++ "; " ++ show duplicateKnowledgeRequirements+			), (+				any ($ teachingRatio) [(<= 0), (> 1)],+				show teachingRatioTag ++ " '" ++ show (realToFrac teachingRatio :: Double {-hide the actual type-}) ++ "' must be within the semi-closed unit-interval '(0,1]'"+			)+		]++instance Data.Resource.Resource (Profile level stream teachingRatio) where+	getAvailability	= getWorkingWeek++instance RealFrac teachingRatio => Data.HumanResource.HumanResource (Profile level stream teachingRatio) where+	getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay		= round . uncurry (*) . (getTeachingRatio &&& fromIntegral . Data.HumanResource.calculateNTimeslotsPerWeekAvailable nTimeslotsPerDay)+	getNTimeslotsPerWeekOfNonTeaching nTimeslotsPerDay	= uncurry (-) . (+		Data.HumanResource.calculateNTimeslotsPerWeekAvailable nTimeslotsPerDay &&& Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+	 ) -- Derivation from 'getNTimeslotsPerWeekOfTeaching' ensures they are compatible in the face of rounding.+	getGroupMembership					= getGroupMembership+	getMaybeFreePeriodPreference				= getMaybeFreePeriodPreference++instance (+	Data.Default.Default	stream,+	Eq			stream,+	HXT.XmlPickler		level,+	HXT.XmlPickler		stream,+	HXT.XmlPickler		teachingRatio,+	Ord			level,+	Real			teachingRatio,+	Show			level+ ) => HXT.XmlPickler (Profile level stream teachingRatio) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f)	-> mkProfile a b c d e f,	-- Construct from a tuple.+		\MkProfile {+			getStream			= stream,+			getKnowledgeRequirements	= knowledgeRequirements,+			getWorkingWeek			= workingWeek,+			getTeachingRatio		= teachingRatio,+			getGroupMembership		= groupMembership,+			getMaybeFreePeriodPreference	= maybeFreePeriodPreference+		} -> (+			stream,+			knowledgeRequirements,+			workingWeek,+			teachingRatio,+			groupMembership,+			maybeFreePeriodPreference+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp6Tuple (+		HXT.xpDefault Data.Default.def HXT.xpickle	-- Level.+	 ) (+		HXT.xpElem knowledgeRequirementsTag $ HXT.xpElem Data.Requirements.coreTag (+			HXT.xpWrap (+				Data.Set.fromList,	-- Construct from a List.+				Data.Set.toList		-- Deconstruct to a List.+			) $ HXT.xpList1 {-can't be null-} HXT.xpickle+		) `HXT.xpPair` HXT.xpDefault Data.Set.empty (+			HXT.xpElem Data.Requirements.optionalTag . HXT.xpWrap (+				Data.Set.fromList,	-- Construct from a List.+				Data.Set.toList		-- Deconstruct to a List.+			) $ HXT.xpList1 {-the default is null-} HXT.xpickle+		)+	 ) HXT.xpickle {-workingWeek-} (+		HXT.xpDefault defaultTeachingRatio $ HXT.xpAttr teachingRatioTag HXT.xpickle+	 ) (+		HXT.xpDefault Data.HumanResource.defaultGroupMembership . HXT.xpElem Data.HumanResource.groupMembershipTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) . HXT.xpList1 {-the default is null-} . HXT.xpElem Data.Group.memberTag $ HXT.xpTextAttr Data.Group.groupIdTag {-can't be null-}+	 ) (+		HXT.xpOption HXT.xpickle	-- maybeFreePeriodPreference.+	 )++instance (+	Control.DeepSeq.NFData	level,+	Control.DeepSeq.NFData	stream,+	Control.DeepSeq.NFData	teachingRatio+ ) => Control.DeepSeq.NFData (Profile level stream teachingRatio) where+	rnf (MkProfile x0 x1 x2 x3 x4 x5)	= Control.DeepSeq.rnf (x0, x1, x2, x3, x4, x5)++-- | Smart constructor.+mkProfile :: (+	Ord	level,+	Real	teachingRatio,+	Show	level+ )+	=> stream							-- ^ The stream for this /student/.+	-> KnowledgeRequirements level					-- ^ The /subject/s to study.+	-> Temporal.Availability.Availability				-- ^ The /day/s on which this /student/ can attend school.+	-> teachingRatio						-- ^ The portion of the /working-week/ allocated to tuition.+	-> Data.Group.Membership					-- ^ The /groups/ of which this /student/ is a member.+	-> Maybe Temporal.FreePeriodPreference.FreePeriodPreference	-- ^ Any preference for the position within each day, of free /time-slot/s.+	-> Profile level stream teachingRatio+mkProfile stream knowledgeRequirements workingWeek teachingRatio groupMembership maybeFreePeriodPreference+	| ToolShed.SelfValidate.isValid profile	= profile+	| otherwise				= error $ "WeekDaze.Data.Student.mkProfile:\t" ++ ToolShed.SelfValidate.getFirstError profile ++ "."+	where+		profile	= MkProfile {+			getStream			= stream,+			getKnowledgeRequirements	= knowledgeRequirements,+			getWorkingWeek			= workingWeek,+			getTeachingRatio		= teachingRatio,+			getGroupMembership		= groupMembership,+			getMaybeFreePeriodPreference	= maybeFreePeriodPreference+		}++-- | Get the core & optional /subject-requirements/.+deriveAmalgamatedKnowledgeRequirement :: Ord level => Profile level stream teachingRatio -> Data.Subject.Knowledge level+deriveAmalgamatedKnowledgeRequirement	= amalgamateKnowledgeRequirements . getKnowledgeRequirements++-- | True if the /student/ has any core /subject/-requirements.+hasAnyCoreKnowledgeRequirements :: Profile level stream teachingRatio -> Bool+hasAnyCoreKnowledgeRequirements	= not . Data.Set.null . Data.Requirements.getCore . getKnowledgeRequirements++-- | True if the /student/ has any optional /subject/-requirements.+hasAnyOptionalKnowledgeRequirements :: Profile level stream teachingRatio -> Bool+hasAnyOptionalKnowledgeRequirements	= not . Data.Set.null . Data.Requirements.getOptional . getKnowledgeRequirements++-- | True if the /student/ is interested in a /subject/, according to the specified predicate.+requiresAnySubjectBy+	:: Ord level+	=> (Data.Subject.Subject level -> Bool)	-- ^ Predicate.+	-> Profile level stream teachingRatio+	-> Bool+requiresAnySubjectBy predicate	= Data.Foldable.any predicate . deriveAmalgamatedKnowledgeRequirement++-- | Unsubscribe from the specified set of /groups/.+unsubscribe+	:: Data.Group.Membership+	-> Profile level stream teachingRatio+	-> Profile level stream teachingRatio+unsubscribe groupMembership profile	= profile {+	getGroupMembership	= Data.Set.filter (`Data.Set.notMember` groupMembership) $ getGroupMembership profile+}
+ src-lib/WeekDaze/Data/Subject.hs view
@@ -0,0 +1,140 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes a /subject/, in terms of the /topic/, & the /level/ at which it is being taught.++	* The /level/ may correspond to an academic year, but may be a finer-grain value as required to model /topic/-specific streaming.++	* A non-academic /subject/ like cross-country running, may not have a concept of multiple /level/s,+	but since it doesn't have zero but rather one /level/, the concept exists for all /subject/s.+-}++module WeekDaze.Data.Subject(+-- * Types+-- ** Type-synonyms+	Topic,+	Knowledge,+-- ** Data-types+	Subject(+--		MkSubject,+		getTopic,+		getLevel+	),+-- * Constants+	tag,+	levelTag,+	topicTag,+-- * Functions+-- ** Constructors+#ifdef USE_HDBC+	mkSubjectFromSql,+#endif+	mkSubject+) where++import qualified	Control.Arrow+import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((+++), (<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Data.Maybe+import qualified	Database.HDBC++-- | Construct from two database-values.+mkSubjectFromSql+	:: (Data.Convertible.Convertible Database.HDBC.SqlValue level, Show level)	-- Flexible context.+	=> Database.HDBC.SqlValue	-- ^ Topic.+	-> Database.HDBC.SqlValue	-- ^ Level.+	-> Subject level+mkSubjectFromSql topicSql	= mkSubject (+	Data.Maybe.fromMaybe (+		error $ "WeekDaze.Data.Subject.mkSubjectFromSql:\tnull " ++ show topicTag ++ "."+	) $ Database.HDBC.fromSql topicSql+ ) . Data.Maybe.fromMaybe (+	error $ "WeekDaze.Data.Subject.mkSubjectFromSql:\tnull " ++ show levelTag ++ "."+ ) . Database.HDBC.fromSql+#endif /* USE_HDBC */++-- | Used to qualify CSS & XML.+tag :: String+tag		= "subject"++-- | Used to qualify CSS, SQL & XML.+levelTag :: String+levelTag	= "level"++-- | Used to qualify CSS, SQL & XML.+topicTag :: String+topicTag	= "topic"++-- | The type of the /topic/ of study.+type Topic	= String++-- | The subject which is being either taught or learned.+data Subject level	= MkSubject {+	getTopic	:: Topic,	-- ^ The /topic/ of study, which would typically be something like /Maths/ or /English/, but it could be something non-academic, like /Games/; but it shouldn't be either /Assembly/ or /Lunch/, since these aren't required to have exactly one /teacher/ in attendance.+	getLevel	:: level	-- ^ The /level/ at which this /topic/ is being taught; which may be merely the academic year, or a finer-grain concept representing a /topic/-specific stream.+} deriving (Eq, Ord)++instance (Read level, Show level) => Read (Subject level) where+	readsPrec _	= map (Control.Arrow.first $ uncurry mkSubject) . reads++instance Show level => Show (Subject level) where+	showsPrec _	= shows . (getTopic &&& getLevel)	-- Hides the constructor & accessors.++instance Text.XHtml.Strict.HTML level => Text.XHtml.Strict.HTML (Subject level) where+	toHtml subject	= Text.XHTML.mkXHTMLSpan tag << (+		Text.XHTML.mkXHTMLSpan topicTag << getTopic subject +++ Text.XHtml.Strict.spaceHtml {-level may be null, so make separator invisible-} +++ getLevel subject+	 )++instance (HXT.XmlPickler level, Show level) => HXT.XmlPickler (Subject level) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry mkSubject,	-- Construct from a Pair.+		getTopic &&& getLevel	-- Deconstruct to a Pair.+	 ) $ HXT.xpTextAttr topicTag {-can't be null-} `HXT.xpPair` HXT.xpickle {-Level-}++instance Control.DeepSeq.NFData level => Control.DeepSeq.NFData (Subject level) where+	rnf	= Control.DeepSeq.rnf . (getTopic &&& getLevel)++instance Show level => ToolShed.SelfValidate.SelfValidator (Subject level) where+	getErrors subject	= ToolShed.SelfValidate.extractErrors [(null $ getTopic subject, "null " ++ show topicTag ++ "; " ++ show subject)]++-- | Smart constructor.+mkSubject :: Show level => Topic -> level -> Subject level+mkSubject topic level+	| ToolShed.SelfValidate.isValid subject	= subject+	| otherwise				= error $ "WeekDaze.Data.Subject.mkSubject:\t" ++ ToolShed.SelfValidate.getFirstError subject ++ "."+	where+		subject	= MkSubject topic level++-- | A collection of distinct 'Subject's.+type Knowledge level	= Data.Set.Set (Subject level)+
+ src-lib/WeekDaze/Data/Teacher.hs view
@@ -0,0 +1,379 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes the attributes of a /teacher/.++ [@TODO@]	Some teachers work half days, or even just specific /time-slot/s; so 'getWorkingWeek' is an inadequate description.+-}++module WeekDaze.Data.Teacher(+-- * Types+-- ** Type-synonyms+	Service,+-- ** Data-types+	Profile(+--		MkProfile,+		getService,+		getMaybeOwnLocationId,+--		getWorkingWeek,+--		getMaximumTeachingRatio,+		getMaybeSpecialtyTopic,+--		getGroupMembership,+		getMaybeFreePeriodPreference+	),+-- * Constants+--	tag,+	maximumTeachingRatioTag,+	serviceTag,+	specialtyTopicTag,+--	defaultService,+-- * Functions+	lookupCourseIn,+	lookupSuitableCourse,+	findSpecifiedTimes,+	unsubscribe,+-- ** Constructor+	mkProfile,+-- ** Predicates+	offersSuitableCourse,+	hasAnyIdealTimeslotRequest,+	hasAnySpecificTimeRequest,+	hasSpecialtyTopic,+	inhabits,+	isSpecialistIn,+	offersAnySynchronisedCourse,+	offersService+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Foldable+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.Group			as Data.Group+import qualified	WeekDaze.Data.HumanResource		as Data.HumanResource+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.Temporal.Availability		as Temporal.Availability+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest	as Temporal.TimeslotRequest++-- | Used to qualify XML.+tag :: String+tag			= "teacherProfile"++-- | Used to qualify SQL & XML.+maximumTeachingRatioTag :: String+maximumTeachingRatioTag	= "maximumTeachingRatio"++-- | Used to qualify XML.+serviceTag :: String+serviceTag		= "service"++-- | Used to qualify XML.+specialtyTopicTag :: String+specialtyTopicTag	= "specialtyTopic"++{- |+	* A /teacher/ offers a set of /course/s.++	* Whilst they may perform a reserve-role in some additional /subject/, this isn't going to affect the /timetable/.+-}+type Service synchronisationId level timeslotId	= Data.Set.Set (Data.Course.Course synchronisationId level timeslotId)++-- | The default value for 'getService'.+defaultService :: Service synchronisationId level timeslotId+defaultService	= Data.Set.empty++-- | The service offered by a /teacher/.+data Profile synchronisationId level timeslotId locationId teachingRatio	= MkProfile {+	getService			:: Service synchronisationId level timeslotId,			-- ^ The set of /course/s offered.++{- |+	* A /teacher/ may have their own personal /location/ (i.e. a /form-room/).++	* Absence of this field implies that they're nomadic, & may use any free 'locationId', appropriate for the /course/; however inconveniently located.++	* A personal /location/ can't be assumed to have all the /facilities/ required for the /service/ offered.++	* CAVEAT: it's conceivable that some /teacher/s share a /location/, but each one still only uses that /location/.+-}+	getMaybeOwnLocationId		:: Maybe locationId,						-- ^ A /teacher/ may have a fixed abode.+	getWorkingWeek			:: Temporal.Availability.Availability,				-- ^ A /teacher/ may be part-time.+{- |+	* The maximum ratio, in the closed unit-interval [0,1], of a /teacher/'s working week (rather than the whole week), which is devoted to teaching.+	The remainder may be administration or attendance at /meetings/.+	This concept may also be required, to allow ad-hoc re-scheduling, to compensate for absentees.++	* This concept differs from a /part-time teacher/, who teaches for a static /contractually specified/ portion of the week.++	* When the type-parameter is a /Rational/ & the denominator is the number of /lesson/s per week, specification is in the basic time-units of the timetable.++	* The value can't be exceeded, but may not be reached, thus allowing at least the required time for the administration.+-}+	getMaximumTeachingRatio		:: teachingRatio,+	getGroupMembership		:: Data.Group.Membership,					-- ^ A /teacher/ may meet regularly with various /group/s.+	getMaybeSpecialtyTopic		:: Maybe Data.Subject.Topic,					-- ^ A /teacher/ may specialise in a specific /topic/, rather than being a generalist.+	getMaybeFreePeriodPreference	:: Maybe Temporal.FreePeriodPreference.FreePeriodPreference	-- ^ A /teacher/ may have a preference for the position within each /day/, of unallocated /time-slot/s.+} deriving (Eq, Ord)++instance (Show synchronisationId, Show level, Show timeslotId, Show locationId, Show teachingRatio) => Show (Profile synchronisationId level timeslotId locationId teachingRatio) where+	showsPrec _ MkProfile {+		getService			= service,+		getMaybeOwnLocationId		= maybeOwnLocationId,+		getWorkingWeek			= workingWeek,+		getMaximumTeachingRatio		= maximumTeachingRatio,+		getGroupMembership		= groupMembership,+		getMaybeSpecialtyTopic		= maybeSpecialtyTopic,+		getMaybeFreePeriodPreference	= maybeFreePeriodPreference+	} = showString tag . showString "={" . showString serviceTag . showChar '=' . shows (+		Data.Set.toList service+	 ) . showString ",locationId=" . showString (+		Data.Maybe.maybe "<none>" show maybeOwnLocationId+	 ) . showChar ',' . showString Temporal.Availability.tag . showChar '=' . shows workingWeek . showChar ',' . showString maximumTeachingRatioTag . showChar '=' . shows maximumTeachingRatio . showChar ',' . showString Data.HumanResource.groupMembershipTag . showChar '=' . shows (+		Data.Set.toList groupMembership+	 ) . showChar ',' . showString specialtyTopicTag . showChar '=' . showString (+		Data.Maybe.maybe "<none>" show maybeSpecialtyTopic+	 ) . showChar ',' . showString Temporal.FreePeriodPreference.tag . showChar '=' . showString (+		Data.Maybe.maybe "<none>" show maybeFreePeriodPreference+	 ) . showChar '}'++instance (+	Ord	level,+#if !MIN_VERSION_containers(0,5,2)+	Ord	synchronisationId,+#endif+	Ord	timeslotId,+	Real	teachingRatio,+	Show	level,+	Show	synchronisationId,+	Show	timeslotId+ ) => ToolShed.SelfValidate.SelfValidator (Profile synchronisationId level timeslotId locationId teachingRatio) where+	getErrors profile@MkProfile {+		getService		= service,+		getWorkingWeek		= workingWeek,+		getMaximumTeachingRatio	= maximumTeachingRatio,+		getMaybeSpecialtyTopic	= maybeSpecialtyTopic+	}+		| not $ ToolShed.SelfValidate.isValid service		= ToolShed.SelfValidate.getErrors service+		| not $ ToolShed.SelfValidate.isValid workingWeek	= ToolShed.SelfValidate.getErrors workingWeek+		| otherwise						= ToolShed.SelfValidate.extractErrors [+			(+				Data.List.Extra.anySame . map Data.Course.getSubject $ Data.Set.toList service,+				"multiple courses in the same " ++ show Data.Subject.tag ++ " have been offered in this teacher's " ++ show serviceTag ++ "; " ++ show (Data.Set.toList service)+			), (+				any ($ maximumTeachingRatio) [(< 0), (> 1)],+				maximumTeachingRatioTag ++ "=" ++ show (realToFrac maximumTeachingRatio :: Double {-hide the actual type-}) ++ " must be within the closed unit-interval '[0,1]'"	-- A staff-member can be purely administrative, since they could be a member of a group.+			), (+				maybeSpecialtyTopic == Just "",+				"explicitly null " ++ show specialtyTopicTag+			), (+				Data.Maybe.maybe False (`Data.Set.notMember` Data.Set.map (Data.Subject.getTopic . Data.Course.getSubject) service) maybeSpecialtyTopic,+				"a teacher's " ++ show specialtyTopicTag ++ " " ++ show (Data.Maybe.fromJust maybeSpecialtyTopic) ++ " must be offered as a " ++ show serviceTag ++ "; " ++ show (Data.Set.toList service)+			), (+				Data.List.Extra.anySame $ Data.Foldable.concatMap (Data.Set.toList . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest) service,+				"there's an overlap in the " ++ show Temporal.TimeslotRequest.specificallyTag ++ " requested booking-times, of the courses offered in the " ++ show serviceTag ++ "; " ++ show (Data.Set.toList service)+			), (+				uncurry (&&) $ (offersService &&& (== 0) . getMaximumTeachingRatio) profile,+				"a portion of the working week must be allocated to teaching " ++ show (Data.Set.toList service)+			), (+				uncurry (&&) $ (not . offersService &&& (> 0) . getMaximumTeachingRatio) profile,+				maximumTeachingRatioTag ++ "=" ++ show (realToFrac maximumTeachingRatio :: Double {-hide the actual type-}) ++ " of " ++ Temporal.Availability.tag ++ "=" ++ show workingWeek ++ " can't be filled without offering a service"+			)+		]++instance Data.Resource.Resource (Profile synchronisationId level timeslotId locationId teachingRatio) where+	getAvailability	= getWorkingWeek++instance RealFrac teachingRatio => Data.HumanResource.HumanResource (Profile synchronisationId level timeslotId locationId teachingRatio) where+	getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay		= round . uncurry (*) . (getMaximumTeachingRatio &&& fromIntegral . Data.HumanResource.calculateNTimeslotsPerWeekAvailable nTimeslotsPerDay)+	getNTimeslotsPerWeekOfNonTeaching nTimeslotsPerDay	= uncurry (-) . (+		Data.HumanResource.calculateNTimeslotsPerWeekAvailable nTimeslotsPerDay &&& Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+	 ) -- Derivation from 'getNTimeslotsPerWeekOfTeaching' ensures they are compatible in the face of rounding.+	getGroupMembership					= getGroupMembership+	getMaybeFreePeriodPreference				= getMaybeFreePeriodPreference++instance (+	HXT.XmlPickler	level,+	HXT.XmlPickler	locationId,+	HXT.XmlPickler	synchronisationId,+	HXT.XmlPickler	teachingRatio,+	HXT.XmlPickler	timeslotId,+	Ord		level,+	Ord		synchronisationId,+	Ord		timeslotId,+	Real		teachingRatio,+	Show		level,+	Show		synchronisationId,+	Show		timeslotId+ ) => HXT.XmlPickler (Profile synchronisationId level timeslotId locationId teachingRatio) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g)	-> mkProfile a b c d e f g,	-- Construct from a tuple.+		\MkProfile {+			getService			= service,+			getMaybeOwnLocationId		= maybeOwnLocationId,+			getWorkingWeek			= workingWeek,+			getMaximumTeachingRatio		= maximumTeachingRatio,+			getGroupMembership		= groupMembership,+			getMaybeSpecialtyTopic		= maybeSpecialtyTopic,+			getMaybeFreePeriodPreference	= maybeFreePeriodPreference+		} -> (+			service,+			maybeOwnLocationId,+			workingWeek,+			maximumTeachingRatio,+			groupMembership,+			maybeSpecialtyTopic,+			maybeFreePeriodPreference+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp7Tuple (+		HXT.xpDefault defaultService . HXT.xpElem serviceTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) $ HXT.xpList1 {-the default is null-} HXT.xpickle+	 ) (+		HXT.xpOption HXT.xpickle	-- maybeOwnLocationId.+	 ) HXT.xpickle {-workingWeek-} (+		HXT.xpAttr maximumTeachingRatioTag HXT.xpickle+	 ) (+		HXT.xpDefault Data.HumanResource.defaultGroupMembership . HXT.xpElem Data.HumanResource.groupMembershipTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) . HXT.xpList1 {-the default is null-} . HXT.xpElem Data.Group.memberTag $ HXT.xpTextAttr Data.Group.groupIdTag+	 ) (+		HXT.xpOption $ HXT.xpTextAttr specialtyTopicTag {-can't be null-}+	 ) (+		HXT.xpOption HXT.xpickle	-- maybeFreePeriodPreference.+	 )++instance (+	Control.DeepSeq.NFData	level,+	Control.DeepSeq.NFData	locationId,+	Control.DeepSeq.NFData	synchronisationId,+	Control.DeepSeq.NFData	teachingRatio,+	Control.DeepSeq.NFData	timeslotId+ ) => Control.DeepSeq.NFData (Profile synchronisationId level timeslotId locationId teachingRatio) where+	rnf (MkProfile x0 x1 x2 x3 x4 x5 x6)	= Control.DeepSeq.rnf (x0, x1, x2, x3, x4, x5, x6)++-- | Smart constructor.+mkProfile :: (+	Ord	level,+	Ord	timeslotId,+	Real	teachingRatio,+	Show	level,+	Show	synchronisationId,+	Show	timeslotId+ )+	=> Service synchronisationId level timeslotId			-- ^ The set of /course/s offered.+	-> Maybe locationId						-- ^ Personal classroom.+	-> Temporal.Availability.Availability				-- ^ The /day/s on which the /teacher/ is contracted to work.+	-> teachingRatio						-- ^ The maximum ratio of a working-week actually devoted to teaching.+	-> Data.Group.Membership					-- ^ The /group/s of which this /teacher/ is a member.+	-> Maybe Data.Subject.Topic					-- ^ Specialty topic.+	-> Maybe Temporal.FreePeriodPreference.FreePeriodPreference	-- ^ Any preference for the position within each /day/, of free /time-slot/s.+	-> Profile synchronisationId level timeslotId locationId teachingRatio+mkProfile service maybeOwnLocationId workingWeek maximumTeachingRatio groupMembership maybeSpecialtyTopic maybeFreePeriodPreference+	| ToolShed.SelfValidate.isValid profile	= profile+	| otherwise				= error $ "WeekDaze.Data.Teacher.mkProfile:\t" ++ ToolShed.SelfValidate.getFirstError profile ++ "."+	where+		profile	= MkProfile {+			getService			= service,+			getMaybeOwnLocationId		= maybeOwnLocationId,+			getWorkingWeek			= workingWeek,+			getMaximumTeachingRatio		= maximumTeachingRatio,+			getGroupMembership		= groupMembership,+			getMaybeSpecialtyTopic		= maybeSpecialtyTopic,+			getMaybeFreePeriodPreference	= maybeFreePeriodPreference+		}++-- | Extract any /course/ from the specified /profile/, which matches the specified /subject/.+lookupCourseIn+	:: Eq level+	=> Data.Subject.Subject level+	-> Profile synchronisationId level timeslotId locationId teachingRatio+	-> Maybe (Data.Course.Course synchronisationId level timeslotId)+lookupCourseIn subject	= Data.Foldable.find ((== subject) . Data.Course.getSubject) . getService++-- | Extract any /course/ from the specified /profile/, which matches the specified /subject/ & caters for the required number of /student/s.+lookupSuitableCourse+	:: Eq level+	=> Size.NStudents+	-> Data.Subject.Subject level+	-> Profile synchronisationId level timeslotId locationId teachingRatio+	-> Maybe (Data.Course.Course synchronisationId level timeslotId)+lookupSuitableCourse nStudents subject	= Data.Foldable.find (Data.Course.isSuitable nStudents subject) . getService++-- | Find the set of all specified /time/s, for any of the /course/s offered.+findSpecifiedTimes :: Ord timeslotId => Profile synchronisationId level timeslotId locationId teachingRatio -> Temporal.Time.TimeSet timeslotId+findSpecifiedTimes	= Data.Set.foldr (Data.Set.union . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest) Data.Set.empty . getService++-- | True if the /teacher/ offers a /course/ in the required /subject/ & can cater for the required number of /student/s.+offersSuitableCourse+	:: Eq level+	=> Size.NStudents+	-> Data.Subject.Subject level+	-> Profile synchronisationId level timeslotId locationId teachingRatio+	-> Bool+offersSuitableCourse nStudents subject	= Data.Foldable.any (Data.Course.isSuitable nStudents subject) . getService++-- | True if the specified /teacher/ makes any /ideal timeslot-request/ amongst the /course/s offered in their /service/.+hasAnyIdealTimeslotRequest :: Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnyIdealTimeslotRequest	= Data.Foldable.any (Temporal.TimeslotRequest.isIdeally . Data.Course.getTimeslotRequest) . getService++-- | True if the specified /teacher/ makes any /specific time-request/ amongst the /course/s offered in their /service/.+hasAnySpecificTimeRequest :: Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+hasAnySpecificTimeRequest	= Data.Foldable.any Data.Course.specifiesTimes . getService++-- | True if the specified /teacher/ claims any /topic/ as their specialty.+hasSpecialtyTopic :: Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+hasSpecialtyTopic	= Data.Maybe.isJust . getMaybeSpecialtyTopic++-- | True if the specified /teacher/ claims the specified /location/ as their own.+inhabits :: Eq locationId => locationId -> Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+inhabits locationId	= (== Just locationId) . getMaybeOwnLocationId++-- | True if the /teacher/ specializes in the specified /topic/.+isSpecialistIn :: Data.Subject.Topic -> Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+isSpecialistIn topic	= (== Just topic) . getMaybeSpecialtyTopic++-- | True if the specified /teacher/ offers any synchronised /course/.+offersAnySynchronisedCourse :: Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+offersAnySynchronisedCourse	= Data.Foldable.any Data.Course.isSynchronised . getService++-- | True if the /teacher/ offers one or more /course/s in their /service/.+offersService :: Profile synchronisationId level timeslotId locationId teachingRatio -> Bool+offersService	= not . Data.Set.null . getService++-- | Unsubscribe from the specified set of /groups/.+unsubscribe+	:: Data.Group.Membership+	-> Profile synchronisationId level timeslotId locationId teachingRatio+	-> Profile synchronisationId level timeslotId locationId teachingRatio+unsubscribe groupMembership profile	= profile {+	getGroupMembership	= Data.Set.filter (`Data.Set.notMember` groupMembership) $ getGroupMembership profile+}
+ src-lib/WeekDaze/Database/Selector.hs view
@@ -0,0 +1,343 @@+{-# LANGUAGE CPP, FlexibleContexts, MultiParamTypeClasses #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Provides an interface for data-types which can construct themselves from a database.++	* Provides a convenient function to run a simple SQL-query.++	* Some common column-names are also exported.+-}++module WeekDaze.Database.Selector(+-- * Types+-- ** Type-synonyms+	ColumnName,+	TableName,+-- * Constants+	locationIdColumnName,+--	mySqlSetSeparator,+	projectIdColumnName,+	synchronisationIdColumnName,+	tablePrefix,+	teacherIdColumnName,+	timeslotIdColumnName,+	campusColumnName,+-- * Type-classes+	Selector(..),+-- * Functions+	queryConcurrently,+--	fromDatabaseConcurrently',+	round',+	fromMySqlSet,+	toMySqlSet,+	fromSqlFractional,+--	mkParameterisedSelection,+	prepare,+	select+) where++import qualified	Control.Concurrent+import qualified	Control.DeepSeq+import			Control.DeepSeq(($!!))+import qualified	Control.Monad+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Ratio+import qualified	Data.Set+import qualified	Data.Typeable++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++#ifdef PRINT_DB_QUERIES+import qualified	System.IO+#endif++-- | Synonym.+type ColumnName	= String++-- | Synonym.+type TableName	= String++-- | Database column-name.+locationIdColumnName :: ColumnName+locationIdColumnName		= "locationId"++-- | Database column-name.+projectIdColumnName :: ColumnName+projectIdColumnName		= "projectId"++-- | Database column-name.+synchronisationIdColumnName :: ColumnName+synchronisationIdColumnName	= "synchronisationId"++{- |+	* Database table-identifier.++	* Consistent use of this for all table-names, prevents a clash with SQL-keywords, without requiring table-names to be quoted.+-}+tablePrefix :: TableName+tablePrefix			= "tbl_"++-- | Database column-name.+teacherIdColumnName :: ColumnName+teacherIdColumnName		= "teacherId"++-- | Database column-name.+timeslotIdColumnName :: ColumnName+timeslotIdColumnName		= "timeslotId"++-- | Database column-name.+campusColumnName :: ColumnName+campusColumnName		= "campus"++{- |+	An interface to which data-types capable of constructing themselves from a database may conform.+	Since the database can contain many projects, & only one is required, the identity of the specific project must be defined.+-}+class Selector selector where+	-- | Reads an instance from the connected database.+	fromDatabase+		:: Database.HDBC.IConnection	connection+		=> connection			-- ^ Abstract database-connection.+		-> Database.HDBC.SqlValue	-- ^ The integral projectId.+		-> IO selector+	-- | Reads an instance from the connected database, using concurrent queries.+	fromDatabaseConcurrently+		:: Database.HDBC.IConnection	connection+		=> connection			-- ^ Abstract database-connection.+		-> Database.HDBC.SqlValue	-- ^ The integral projectId.+		-> IO selector+	fromDatabaseConcurrently	= fromDatabase	-- Default to serial query.++instance (+	Control.DeepSeq.NFData	a,+	Control.DeepSeq.NFData	b,+	Selector		a,+	Selector		b+ ) => Selector (a, b) where+	fromDatabase connection projectIdSql			= (,) <$> fromDatabase connection projectIdSql <*> fromDatabase connection projectIdSql+	fromDatabaseConcurrently connection projectIdSql	= do+		x	<- Control.Concurrent.newEmptyMVar+		y	<- Control.Concurrent.newEmptyMVar++		fromDatabaseConcurrently' connection projectIdSql x+		fromDatabaseConcurrently' connection projectIdSql y++		(,) <$> Control.Concurrent.takeMVar x <*> Control.Concurrent.takeMVar y++instance (+	Control.DeepSeq.NFData	a,+	Control.DeepSeq.NFData	b,+	Control.DeepSeq.NFData	c,+	Selector		a,+	Selector		b,+	Selector		c+ ) => Selector (a, b, c) where+	fromDatabase connection projectIdSql			= (,,) <$> fromDatabase connection projectIdSql <*> fromDatabase connection projectIdSql <*> fromDatabase connection projectIdSql+	fromDatabaseConcurrently connection projectIdSql	= do+		x	<- Control.Concurrent.newEmptyMVar+		y	<- Control.Concurrent.newEmptyMVar+		z	<- Control.Concurrent.newEmptyMVar++		fromDatabaseConcurrently' connection projectIdSql x+		fromDatabaseConcurrently' connection projectIdSql y+		fromDatabaseConcurrently' connection projectIdSql z++		(,,) <$> Control.Concurrent.takeMVar x <*> Control.Concurrent.takeMVar y <*> Control.Concurrent.takeMVar z++instance (+	Control.DeepSeq.NFData	a,+	Control.DeepSeq.NFData	b,+	Control.DeepSeq.NFData	c,+	Control.DeepSeq.NFData	d,+	Selector		a,+	Selector		b,+	Selector		c,+	Selector		d+ ) => Selector (a, b, c, d) where+	fromDatabase connection projectIdSql			= (,,,) <$> fromDatabase connection projectIdSql <*> fromDatabase connection projectIdSql <*> fromDatabase connection projectIdSql <*> fromDatabase connection projectIdSql+	fromDatabaseConcurrently connection projectIdSql	= do+		w	<- Control.Concurrent.newEmptyMVar+		x	<- Control.Concurrent.newEmptyMVar+		y	<- Control.Concurrent.newEmptyMVar+		z	<- Control.Concurrent.newEmptyMVar++		fromDatabaseConcurrently' connection projectIdSql w+		fromDatabaseConcurrently' connection projectIdSql x+		fromDatabaseConcurrently' connection projectIdSql y+		fromDatabaseConcurrently' connection projectIdSql z++		(,,,) <$> Control.Concurrent.takeMVar w <*> Control.Concurrent.takeMVar x <*> Control.Concurrent.takeMVar y <*> Control.Concurrent.takeMVar z++-- | Issue the specified database-query on a new thread.+queryConcurrently :: (+	Control.DeepSeq.NFData		selection,+	Database.HDBC.IConnection	connection+ )+	=> (connection -> Database.HDBC.SqlValue -> IO selection)	-- ^ The query.+	-> connection							-- ^ Abstract database-connection.+	-> Database.HDBC.SqlValue					-- ^ The integral projectId.+	-> Control.Concurrent.MVar selection				-- ^ Where to store the result.+	-> IO ()+queryConcurrently query connection projectIdSql mVar	= do+	connection'	<- Database.HDBC.clone connection	-- CAVEAT: from the HDBC-documentation; not all databases support more than one active statement for a single connection, therefore for maximum portability, use a different connection to the database for each simultaneous query you wish to use.++	Control.Monad.void . Control.Concurrent.forkIO $ query connection' projectIdSql >>= (Control.Concurrent.putMVar mVar $!!)	-- CAVEAT: force the thread to work by strictly evaluating the structure.++-- | Construct an arbitrary datum from a database-query issued on a new thread.+fromDatabaseConcurrently' :: (+	Control.DeepSeq.NFData		selector,+	Database.HDBC.IConnection	connection,+	Selector			selector+ )+	=> connection				-- ^ Abstract database-connection.+	-> Database.HDBC.SqlValue		-- ^ The integral projectId.+	-> Control.Concurrent.MVar selector	-- ^ Where to store the result.+	-> IO ()+fromDatabaseConcurrently'	= queryConcurrently fromDatabase++-- | Round any error introduced by conversion to a rational number.+round' :: RealFrac r => r -> Rational+round'	= (`Data.Ratio.approxRational` doublePrecisionEpsilon) where+	doublePrecisionEpsilon	= recip 2 ^ floatDigits (undefined :: Double)++{- |+	* Converts a /SqlValue/ to the specified fractional type.++	* CAVEAT: required to avoid any rounding-error in the floating-point number read from the database resulting in an inefficiently large 'Rational' number.+-}+fromSqlFractional :: (+	Data.Convertible.Convertible	Database.HDBC.SqlValue a,	-- Flexible context.+	Data.Typeable.Typeable		a,+	RealFrac			a+ )+	=> a		-- ^ Default value to use if the SQL-value is null.+	-> Database.HDBC.SqlValue+	-> a+fromSqlFractional defaultValue	= Data.Maybe.maybe defaultValue (+	\x -> if Data.Typeable.typeOf x == Data.Typeable.typeOf (undefined :: Data.Ratio.Rational)+		then realToFrac $ round' x+		else x+ ) . either (+	error . showString "WeekDaze.Database.Selector.fromSqlFractional:\tfailed to parse a value read from the database; " . show+ ) id . Database.HDBC.safeFromSql++-- | The separator used by MySql, when representing the members of a set.+mySqlSetSeparator :: Char+mySqlSetSeparator	= ','++-- | Constructs a list from a MySql set.+fromMySqlSet :: Read a => String -> [a]+fromMySqlSet s+	| null s		= []	-- Terminate.+	| null remainder	= [day]	-- Terminate.+	| otherwise		= day : fromMySqlSet (tail {-drop the separator-} remainder) {-recurse-}+	where+		(s', remainder)	= break (== mySqlSetSeparator) s+		day			= case reads s' of+			[(value, [])]	-> value+			_		-> error $ "WeekDaze.Database.Selector.fromMySqlSet:\tfailed to parse " ++ show s'++-- | Constructs a MySql set from a list.+toMySqlSet :: Show a => [a] -> String+toMySqlSet	= Data.List.intercalate [mySqlSetSeparator] . map show++-- N.B.: orphan instance.+instance (Ord a, Read a) => Data.Convertible.Convertible Database.HDBC.SqlValue (Data.Set.Set a {-MultiParamTypeClasses-}) where+	safeConvert	= fmap (Data.Set.fromList . fromMySqlSet) . Data.Convertible.safeConvert++{- |+	* Constructs a parameterised SQL-select query for the specified columns from the specified tables,+	from those rows whose columns exactly match the currently unspecified actual parameters.++	* CAVEAT: identifiers aren't delimited, since MySQL uses back-ticks rather than the standard double-quote;+	so identifiers can contain any white space or be SQL-keywords.+	If this presents a problem, then they can be pre-quoted before the call.++	* CAVEAT: this is an ad-hoc solution to the general problem of constructing an SQL-query,+	in that it only caters for the specific type of query required by this application.+-}+mkParameterisedSelection+	:: [ColumnName]	-- ^ Select columns from the matching rows.+	-> [TableName]	-- ^ Typically only a single table is referenced, but the facility exists to implicitly specify a /join/.+	-> [ColumnName]	-- ^ Select rows matching (by equality) values (currently represented by place-holders) of the specified (case-insensitive) column-names.+	-> String+mkParameterisedSelection columnNames tableNames rowConditions+	| null rowConditions	= showString selectFrom ";"+	| otherwise		= showString selectFrom . showString " WHERE " $ showString (+		Data.List.intercalate " AND " {-arbitrarily-} $ map (+			++ "=?"	-- Lacking any requirement for more sophistication, all parameters are matched using equality; sorry.+		) rowConditions+	) ";"+	where+		selectFrom :: String+		selectFrom	= showString "SELECT " . showString (separateIdentifiers columnNames) . showString " FROM " $ separateIdentifiers tableNames where+			separateIdentifiers :: [String] -> String+			separateIdentifiers	= Data.List.intercalate ","++-- | Composes a parameterised SQL-select query.+prepare+	:: Database.HDBC.IConnection connection+	=> connection	-- ^ Abstract database-connection.+	-> [ColumnName]	-- ^ Select the specified columns from matching rows.+	-> [TableName]	-- ^ Typically only a single table is referenced, but the facility exists to implicitly specify a /join/.+	-> [ColumnName]	-- ^ The formal parameters which will be subsequently be required to match corresponding actual parameters to filter rows.+	-> IO Database.HDBC.Statement+prepare connection columnNames tableNames formalParameters	= do+	statement	<- Database.HDBC.prepare connection $ mkParameterisedSelection columnNames tableNames formalParameters++#ifdef PRINT_DB_QUERIES+	System.IO.hPutStrLn System.IO.stderr . showString "INFO:\tDB-query=" $ shows (Database.HDBC.originalQuery statement) "."+#endif+	return {-to IO-monad-} statement++{- |+	* Prepares a parameterised SQL-select query, then executes it using the specified database-connection and actual parameters.++	* Because the SQL is parsed before replacing the formal parameters with actual parameters, it shouldn't be vulnerable to SQL-injection.+-}+select+	:: Database.HDBC.IConnection	connection+	=> connection					-- ^ Abstract database-connection.+	-> [ColumnName]					-- ^ Select the specified columns from matching rows.+	-> [TableName]					-- ^ Typically only a single table is referenced, but the facility exists to implicitly specify a /join/.+	-> [(ColumnName, Database.HDBC.SqlValue)]	-- ^ Select those rows matching the specified parameters.+	-> IO [[Database.HDBC.SqlValue]]+select connection columnNames tableNames parameters	= let+	(formalParameters, actualParameters)	= unzip parameters+ in do+	statement	<- prepare connection columnNames tableNames formalParameters+	0		<- Database.HDBC.execute statement actualParameters	-- For 'SELECT' queries, the number of rows modified is always zero.+	rows		<- Database.HDBC.fetchAllRows' statement		-- CAVEAT: the strict version of this call is necessary to ensure that a new query isn't executed before these rows have been read; else SQL-error "Commands out of sync; you can't run this command now".++#ifdef PRINT_DB_ROWS+	System.IO.hPutStrLn System.IO.stderr . showString "INFO:\tDB-rows=" $ shows rows "."+#endif+	return {-to IO-monad-} rows+
+ src-lib/WeekDaze/Enhanced/EnhancedBool.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Bool'.+-}++module WeekDaze.Enhanced.EnhancedBool() where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++instance HXT.XmlPickler Bool where+	xpickle	= HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show [False, True]+
+ src-lib/WeekDaze/Enhanced/EnhancedDouble.hs view
@@ -0,0 +1,32 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Double'.+-}++module WeekDaze.Enhanced.EnhancedDouble() where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++instance HXT.XmlPickler Double where+	xpickle	= HXT.xpPrim+
+ src-lib/WeekDaze/Enhanced/EnhancedEither.hs view
@@ -0,0 +1,50 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for 'Either'.+-}++module WeekDaze.Enhanced.EnhancedEither(+-- * Functions+	xpickle+) where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++instance (HXT.XmlPickler l, HXT.XmlPickler r) => HXT.XmlPickler (Either l r) where+	xpickle	= xpickle HXT.xpickle HXT.xpickle++-- | Pickler for an arbitrary datum of type 'Either'.+xpickle :: HXT.PU l -> HXT.PU r -> HXT.PU (Either l r)+xpickle lPickler rPickler	= HXT.xpAlt (+	const 0 `either` const 1	-- Index into the subsequent pickler-list.+ ) [+	HXT.xpWrap (+		Left,			-- Construct.+		\(Left l)	-> l	-- Deconstruct.+	) lPickler,+	HXT.xpWrap (+		Right,			-- Construct.+		\(Right r)	-> r	-- Deconstruct.+	) rPickler+ ]+
+ src-lib/WeekDaze/Enhanced/EnhancedRatio.hs view
@@ -0,0 +1,54 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines class-instances for 'Data.Ratio.Ratio'.++	* CAVEAT: rational numbers are converted imprecisely to floating-point for representation as XML.+	To remedy the loss of precision on reading from XML, they're rounded to the /epsilon/ for IEEE double-precision <https://en.wikipedia.org/wiki/Machine_epsilon>.+-}++module WeekDaze.Enhanced.EnhancedRatio(+--	round'+) where++import qualified	Control.Arrow+import			Control.Arrow((***))+import qualified	Data.Ratio+import qualified	System.Random+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Truncate the rounding-error introduced by conversion to a rational number.+round' :: RealFrac r => r -> Rational+round'	= (`Data.Ratio.approxRational` doublePrecisionEpsilon) where+	doublePrecisionEpsilon	= recip 2 ^ floatDigits (undefined :: Double)++instance Integral i => HXT.XmlPickler (Data.Ratio.Ratio i) where+	xpickle	= HXT.xpWrap (+		fromRational . round',		-- Construct from a Double.+		\x -> realToFrac x :: Double	-- Deconstruct to a Double.+	 ) HXT.xpPrim++instance (Integral r, System.Random.Random r) => System.Random.Random (Data.Ratio.Ratio r) where+	random		= System.Random.randomR (0, 1)+	randomR bounds	= Control.Arrow.first (\x -> realToFrac (x :: Double)) . System.Random.randomR (realToFrac *** realToFrac $ bounds)
+ src-lib/WeekDaze/Enhanced/EnhancedTuple.hs view
@@ -0,0 +1,67 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a /pickler/ for a specific tuple, to augment the ones packaged in "Text.XML.HXT.Arrow.Pickle".+-}++module WeekDaze.Enhanced.EnhancedTuple(+-- * Functions+	xp57Tuple+) where++import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import			Text.XML.HXT.Arrow.Pickle(PU)++-- | An extreme addition to the picklers packaged in "Text.XML.HXT.Arrow.Pickle".+xp57Tuple :: PU a0 -> PU a1 -> PU a2 -> PU a3 -> PU a4 -> PU a5 -> PU a6 -> PU a7 -> PU a8 -> PU a9 -> PU a10 -> PU a11 -> PU a12 -> PU a13 -> PU a14 -> PU a15 -> PU a16 -> PU a17 -> PU a18 -> PU a19 -> PU a20 -> PU a21 -> PU a22 -> PU a23 -> PU a24 -> PU a25 -> PU a26 -> PU a27 -> PU a28 -> PU a29 -> PU a30 -> PU a31 -> PU a32 -> PU a33 -> PU a34 -> PU a35 -> PU a36 -> PU a37 -> PU a38 -> PU a39 -> PU a40 -> PU a41 -> PU a42 -> PU a43 -> PU a44 -> PU a45 -> PU a46 -> PU a47 -> PU a48 -> PU a49 -> PU a50 -> PU a51 -> PU a52 -> PU a53 -> PU a54 -> PU a55 -> PU a56 -> PU (+	a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56+ )+xp57Tuple a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39 a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56	= HXT.xpWrap (+	\(+		(+			x0,	x1,	x2,	x3,	x4,	x5,	x6,	x7,	x8,	x9,	x10,	x11,	x12,	x13,	x14,	x15,	x16,	x17,	x18,	x19+		), (+			x20,	x21,	x22,	x23,	x24,	x25,	x26,	x27,	x28,	x29,	x30,	x31,	x32,	x33,	x34,	x35,	x36,	x37,	x38,	x39+		), (+			x40,	x41,	x42,	x43,	x44,	x45,	x46,	x47,	x48,	x49,	x50,	x51,	x52,	x53,	x54,	x55,	x56+		)+	) -> (+		x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x50, x51, x52, x53, x54, x55, x56+	), -- Construct from a Triple.+	\(+		x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x50, x51, x52, x53, x54, x55, x56+	) -> (+		(+			x0,	x1,	x2,	x3,	x4,	x5,	x6,	x7,	x8,	x9,	x10,	x11,	x12,	x13,	x14,	x15,	x16,	x17,	x18,	x19+		), (+			x20,	x21,	x22,	x23,	x24,	x25,	x26,	x27,	x28,	x29,	x30,	x31,	x32,	x33,	x34,	x35,	x36,	x37,	x38,	x39+		), (+			x40,	x41,	x42,	x43,	x44,	x45,	x46,	x47,	x48,	x49,	x50,	x51,	x52,	x53,	x54,	x55,	x56+		)+	) -- Deconstruct into a Triple.+ ) $ HXT.xpTriple (+	HXT.xp20Tuple	a0	a1	a2	a3	a4	a5	a6	a7	a8	a9	a10	a11	a12	a13	a14	a15	a16	a17	a18	a19+	) (+	HXT.xp20Tuple	a20	a21	a22	a23	a24	a25	a26	a27	a28	a29	a30	a31	a32	a33	a34	a35	a36	a37	a38	a39+	) (+	HXT.xp17Tuple	a40	a41	a42	a43	a44	a45	a46	a47	a48	a49	a50	a51	a52	a53	a54	a55	a56+ )+
+ src-lib/WeekDaze/ExecutionConfiguration/Criterion.hs view
@@ -0,0 +1,149 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines a single /criterion/, which quantifies the significant of some concept.+	These criteria represent /soft/-constraints of the problem;+	/hard/-constraints aren't relevent, because they are never allowed to be violated at all.++	* Many such criteria may exist, & their weighted-mean drives the selection+	amongst either competing /lesson/-definitions at a specific time-slot in the /timetable/,+	or between competing /timetable/s when attempting to optimise the solution.++	* Each /criterion/ is quantified by some 'Fractional' value,+	but since the weighted-mean should ideally be affected by the suitability of the solution rather than the dimensions of the problem,+	each is required to be normalised into the /closed unit-interval/.++ [@CAVEAT@]++	* While this data-type could implement the classes Num, Fractional & Real, these interfaces allow one to construct invalid instances.+-}++module WeekDaze.ExecutionConfiguration.Criterion(+-- * Types+-- ** Data-types+	Criterion(),+-- * Constants+	median,+-- * Functions+	invertNaturalNumbersIntoUnitInterval,+	invertWholeNumbersIntoUnitInterval,+	reflectUnitInterval,+	calculateWeightedMean,+-- ** Constructors+	mkCriterion,+	mkCriterionFrom+) where++import			Control.Arrow((&&&), (***))+import qualified	Control.Monad.Writer+import qualified	Factory.Math.Statistics+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight	as ExecutionConfiguration.CriterionWeight++{- |+	* Quantifies criteria used to assess the desirability of a /resource/.++	* The larger the value the better, relative to the same criterion applied other resources.+-}+newtype Criterion c	= MkCriterion {+	deconstruct	:: c+} deriving (Eq, Ord, Show)++instance Num c => Bounded (Criterion c) where+	minBound	= MkCriterion 0+	maxBound	= MkCriterion 1++-- | True if the specified 'criterion-weight' falls within the /closed unit-interval/; <https://en.wikipedia.org/wiki/Unit_interval>.+instance (Ord c, Real c) => ToolShed.SelfValidate.SelfValidator (Criterion c) where+	getErrors c	= ToolShed.SelfValidate.extractErrors [+		(+			any ($ c) [(< minBound), (> maxBound)],+			"'" ++ show (realToFrac $ deconstruct c :: Double {-hide the data-constructor & the actual type-}) ++ "' should be within the closed unit-interval '[0,1]'"+		) -- Pair.+	 ]++-- | Smart constructor.+mkCriterion :: Real c => String -> c -> Criterion c+mkCriterion name r+	| ToolShed.SelfValidate.isValid criterion	= criterion+	| otherwise					= error $ "WeekDaze.ExecutionConfiguration.Criterion.mkCriterion:\t" ++ show name ++ " " ++ ToolShed.SelfValidate.getFirstError criterion ++ "."+	where+		criterion	= MkCriterion r++-- | Build a /criterion/ from a 'Bool', arbitrarily assuming 'True' is better than 'False'.+mkCriterionFrom :: Num c => Bool -> Criterion c+mkCriterionFrom True	= maxBound+mkCriterionFrom _	= minBound++-- | Define the middle of the range of possible values.+median :: Fractional c => Criterion c+median	= MkCriterion $ recip 2++-- | Map a natural number into the unit-interval, by reflecting about 'one' & compressing the range; so that 'one' remains 'one', but 'infinity' becomes 'zero'.+invertNaturalNumbersIntoUnitInterval :: (Fractional f, Real f) => String -> f -> Criterion f+invertNaturalNumbersIntoUnitInterval name	= mkCriterion name . recip++-- | Map a whole number into the unit-interval, so that zero becomes one, & infinity becomes zero.+invertWholeNumbersIntoUnitInterval :: (+	Enum		c,+	Fractional	c,+	Real		c+ ) => String -> c -> Criterion c+invertWholeNumbersIntoUnitInterval name	= invertNaturalNumbersIntoUnitInterval name . succ {-avoid divide-by-zero-}++{- |+	* Reflect a number in the unit-interval, so that zero becomes one, & one becomes zero.++	* CAVEAT: if the number provided exceeds one, then an error will be generated.+-}+reflectUnitInterval :: Real c => String -> c -> Criterion c+reflectUnitInterval name	= mkCriterion name . (1 -)++{- |+	* Calculates the /weighted mean/ of the specified criterion-values using the corresponding criterion-weights.++	* Also writes individual unweighted criterion-values, to facilitate post-analysis;+	if the corresponding weight is zero, evaluation of the criterion is avoided,+	both for efficiency & to avoid the possibility of generating an error while evaluating a criterion which may have no validity in the context of the current problem.++	* CAVEAT: if all weights are zero, then the result can't be evaluated.+-}+calculateWeightedMean :: (+	Fractional	weightedMean,+	Real		criterionValue,+	Real		criterionWeight+ )+	=> [(Criterion criterionValue, ExecutionConfiguration.CriterionWeight.CriterionWeight criterionWeight)]+	-> Control.Monad.Writer.Writer [Maybe criterionValue] weightedMean+calculateWeightedMean assocList+	| all (+		(== minBound) . snd+	) assocList	= error "WeekDaze.ExecutionConfiguration.Criterion.calculateWeightedMean:\tzero weight => indeterminate result."+	| otherwise	= Control.Monad.Writer.writer . (+		Factory.Math.Statistics.getWeightedMean &&& map (+			\(criterionValue, criterionWeight)	-> if criterionWeight == 0+				then Nothing	-- Avoid unnecessary evaluation.+				else Just criterionValue+		)+	) $ map (deconstruct *** ExecutionConfiguration.CriterionWeight.deconstruct) assocList+
+ src-lib/WeekDaze/ExecutionConfiguration/CriterionWeight.hs view
@@ -0,0 +1,121 @@+{-# LANGUAGE CPP, FlexibleContexts, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the weight associated with some /criterion/.++	* Each weighting is quantified by some 'Fractional' value in the /closed unit-interval/; negative values aren't permitted.++	* If a concept is of no significance, then its weight can be set to /minBound/, whilst concepts of great significance can be set to /maxBound/.++ [@CAVEAT@]++	* While this data-type could implement the classes 'Functor', 'Num', 'Fractional' & 'Real', these interfaces allow one to construct invalid instances.+-}++module WeekDaze.ExecutionConfiguration.CriterionWeight(+-- * Type-classes+	CriterionWeights(..),+-- * Types+-- ** Data-types+	CriterionWeight(+--		MkCriterionWeight,+		deconstruct+	),+-- * Functions+-- ** Constructor+	mkCriterionWeight+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.SelfValidate++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Ratio+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector	as Database.Selector++instance (+	Data.Convertible.Convertible	Database.HDBC.SqlValue w,	-- Flexible context.+	Data.Typeable.Typeable		w,+	RealFrac			w+ ) => Data.Convertible.Convertible Database.HDBC.SqlValue (CriterionWeight w) {-multi-parameter type-class-} where+	safeConvert	= fmap (+		mkCriterionWeight . (+			\w -> if Data.Typeable.typeOf w == Data.Typeable.typeOf (undefined :: Data.Ratio.Rational)+				then realToFrac $ Database.Selector.round' w+				else w+		)+	 ) . Data.Convertible.safeConvert+#endif /* USE_HDBC */++{- |+	* Quantifies the relative significance, of criteria used to assess the desirability of a /resource/.++	* The larger the value, the more significant the criterion; relative to other criteria applicable to the same resource.+-}+newtype CriterionWeight w	= MkCriterionWeight {+	deconstruct	:: w+} deriving (Eq, Ord, Show)++instance Num w => Bounded (CriterionWeight w) where+	minBound	= MkCriterionWeight 0+	maxBound	= MkCriterionWeight 1++-- | True if the specified 'criterion-weight' falls within the /closed unit-interval/; <https://en.wikipedia.org/wiki/Unit_interval>.+instance Real w => ToolShed.SelfValidate.SelfValidator (CriterionWeight w) where+	getErrors w	= ToolShed.SelfValidate.extractErrors [+		(+			any ($ w) [(< minBound), (> maxBound)],+			"'" ++ show (realToFrac $ deconstruct w :: Double {-hide the data-constructor & the actual type-}) ++ "' should be within the closed unit-interval '[0,1]'"+		) -- Pair.+	 ]++instance Num w => Data.Default.Default (CriterionWeight w) where+	def	= minBound++instance (HXT.XmlPickler w, Real w) => HXT.XmlPickler (CriterionWeight w) where+	xpickle	= HXT.xpWrap (mkCriterionWeight, deconstruct) HXT.xpickle	-- CAVEAT: only apply 'HXT.xpDefault' after 'HXT.xpAttr' or 'HXT.xpElem'.++instance Control.DeepSeq.NFData w => Control.DeepSeq.NFData (CriterionWeight w) where+	rnf	= Control.DeepSeq.rnf . deconstruct++-- | Smart constructor.+mkCriterionWeight :: Real w => w -> CriterionWeight w+mkCriterionWeight w+	| ToolShed.SelfValidate.isValid criterionWeight	= criterionWeight+	| otherwise					= error $ "WeekDaze.ExecutionConfiguration.CriterionWeight.mkCriterionWeight:\t" ++ ToolShed.SelfValidate.getFirstError criterionWeight ++ "."+	where+		criterionWeight	= MkCriterionWeight w++-- | An interface to which a collection of criteria-weights may conform.+class CriterionWeights a where+	areAllZero	:: a -> Bool	-- ^ True if all the weights are zero.++instance (Bounded a, Eq a) => CriterionWeights [a] where+	areAllZero	= all (== minBound)+
+ src-lib/WeekDaze/ExecutionConfiguration/EvolutionStrategies.hs view
@@ -0,0 +1,637 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the extent to which various strategies are applied in an attempt to evolve the /timetable/.+-}++module WeekDaze.ExecutionConfiguration.EvolutionStrategies(+-- * Types+-- ** Type-synonyms+--	Mutator,+-- ** Data-types+	EvolutionStrategies(..),+-- * Constants+--	tag,+	synchronisedCourseMutationTag,+	synchronisedCourseByDayMutationTag,+	excessRunlengthMutationTag,+	homogeneousStudentViewLessonMutationTag,+	incompleteCourseMutationTag,+	randomLessonMutationTag,+	singletonStudentClassMutationTag,+	splitSessionMutationTag,+	studentBodyCombinationMutationTag,+	studentViewTimetableForDayMutationTag,+	studentViewTimetableForWeekMutationTag,+	synchronousLessonMutationTag,+--	randomLessonMutationNTrialsTag,+--	randomLessonMutationNTimeslotsTag,+--	studentViewTimetableForDayMutationNDaysTag,+--	studentViewTimetableForWeekMutationNTrialsTag,+--	studentViewTimetableForWeekMutationNTimeslotsTag,+	fecundityDecayRatioTag,+	minimumPopulationDiversityRatioTag,+	nInitialScoutsTag,+-- * Functions+-- ** Mutators+	zeroSynchronisedCourseMutationFecundity,+	zeroSynchronisedCourseByDayMutationFecundity,+	zeroExcessRunlengthMutationFecundity,+--	zeroHomogeneousStudentViewLessonMutationFecundity,+--	zeroIncompleteCourseMutationFecundity,+--	zeroRandomLessonMutationFecundity,+	zeroSingletonStudentClassMutationFecundity,+	zeroSplitSessionMutationFecundity,+	zeroStudentBodyCombinationMutationFecundity,+--	zeroStudentViewTimetableForDayMutationFecundity,+--	zeroStudentViewTimetableForWeekMutationFecundity,+--	zeroSynchronousLessonMutationFecundity,+-- ** Predicates+	areAllZero+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Text.XML.HXT.Arrow.Pickle					as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity	as ExecutionConfiguration.TimetableBreederFecundity+import qualified	WeekDaze.Size							as Size+import qualified	WeekDaze.Temporal.Day						as Temporal.Day++#ifdef USE_HDBC+import			Control.Arrow((&&&))+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector					as Database.Selector++instance (+	Data.Convertible.Convertible	Database.HDBC.SqlValue fecundityDecayRatio,		-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue populationDiversityRatio,	-- Flexible context.+	Data.Typeable.Typeable		fecundityDecayRatio,+	Data.Typeable.Typeable		populationDiversityRatio,+	RealFrac			fecundityDecayRatio,+	RealFrac			populationDiversityRatio+ ) => Database.Selector.Selector (EvolutionStrategies fecundityDecayRatio populationDiversityRatio) where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= Database.Selector.tablePrefix ++ tag+	 in do+		strategiesRows	<- Database.Selector.select connection [+			"synchronisedCourseMutationDeterministicCTor",+			"synchronisedCourseMutationRandomCTor",+			"synchronisedCourseByDayMutationDeterministicCTor",+			"synchronisedCourseByDayMutationRandomCTor",+			"excessRunlengthMutationDeterministicCTor",+			"excessRunlengthMutationRandomCTor",+			"homogeneousStudentViewLessonMutationDeterministicCTor",+			"homogeneousStudentViewLessonMutationRandomCTor",+			"incompleteCourseMutationDeterministicCTor",+			"incompleteCourseMutationRandomCTor",+			"randomLessonMutationDeterministicCTor",+			"randomLessonMutationRandomCTor",+			"singletonStudentClassMutationDeterministicCTor",+			"singletonStudentClassMutationRandomCTor",+			"splitSessionMutationDeterministicCTor",+			"splitSessionMutationRandomCTor",+			"studentBodyCombinationMutationDeterministicCTor",+			"studentBodyCombinationMutationRandomCTor",+			"studentViewTimetableForDayMutationDeterministicCTor",+			"studentViewTimetableForDayMutationRandomCTor",+			"studentViewTimetableForWeekMutationDeterministicCTor",+			"studentViewTimetableForWeekMutationRandomCTor",+			"synchronousLessonMutationDeterministicCTor",+			"synchronousLessonMutationRandomCTor",+			randomLessonMutationNTrialsTag,+			randomLessonMutationNTimeslotsTag,+			studentViewTimetableForDayMutationNDaysTag,+			studentViewTimetableForWeekMutationNTrialsTag,+			studentViewTimetableForWeekMutationNTimeslotsTag,+			fecundityDecayRatioTag,+			minimumPopulationDiversityRatioTag,+			nInitialScoutsTag+		 ] [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-Monad-} $ case strategiesRows of+			[]		-> Data.Default.def+			[strategiesRow]	-> case strategiesRow of+				[+					synchronisedCourseMutationDeterministicConstructorFecunditySql,+					synchronisedCourseMutationRandomConstructorFecunditySql,+					synchronisedCourseByDayMutationDeterministicConstructorFecunditySql,+					synchronisedCourseByDayMutationRandomConstructorFecunditySql,+					excessRunlengthMutationDeterministicConstructorFecunditySql,+					excessRunlengthMutationRandomConstructorFecunditySql,+					homogeneousStudentViewLessonMutationDeterministicConstructorFecunditySql,+					homogeneousStudentViewLessonMutationRandomConstructorFecunditySql,+					incompleteCourseMutationDeterministicConstructorFecunditySql,+					incompleteCourseMutationRandomConstructorFecunditySql,+					randomLessonMutationDeterministicConstructorFecunditySql,+					randomLessonMutationRandomConstructorFecunditySql,+					singletonStudentClassMutationDeterministicConstructorFecunditySql,+					singletonStudentClassMutationRandomConstructorFecunditySql,+					splitSessionMutationDeterministicConstructorFecunditySql,+					splitSessionMutationRandomConstructorFecunditySql,+					studentBodyCombinationMutationDeterministicConstructorFecunditySql,+					studentBodyCombinationMutationRandomConstructorFecunditySql,+					studentViewTimetableForDayMutationDeterministicConstructorFecunditySql,+					studentViewTimetableForDayMutationRandomConstructorFecunditySql,+					studentViewTimetableForWeekMutationDeterministicConstructorFecunditySql,+					studentViewTimetableForWeekMutationRandomConstructorFecunditySql,+					synchronousLessonMutationDeterministicConstructorFecunditySql,+					synchronousLessonMutationRandomConstructorFecunditySql,+					randomLessonMutationNTrialsSql,+					randomLessonMutationNTimeslotsSql,+					studentViewTimetableForDayMutationNDaysSql,+					studentViewTimetableForWeekMutationNTrialsSql,+					studentViewTimetableForWeekMutationNTimeslotsSql,+					fecundityDecayRatioSql,+					minimumPopulationDiversityRatioSql,+					nInitialScoutsSql+				 ] -> let+					mkTimetableBreederFecundity x y	= ExecutionConfiguration.TimetableBreederFecundity.mkTimetableBreederFecundity (+						Data.Maybe.fromMaybe defaultDeterministicFecundity . either (+							error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase.mkTimetableBreederFecundity:\tfailed to parse the value for the 'deterministic fecundity' read from the database; " . show+						) id $ Database.HDBC.safeFromSql x+					 ) (+						Data.Maybe.fromMaybe defaultRandomFecundity . either (+							error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase.mkTimetableBreederFecundity:\tfailed to parse the value for the 'random fecundity' read from the database; " . show+						) id $ Database.HDBC.safeFromSql y+					 ) where+						(defaultDeterministicFecundity, defaultRandomFecundity)	= ExecutionConfiguration.TimetableBreederFecundity.getDeterministicConstructorFecundity &&& ExecutionConfiguration.TimetableBreederFecundity.getRandomConstructorFecundity $ Data.Default.def++					def	= Data.Default.def+				 in MkEvolutionStrategies {+					getSynchronisedCourseMutationFecundity			= mkTimetableBreederFecundity synchronisedCourseMutationDeterministicConstructorFecunditySql synchronisedCourseMutationRandomConstructorFecunditySql,+					getSynchronisedCourseByDayMutationFecundity		= mkTimetableBreederFecundity synchronisedCourseByDayMutationDeterministicConstructorFecunditySql synchronisedCourseByDayMutationRandomConstructorFecunditySql,+					getExcessRunlengthMutationFecundity			= mkTimetableBreederFecundity excessRunlengthMutationDeterministicConstructorFecunditySql excessRunlengthMutationRandomConstructorFecunditySql,+					getHomogeneousStudentViewLessonMutationFecundity	= mkTimetableBreederFecundity homogeneousStudentViewLessonMutationDeterministicConstructorFecunditySql homogeneousStudentViewLessonMutationRandomConstructorFecunditySql,+					getIncompleteCourseMutationFecundity			= mkTimetableBreederFecundity incompleteCourseMutationDeterministicConstructorFecunditySql incompleteCourseMutationRandomConstructorFecunditySql,+					getRandomLessonMutationFecundity			= mkTimetableBreederFecundity randomLessonMutationDeterministicConstructorFecunditySql randomLessonMutationRandomConstructorFecunditySql,+					getSingletonStudentClassMutationFecundity		= mkTimetableBreederFecundity singletonStudentClassMutationDeterministicConstructorFecunditySql singletonStudentClassMutationRandomConstructorFecunditySql,+					getSplitSessionMutationFecundity			= mkTimetableBreederFecundity splitSessionMutationDeterministicConstructorFecunditySql splitSessionMutationRandomConstructorFecunditySql,+					getStudentBodyCombinationMutationFecundity		= mkTimetableBreederFecundity studentBodyCombinationMutationDeterministicConstructorFecunditySql studentBodyCombinationMutationRandomConstructorFecunditySql,+					getStudentViewTimetableForDayMutationFecundity		= mkTimetableBreederFecundity studentViewTimetableForDayMutationDeterministicConstructorFecunditySql studentViewTimetableForDayMutationRandomConstructorFecunditySql,+					getStudentViewTimetableForWeekMutationFecundity		= mkTimetableBreederFecundity studentViewTimetableForWeekMutationDeterministicConstructorFecunditySql studentViewTimetableForWeekMutationRandomConstructorFecunditySql,+					getSynchronousLessonMutationFecundity			= mkTimetableBreederFecundity synchronousLessonMutationDeterministicConstructorFecunditySql synchronousLessonMutationRandomConstructorFecunditySql,+					getRandomLessonMutationNTrials				= Data.Maybe.fromMaybe (getRandomLessonMutationNTrials def) . either (+						error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tfailed to parse the value for " . shows randomLessonMutationNTrialsTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql randomLessonMutationNTrialsSql,+					getRandomLessonMutationNTimeslots			= Data.Maybe.fromMaybe (getRandomLessonMutationNTimeslots def) . either (+						error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tfailed to parse the value for " . shows randomLessonMutationNTimeslotsTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql randomLessonMutationNTimeslotsSql,+					getStudentViewTimetableForDayMutationMaybeNDays		= either (+						error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tfailed to parse the value for " . shows studentViewTimetableForDayMutationNDaysTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql studentViewTimetableForDayMutationNDaysSql,	-- Returns 'Nothing' for SqlNull.+					getStudentViewTimetableForWeekMutationNTrials		= Data.Maybe.fromMaybe (getStudentViewTimetableForWeekMutationNTrials def) . either (+						error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tfailed to parse the value for " . shows studentViewTimetableForWeekMutationNTrialsTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql studentViewTimetableForWeekMutationNTrialsSql,+					getStudentViewTimetableForWeekMutationNTimeslots	= Data.Maybe.fromMaybe (getStudentViewTimetableForWeekMutationNTimeslots def) . either (+						error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tfailed to parse the value for " . shows studentViewTimetableForWeekMutationNTimeslotsTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql studentViewTimetableForWeekMutationNTimeslotsSql,+					getFecundityDecayRatio					= Database.Selector.fromSqlFractional (getFecundityDecayRatio def) fecundityDecayRatioSql,+					getMinimumPopulationDiversityRatio			= Database.Selector.fromSqlFractional (getMinimumPopulationDiversityRatio def) minimumPopulationDiversityRatioSql,+					getMaybeNInitialScouts					= either (+						error . showString "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tfailed to parse the value for " . shows nInitialScoutsTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql nInitialScoutsSql	-- Returns 'Nothing' for SqlNull.+				}+				_ -> error $ "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tunexpected number of columns=" ++ show (length strategiesRow) ++ " in row of table " ++ show tableName ++ "."+			_		-> error $ "WeekDaze.ExecutionConfiguration.EvolutionStrategies.fromDatabase:\tunexpected number of rows=" ++ show (length strategiesRows) ++ " selected from table " ++ show tableName ++ "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag							= "evolutionStrategies"++-- | Used to qualify XML.+synchronisedCourseMutationTag :: String+synchronisedCourseMutationTag				= "synchronisedCourseMutation"++-- | Used to qualify XML.+synchronisedCourseByDayMutationTag :: String+synchronisedCourseByDayMutationTag			= "synchronisedCourseByDayMutation"++-- | Used to qualify XML.+excessRunlengthMutationTag :: String+excessRunlengthMutationTag				= "excessRunlengthMutation"++-- | Used to qualify XML.+homogeneousStudentViewLessonMutationTag :: String+homogeneousStudentViewLessonMutationTag			= "homogeneousStudentViewLessonMutation"++-- | Used to qualify XML.+incompleteCourseMutationTag :: String+incompleteCourseMutationTag				= "incompleteCourseMutation"++-- | Used to qualify XML.+randomLessonMutationTag :: String+randomLessonMutationTag					= "randomLessonMutation"++-- | Used to qualify XML.+singletonStudentClassMutationTag :: String+singletonStudentClassMutationTag			= "singletonStudentClassMutation"++-- | Used to qualify XML.+splitSessionMutationTag :: String+splitSessionMutationTag					= "splitSessionMutation"++-- | Used to qualify XML.+studentBodyCombinationMutationTag :: String+studentBodyCombinationMutationTag			= "studentBodyCombinationMutation"++-- | Used to qualify XML.+studentViewTimetableForDayMutationTag :: String+studentViewTimetableForDayMutationTag			= "studentViewTimetableForDayMutation"++-- | Used to qualify XML.+studentViewTimetableForWeekMutationTag :: String+studentViewTimetableForWeekMutationTag			= "studentViewTimetableForWeekMutation"++-- | Used to qualify XML.+synchronousLessonMutationTag :: String+synchronousLessonMutationTag				= "synchronousLessonMutation"++-- | Used to qualify SQL & XML.+randomLessonMutationNTrialsTag :: String+randomLessonMutationNTrialsTag				= "randomLessonMutationNTrials"++-- | Used to qualify SQL & XML.+randomLessonMutationNTimeslotsTag :: String+randomLessonMutationNTimeslotsTag			= "randomLessonMutationNTimeslots"++-- | Used to qualify SQL & XML.+studentViewTimetableForDayMutationNDaysTag :: String+studentViewTimetableForDayMutationNDaysTag		= "studentViewTimetableForDayMutationNDays"++-- | Used to qualify SQL & XML.+studentViewTimetableForWeekMutationNTrialsTag :: String+studentViewTimetableForWeekMutationNTrialsTag		= "studentViewTimetableForWeekMutationNTrials"++-- | Used to qualify SQL & XML.+studentViewTimetableForWeekMutationNTimeslotsTag :: String+studentViewTimetableForWeekMutationNTimeslotsTag	= "studentViewTimetableForWeekMutationNTimeslots"++-- | Used to qualify XML.+fecundityDecayRatioTag :: String+fecundityDecayRatioTag					= "fecundityDecayRatio"++-- | Used to qualify XML.+minimumPopulationDiversityRatioTag :: String+minimumPopulationDiversityRatioTag			= "minimumPopulationDiversityRatio"++-- | Used to qualify XML.+nInitialScoutsTag :: String+nInitialScoutsTag					= "nInitialScouts"++-- | Defines the various strategies used to evolve the /timetable/.+data EvolutionStrategies fecundityDecayRatio populationDiversityRatio = MkEvolutionStrategies {+	getSynchronisedCourseMutationFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking the /lesson/s of /synchronised course/s, before (deterministically, randomly) reconstructing.+	getSynchronisedCourseByDayMutationFecundity		:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking synchronous groups of /lesson/s for /synchronised course/s, before (deterministically, randomly) reconstructing.+	getExcessRunlengthMutationFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking the terminal /lesson/s of excessive runlengths, before (deterministically, randomly) reconstructing.+	getHomogeneousStudentViewLessonMutationFecundity	:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking groups of homogeneous /student-view lesson/s, before (deterministically, randomly) reconstructing.+	getIncompleteCourseMutationFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking all the /lesson/s for incomplete /course/s, in the /timetable/ for each /student/, before (deterministically, randomly) reconstructing.+	getRandomLessonMutationFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking random /lesson/s from the /timetable/, before (deterministically, randomly) reconstructing.+	getSingletonStudentClassMutationFecundity		:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking /lesson/s whose /student-classes/ have been composed from a single /student-body/, before (deterministically, randomly) reconstructing.+	getSplitSessionMutationFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking runlengths of /lesson/s which occur in split sessions within a /day/, before (deterministically, randomly) reconstructing.+	getStudentBodyCombinationMutationFecundity		:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking /lesson/s for a /course/, whose /student-classes/ have been composed from more than one combination of /student-bodies/, before (deterministically, randomly) reconstructing.+	getStudentViewTimetableForDayMutationFecundity		:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking a whole day, from each /studentViewTimetableForWeek/ in isolation, before (deterministically, randomly) reconstructing.+	getStudentViewTimetableForWeekMutationFecundity		:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking a small number of randomly selected /lesson/s, from each /studentViewTimetableForWeek/ in isolation, before (deterministically, randomly) reconstructing.+	getSynchronousLessonMutationFecundity			:: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity,	-- ^ Whether to attempt to evolve the /timetable/, by unbooking groups of synchronous of heterogeneous /lesson/s.+	getRandomLessonMutationNTrials				:: Int,										-- ^ The number of random trials to perform in 'getRandomLessonMutationFecundity'.+	getRandomLessonMutationNTimeslots			:: Size.NTimeslots,								-- ^ The number of /time-slot/s to randomly unbook in 'getRandomLessonMutationFecundity'.+	getStudentViewTimetableForDayMutationMaybeNDays		:: Maybe Size.NDays,								-- ^ The optional number of /day/s to unbook in 'getStudentViewTimetableForDayMutationFecundity'; if 'Nothing' then all possible values are tried.+	getStudentViewTimetableForWeekMutationNTrials		:: Int,										-- ^ The number of random trials to perform in 'getStudentViewTimetableForWeekMutationFecundity'.+	getStudentViewTimetableForWeekMutationNTimeslots	:: Size.NTimeslots,								-- ^ The number of /time-slot/s to randomly unbook in 'getStudentViewTimetableForWeekMutationFecundity'.+	getFecundityDecayRatio					:: fecundityDecayRatio,								-- ^ The factor (in the closed unit-interval) by which the /fecundity/ of the breeding-program for future generations, is multiplied (& therefore reduced), when the /population-diversity ratio/ falls beneath 'getMinimumPopulationDiversityRatio'.+	getMinimumPopulationDiversityRatio			:: populationDiversityRatio,							-- ^ The /population-diversity ratio/ (in the closed unit-interval), beneath which a reduction in the /fecundity/ of the breeding-program for future generations, by a factor of 'getFecundityDecayRatio', is triggered.+	getMaybeNInitialScouts					:: Maybe Size.NTimetables							-- ^ The initial number of candidates to select from each generation in the evolution of the /timetable/; if 'Nothing' then all candidates measuring equal best & better than their parent, will be selected.+} deriving (Eq, Show)++instance (Fractional fecundityDecayRatio, Fractional populationDiversityRatio) => Data.Default.Default (EvolutionStrategies fecundityDecayRatio populationDiversityRatio) where+	def = MkEvolutionStrategies {+		getSynchronisedCourseMutationFecundity			= Data.Default.def,+		getSynchronisedCourseByDayMutationFecundity		= Data.Default.def,+		getExcessRunlengthMutationFecundity			= Data.Default.def,+		getHomogeneousStudentViewLessonMutationFecundity	= Data.Default.def,+		getIncompleteCourseMutationFecundity			= Data.Default.def,+		getRandomLessonMutationFecundity			= Data.Default.def,+		getSingletonStudentClassMutationFecundity		= Data.Default.def,+		getSplitSessionMutationFecundity			= Data.Default.def,+		getStudentBodyCombinationMutationFecundity		= Data.Default.def,+		getStudentViewTimetableForDayMutationFecundity		= Data.Default.def,+		getStudentViewTimetableForWeekMutationFecundity		= Data.Default.def,+		getSynchronousLessonMutationFecundity			= Data.Default.def,+		getRandomLessonMutationNTrials				= 256,+		getRandomLessonMutationNTimeslots			= 3,		-- Empirically found to be approximately optimal; though 4 may be better when the strategy is used in isolation.+		getStudentViewTimetableForDayMutationMaybeNDays		= Nothing,	-- Try all valid values for the number of days.+		getStudentViewTimetableForWeekMutationNTrials		= 16,		-- When multiplied by the number of student-bodies, should be approximately the required fecundity.+		getStudentViewTimetableForWeekMutationNTimeslots	= 4,		-- Empirically found to be approximately optimal.+		getFecundityDecayRatio					= recip 2,	-- Rather arbitrarily.+		getMinimumPopulationDiversityRatio			= recip 2,	-- Rather arbitrarily.+		getMaybeNInitialScouts					= Nothing	-- Select all candidates until the quality drops.+	}++instance (+	Fractional	fecundityDecayRatio,+	Fractional	populationDiversityRatio,+	HXT.XmlPickler	fecundityDecayRatio,+	HXT.XmlPickler	populationDiversityRatio,+	Ord		fecundityDecayRatio,+	Ord		populationDiversityRatio,+	Show		fecundityDecayRatio,+	Show		populationDiversityRatio+ ) => HXT.XmlPickler (EvolutionStrategies fecundityDecayRatio populationDiversityRatio) where+	xpickle	= HXT.xpDefault defaultEvolutionStrategies . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)	-> let+			evolutionStrategies	= MkEvolutionStrategies a b c d e f g h i j k l m n o p q r s t	-- Construct from a tuple.+		in if ToolShed.SelfValidate.isValid evolutionStrategies+			then evolutionStrategies+			else error $ "WeekDaze.ExecutionConfiguration.EvolutionStrategies.xpickle:\t" ++ ToolShed.SelfValidate.getFirstError evolutionStrategies ++ ".",+		\MkEvolutionStrategies {+			getSynchronisedCourseMutationFecundity			= synchronisedCourseMutationFecundity,+			getSynchronisedCourseByDayMutationFecundity		= synchronisedCourseByDayMutationFecundity,+			getExcessRunlengthMutationFecundity			= excessRunlengthMutationFecundity,+			getHomogeneousStudentViewLessonMutationFecundity	= homogeneousStudentViewLessonMutationFecundity,+			getIncompleteCourseMutationFecundity			= incompleteCourseMutationFecundity,+			getRandomLessonMutationFecundity			= randomLessonMutationFecundity,+			getSingletonStudentClassMutationFecundity		= singletonStudentClassMutationFecundity,+			getSplitSessionMutationFecundity			= splitSessionMutationFecundity,+			getStudentBodyCombinationMutationFecundity		= studentBodyCombinationMutationFecundity,+			getStudentViewTimetableForDayMutationFecundity		= studentViewTimetableForDayMutationFecundity,+			getStudentViewTimetableForWeekMutationFecundity		= studentViewTimetableForWeekMutationFecundity,+			getSynchronousLessonMutationFecundity			= synchronousLessonMutationFecundity,+			getRandomLessonMutationNTrials				= randomLessonMutationNTrials,+			getRandomLessonMutationNTimeslots			= randomLessonMutationNTimeslots,+			getStudentViewTimetableForDayMutationMaybeNDays		= studentViewTimetableForDayMutationMaybeNDays,+			getStudentViewTimetableForWeekMutationNTrials		= studentViewTimetableForWeekMutationNTrials,+			getStudentViewTimetableForWeekMutationNTimeslots	= studentViewTimetableForWeekMutationNTimeslots,+			getFecundityDecayRatio					= fecundityDecayRatio,+			getMinimumPopulationDiversityRatio			= minimumPopulationDiversityRatio,+			getMaybeNInitialScouts					= maybeNInitialScouts+		} -> (+			synchronisedCourseMutationFecundity,+			synchronisedCourseByDayMutationFecundity,+			excessRunlengthMutationFecundity,+			homogeneousStudentViewLessonMutationFecundity,+			incompleteCourseMutationFecundity,+			randomLessonMutationFecundity,+			singletonStudentClassMutationFecundity,+			splitSessionMutationFecundity,+			studentBodyCombinationMutationFecundity,+			studentViewTimetableForDayMutationFecundity,+			studentViewTimetableForWeekMutationFecundity,+			synchronousLessonMutationFecundity,+			randomLessonMutationNTrials,+			randomLessonMutationNTimeslots,+			studentViewTimetableForDayMutationMaybeNDays,+			studentViewTimetableForWeekMutationNTrials,+			studentViewTimetableForWeekMutationNTimeslots,+			fecundityDecayRatio,+			minimumPopulationDiversityRatio,+			maybeNInitialScouts+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp20Tuple (+		HXT.xpElem synchronisedCourseMutationTag HXT.xpickle+	 ) (+		HXT.xpElem synchronisedCourseByDayMutationTag HXT.xpickle+	 ) (+		HXT.xpElem excessRunlengthMutationTag HXT.xpickle+	 ) (+		HXT.xpElem homogeneousStudentViewLessonMutationTag HXT.xpickle+	 ) (+		HXT.xpElem incompleteCourseMutationTag HXT.xpickle+	 ) (+		HXT.xpElem randomLessonMutationTag HXT.xpickle+	 ) (+		HXT.xpElem singletonStudentClassMutationTag HXT.xpickle+	 ) (+		HXT.xpElem splitSessionMutationTag HXT.xpickle+	 ) (+		HXT.xpElem studentBodyCombinationMutationTag HXT.xpickle+	 ) (+		HXT.xpElem studentViewTimetableForDayMutationTag HXT.xpickle+	 ) (+		HXT.xpElem studentViewTimetableForWeekMutationTag HXT.xpickle+	 ) (+		HXT.xpElem synchronousLessonMutationTag HXT.xpickle+	 ) (+		HXT.xpDefault (getRandomLessonMutationNTrials defaultEvolutionStrategies) $ HXT.xpAttr randomLessonMutationNTrialsTag HXT.xpInt+	 ) (+		HXT.xpDefault (getRandomLessonMutationNTimeslots defaultEvolutionStrategies) $ HXT.xpAttr randomLessonMutationNTimeslotsTag HXT.xpInt+	 ) (+		HXT.xpOption $ HXT.xpAttr studentViewTimetableForDayMutationNDaysTag HXT.xpInt+	 ) (+		HXT.xpDefault (getStudentViewTimetableForWeekMutationNTrials defaultEvolutionStrategies) $ HXT.xpAttr studentViewTimetableForWeekMutationNTrialsTag HXT.xpInt+	 ) (+		HXT.xpDefault (getStudentViewTimetableForWeekMutationNTimeslots defaultEvolutionStrategies) $ HXT.xpAttr studentViewTimetableForWeekMutationNTimeslotsTag HXT.xpInt+	 ) (+		getFecundityDecayRatio defaultEvolutionStrategies `HXT.xpDefault` HXT.xpAttr fecundityDecayRatioTag HXT.xpickle+	 ) (+		getMinimumPopulationDiversityRatio defaultEvolutionStrategies `HXT.xpDefault` HXT.xpAttr minimumPopulationDiversityRatioTag HXT.xpickle+	 ) (+		HXT.xpOption $ HXT.xpAttr nInitialScoutsTag HXT.xpInt+	 ) where+		defaultEvolutionStrategies	= Data.Default.def++instance (+	Num	fecundityDecayRatio,+	Num	populationDiversityRatio,+	Ord	fecundityDecayRatio,+	Ord	populationDiversityRatio,+	Show	fecundityDecayRatio,+	Show	populationDiversityRatio+ ) => ToolShed.SelfValidate.SelfValidator (EvolutionStrategies fecundityDecayRatio populationDiversityRatio) where+	getErrors evolutionStrategies	= ToolShed.SelfValidate.extractErrors [+		(+			getRandomLessonMutationNTrials evolutionStrategies < 0,+			show randomLessonMutationNTrialsTag ++ " can't be negative; " ++ show evolutionStrategies+		), (+			getRandomLessonMutationNTimeslots evolutionStrategies < 0,+			show randomLessonMutationNTimeslotsTag ++ " can't be negative; " ++ show evolutionStrategies+		), (+			Data.Maybe.maybe False {-NDays unspecified-} (+				\nDays -> any ($ nDays) [(< 0), (> Temporal.Day.nDaysPerWeek)]+			) $ getStudentViewTimetableForDayMutationMaybeNDays evolutionStrategies,+			show studentViewTimetableForDayMutationNDaysTag ++ " (where specified) must be in the closed interval [0, " ++ show Temporal.Day.nDaysPerWeek ++ "]; " ++ show evolutionStrategies+		), (+			getStudentViewTimetableForWeekMutationNTrials evolutionStrategies < 0,+			show studentViewTimetableForWeekMutationNTrialsTag ++ " can't be negative; " ++ show evolutionStrategies+		), (+			getStudentViewTimetableForWeekMutationNTimeslots evolutionStrategies < 0,+			show studentViewTimetableForWeekMutationNTimeslotsTag ++ " can't be negative; " ++ show evolutionStrategies+		), (+			any ($ getFecundityDecayRatio evolutionStrategies) [(< 0), (> 1)],+			show fecundityDecayRatioTag ++ " must be within the closed unit-interval; " ++ show evolutionStrategies+		), (+			any ($ getMinimumPopulationDiversityRatio evolutionStrategies) [(< 0), (> 1)],+			show minimumPopulationDiversityRatioTag ++ " must be within the closed unit-interval; " ++ show evolutionStrategies+		), (+			Data.Maybe.maybe False {-NInitialScouts unspecified-} (< 1) $ getMaybeNInitialScouts evolutionStrategies,+			show nInitialScoutsTag ++ " can't be fewer than one"+		)+	 ]++instance (+	Control.DeepSeq.NFData	fecundityDecayRatio,+	Control.DeepSeq.NFData	populationDiversityRatio+ ) => Control.DeepSeq.NFData (EvolutionStrategies fecundityDecayRatio populationDiversityRatio) where+	rnf MkEvolutionStrategies {+		getSynchronisedCourseMutationFecundity			= synchronisedCourseMutationFecundity,+		getSynchronisedCourseByDayMutationFecundity		= synchronisedCourseByDayMutationFecundity,+		getExcessRunlengthMutationFecundity			= excessRunlengthMutationFecundity,+		getHomogeneousStudentViewLessonMutationFecundity	= homogeneousStudentViewLessonMutationFecundity,+		getIncompleteCourseMutationFecundity			= incompleteCourseMutationFecundity,+		getRandomLessonMutationFecundity			= randomLessonMutationFecundity,+		getSingletonStudentClassMutationFecundity		= singletonStudentClassMutationFecundity,+		getSplitSessionMutationFecundity			= splitSessionMutationFecundity,+		getStudentBodyCombinationMutationFecundity		= studentBodyCombinationMutationFecundity,+		getStudentViewTimetableForDayMutationFecundity		= studentViewTimetableForDayMutationFecundity,+		getStudentViewTimetableForWeekMutationFecundity		= studentViewTimetableForWeekMutationFecundity,+		getSynchronousLessonMutationFecundity			= synchronousLessonMutationFecundity,+		getRandomLessonMutationNTrials				= randomLessonMutationNTrials,+		getRandomLessonMutationNTimeslots			= randomLessonMutationNTimeslots,+		getStudentViewTimetableForDayMutationMaybeNDays		= studentViewTimetableForDayMutationMaybeNDays,+		getStudentViewTimetableForWeekMutationNTrials		= studentViewTimetableForWeekMutationNTrials,+		getStudentViewTimetableForWeekMutationNTimeslots	= studentViewTimetableForWeekMutationNTimeslots,+		getFecundityDecayRatio					= fecundityDecayRatio,+		getMinimumPopulationDiversityRatio			= minimumPopulationDiversityRatio,+		getMaybeNInitialScouts					= maybeNInitialScouts+	} = Control.DeepSeq.rnf (+		[+			synchronisedCourseMutationFecundity,+			synchronisedCourseByDayMutationFecundity,+			excessRunlengthMutationFecundity,+			homogeneousStudentViewLessonMutationFecundity,+			incompleteCourseMutationFecundity,+			randomLessonMutationFecundity,+			singletonStudentClassMutationFecundity,+			splitSessionMutationFecundity,+			studentBodyCombinationMutationFecundity,+			studentViewTimetableForDayMutationFecundity,+			studentViewTimetableForWeekMutationFecundity,+			synchronousLessonMutationFecundity+		],+		randomLessonMutationNTrials,+		randomLessonMutationNTimeslots,+		studentViewTimetableForDayMutationMaybeNDays,+		studentViewTimetableForWeekMutationNTrials,+		studentViewTimetableForWeekMutationNTimeslots,+		fecundityDecayRatio,+		minimumPopulationDiversityRatio,+		maybeNInitialScouts+	 )++-- | The type of any function which mutates an evolution-strategies.+type Mutator fecundityDecayRatio populationDiversityRatio	= EvolutionStrategies fecundityDecayRatio populationDiversityRatio -> EvolutionStrategies fecundityDecayRatio populationDiversityRatio++-- Mutator.+zeroSynchronisedCourseMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroSynchronisedCourseMutationFecundity evolutionStrategies	= evolutionStrategies {+	getSynchronisedCourseMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroSynchronisedCourseByDayMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroSynchronisedCourseByDayMutationFecundity evolutionStrategies	= evolutionStrategies {+	getSynchronisedCourseByDayMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroExcessRunlengthMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroExcessRunlengthMutationFecundity evolutionStrategies	= evolutionStrategies {+	getExcessRunlengthMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroHomogeneousStudentViewLessonMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroHomogeneousStudentViewLessonMutationFecundity evolutionStrategies	= evolutionStrategies {+	getHomogeneousStudentViewLessonMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroIncompleteCourseMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroIncompleteCourseMutationFecundity evolutionStrategies	= evolutionStrategies {+	getIncompleteCourseMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroRandomLessonMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroRandomLessonMutationFecundity evolutionStrategies	= evolutionStrategies {+	getRandomLessonMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroSingletonStudentClassMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroSingletonStudentClassMutationFecundity evolutionStrategies	= evolutionStrategies {+	getSingletonStudentClassMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroSplitSessionMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroSplitSessionMutationFecundity evolutionStrategies	= evolutionStrategies {+	getSplitSessionMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroStudentBodyCombinationMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroStudentBodyCombinationMutationFecundity evolutionStrategies	= evolutionStrategies {+	getStudentBodyCombinationMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroStudentViewTimetableForDayMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroStudentViewTimetableForDayMutationFecundity evolutionStrategies	= evolutionStrategies {+	getStudentViewTimetableForDayMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroStudentViewTimetableForWeekMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroStudentViewTimetableForWeekMutationFecundity evolutionStrategies	= evolutionStrategies {+	getStudentViewTimetableForWeekMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- Mutator.+zeroSynchronousLessonMutationFecundity :: Mutator fecundityDecayRatio populationDiversityRatio+zeroSynchronousLessonMutationFecundity evolutionStrategies	= evolutionStrategies {+	getSynchronousLessonMutationFecundity	= ExecutionConfiguration.TimetableBreederFecundity.zero+}++-- True when all /fecundities/ are zero.+areAllZero :: EvolutionStrategies fecundityDecayRatio populationDiversityRatio -> Bool+areAllZero evolutionStrategies	= all (+	(== ExecutionConfiguration.TimetableBreederFecundity.zero) . ($ evolutionStrategies)+ ) [+	getSynchronisedCourseMutationFecundity,+	getSynchronisedCourseByDayMutationFecundity,+	getExcessRunlengthMutationFecundity,+	getHomogeneousStudentViewLessonMutationFecundity,+	getIncompleteCourseMutationFecundity,+	getRandomLessonMutationFecundity,+	getSingletonStudentClassMutationFecundity,+	getSplitSessionMutationFecundity,+	getStudentBodyCombinationMutationFecundity,+	getStudentViewTimetableForDayMutationFecundity,+	getStudentViewTimetableForWeekMutationFecundity,+	getSynchronousLessonMutationFecundity+ ]+
+ src-lib/WeekDaze/ExecutionConfiguration/ExecutionOptions.hs view
@@ -0,0 +1,618 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the data which drives the solution-mechanism, as opposed to that which either defines the problem or describes the presentation of the solution.+-}++module WeekDaze.ExecutionConfiguration.ExecutionOptions(+-- * Types+-- ** Type-synonyms+--	Hint,+--	Mutator,+	RandomSeed,+	PermitTemporaryStudentBodyMerger,+	ReduceStudentBodyRegister,+	RemoveRedundantCourses,+-- ** Data-types+	ExecutionOptions(..),+-- * Constants+--	tag,+--	filePathTag,+	inputStudentViewTimetableTag,+	permitTemporaryStudentBodyMergerTag,+	randomSeedTag,+	reduceStudentBodyRegisterTag,+	removeRedundantCoursesTag,+	removePointlessGroupsTag,+	removeUnsubscribedGroupsTag,+	zeroInappropriateOptionsTag,+-- * Functions+-- ** Mutators+	setPermitTemporaryStudentBodyMerger,+	setSynchronisedCourseMutationFecundity,+	setSynchronisedCourseByDayMutationFecundity,+	setExcessRunlengthMutationFecundity,+	setFecundityDecayRatio,+	setHomogeneousStudentViewLessonMutationFecundity,+	setIncompleteCourseMutationFecundity,+	setMinimumPopulationDiversityRatio,+	setMaybeNInitialScouts,+	setSingletonStudentClassMutationFecundity,+	setSplitSessionMutationFecundity,+	setStudentBodyCombinationMutationFecundity,+	setStudentViewTimetableForDayMutationFecundity,+	setStudentViewTimetableForWeekMutationFecundity,+	setSynchronousLessonMutationFecundity,+-- ** Predicates+	hintWasSpecified+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle					as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Configuration						as Configuration+import qualified	WeekDaze.Enhanced.EnhancedEither				as Enhanced.EnhancedEither+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight			as ExecutionConfiguration.CriterionWeight+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies		as ExecutionConfiguration.EvolutionStrategies+import qualified	WeekDaze.ExecutionConfiguration.LessonCriteriaWeights		as ExecutionConfiguration.LessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights	as ExecutionConfiguration.OptimiseLessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity	as ExecutionConfiguration.TimetableBreederFecundity+import qualified	WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights	as ExecutionConfiguration.TimetableCriteriaWeights+import qualified	WeekDaze.Model.TimetableAxisTriple				as Model.TimetableAxisTriple+import qualified	WeekDaze.Size							as Size+import			WeekDaze.Enhanced.EnhancedBool()++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector					as Database.Selector+import qualified	WeekDaze.Model.TimetableAxis					as Model.TimetableAxis+import qualified	WeekDaze.Model.TimetableAxisTraversal				as Model.TimetableAxisTraversal++instance (+	Control.DeepSeq.NFData		criterionWeight,+	Control.DeepSeq.NFData		fecundityDecayRatio,+	Control.DeepSeq.NFData		populationDiversityRatio,+	Data.Convertible.Convertible	Database.HDBC.SqlValue criterionWeight,			-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue fecundityDecayRatio,		-- Flexible context.+	Data.Convertible.Convertible	Database.HDBC.SqlValue populationDiversityRatio,	-- Flexible context.+	Data.Typeable.Typeable		criterionWeight,+	Data.Typeable.Typeable		fecundityDecayRatio,+	Data.Typeable.Typeable		populationDiversityRatio,+	RealFrac			criterionWeight,+	RealFrac			fecundityDecayRatio,+	RealFrac			populationDiversityRatio+ ) => Database.Selector.Selector (ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	fromDatabase connection	projectIdSql	= let+		executionOptionsTableName, traversalOrderTableName :: Database.Selector.TableName+		executionOptionsTableName	= showString Database.Selector.tablePrefix tag+		traversalOrderTableName		= showString Database.Selector.tablePrefix Model.TimetableAxisTriple.tag+	 in do+		(evolutionStrategies, optimiseLessonCriteriaWeights, lessonCriteriaWeights, timetableCriteriaWeights)+#ifdef QUERY_DB_CONCURRENTLY+			<- Database.Selector.fromDatabaseConcurrently connection projectIdSql+#else+			<- Database.Selector.fromDatabase connection projectIdSql+#endif+		traversalOrderRows	<- Database.Selector.select connection [+			Model.TimetableAxisTraversal.senseTag,+			Model.TimetableAxis.tag+		 ] [traversalOrderTableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		executionOptionsRows	<- Database.Selector.select connection [+			randomSeedTag,+			permitTemporaryStudentBodyMergerTag,+			reduceStudentBodyRegisterTag,+			removeRedundantCoursesTag,+			removePointlessGroupsTag,+			removeUnsubscribedGroupsTag,+			zeroInappropriateOptionsTag+		 ] [executionOptionsTableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-Monad-} . (+			if null traversalOrderRows+				then id+				else case traversalOrderRows of+					[row1, row2, row3]	-> let+						mkAxisTraversal :: [Database.HDBC.SqlValue] -> Model.TimetableAxisTraversal.AxisTraversal+						mkAxisTraversal row	= case row of+							[senseSql, axisSql]	-> let+								axisTraversal	= Data.Maybe.fromMaybe "" (Database.HDBC.fromSql senseSql) ++ Database.HDBC.fromSql axisSql+							 in case reads axisTraversal of+								[(x, "")]	-> x+								_		-> error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase.mkAxisTraversal:\tfailed to parse " $ shows axisTraversal "."+							_			-> error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase.mkAxisTraversal:\tunexpected number of columns=" . shows (length row) . showString " in row of table " $ shows traversalOrderTableName "; two are expected."+					 in \executionOptions -> executionOptions {+						getMaybeHint	= Just . Left $ Model.TimetableAxisTriple.mkAxes (mkAxisTraversal row1, mkAxisTraversal row2, mkAxisTraversal row3) -- Triple.+					 }+					_			-> error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tunexpected number of rows=" . shows (length traversalOrderRows) . showString " selected from table " $ shows traversalOrderTableName "; three are expected."+		 ) . (+			case executionOptionsRows of+				[]			-> id+				[executionOptionsRow]	-> case executionOptionsRow of+					[+						randomSeedSql,+						permitTemporaryStudentBodyMergerSql,+						reduceStudentBodyRegisterSql,+						removeRedundantCoursesSql,+						removePointlessGroupsSql,+						removeUnsubscribedGroupsSql,+						zeroInappropriateOptionsSql+					 ] -> (+						\executionOptions -> executionOptions {+							getMaybeRandomSeed	= either (+								error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows randomSeedTag . showString " read from the database; " . show+							) id $ Database.HDBC.safeFromSql randomSeedSql+						}+					 ) . (+						\executionOptions -> Data.Maybe.maybe executionOptions (+							\value -> executionOptions { getPermitTemporaryStudentBodyMerger = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows permitTemporaryStudentBodyMergerTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql permitTemporaryStudentBodyMergerSql+					 ) . (+						\executionOptions -> Data.Maybe.maybe executionOptions (+							\value -> executionOptions { getReduceStudentBodyRegister = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows reduceStudentBodyRegisterTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql reduceStudentBodyRegisterSql+					 ) . (+						\executionOptions -> Data.Maybe.maybe executionOptions (+							\value -> executionOptions { getRemoveRedundantCourses = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows removeRedundantCoursesTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql removeRedundantCoursesSql+					 ) . (+						\executionOptions -> Data.Maybe.maybe executionOptions (+							\value -> executionOptions { getRemovePointlessGroups = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows removePointlessGroupsTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql removePointlessGroupsSql+					 ) . (+						\executionOptions -> Data.Maybe.maybe executionOptions (+							\value -> executionOptions { getRemoveUnsubscribedGroups = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows removeUnsubscribedGroupsTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql removeUnsubscribedGroupsSql+					 ) . (+						\executionOptions -> Data.Maybe.maybe executionOptions (+							\value -> executionOptions { getZeroInappropriateOptions = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tfailed to parse the value for " . shows zeroInappropriateOptionsTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql zeroInappropriateOptionsSql+					 )+					_ -> error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tunexpected number of columns=" . shows (length executionOptionsRow) . showString " in row of table " $ shows executionOptionsTableName "."+				_			-> error . showString "WeekDaze.ExecutionConfiguration.ExecutionOptions.fromDatabase:\tunexpected number of rows=" . shows (length executionOptionsRows) . showString " selected from table " $ shows executionOptionsTableName "."+		 ) $ (+			Data.Default.def	:: ExecutionOptions Rational Rational Rational	-- Arbitrarily.+		 ) {+			getEvolutionStrategies			= evolutionStrategies,+			getOptimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights,+			getLessonCriteriaWeights		= lessonCriteriaWeights,+			getTimetableCriteriaWeights		= timetableCriteriaWeights+		}+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag					= "executionOptions"++-- | Used to qualify XML.+filePathTag :: String+filePathTag				= "filePath"++-- | Used to qualify XML.+inputStudentViewTimetableTag :: String+inputStudentViewTimetableTag		= "inputStudentViewTimetable"++-- | Used to qualify SQL & XML.+permitTemporaryStudentBodyMergerTag :: String+permitTemporaryStudentBodyMergerTag	= "permitTemporaryStudentBodyMerger"++-- | Used to qualify SQL & XML.+randomSeedTag :: String+randomSeedTag				= "randomSeed"++-- | Used to qualify SQL & XML.+reduceStudentBodyRegisterTag :: String+reduceStudentBodyRegisterTag		= "reduceStudentBodyRegister"++-- | Used to qualify SQL & XML.+removeRedundantCoursesTag :: String+removeRedundantCoursesTag		= "removeRedundantCourses"++-- | Used to qualify SQL & XML.+removePointlessGroupsTag :: String+removePointlessGroupsTag		= "removePointlessGroups"++-- | Used to qualify SQL & XML.+removeUnsubscribedGroupsTag :: String+removeUnsubscribedGroupsTag		= "removeUnsubscribedGroups"++-- | Used to qualify SQL & XML.+zeroInappropriateOptionsTag :: String+zeroInappropriateOptionsTag		= "zeroInappropriateOptions"++-- | One can either define the raster-scan by which the initial solution is constructed, or specify an XML-file containing the initial solution.+type Hint				= Either Model.TimetableAxisTriple.Axes System.FilePath.FilePath++-- | A seed from which to construct a pseudo-random number-generator.+type RandomSeed				= Int++-- | Whether to permit /student-bodies/ to be temporarily merged for a /lesson/.+type PermitTemporaryStudentBodyMerger	= Bool++-- | Whether to automatically merge /student-bodies/ with identical profiles.+type ReduceStudentBodyRegister		= Bool++-- | Whether to remove /course/s for which there's zero demand.+type RemoveRedundantCourses		= Bool++-- | Encapsulates the data which drives the implementation.+data ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio	= MkExecutionOptions {+	getEvolutionStrategies			:: ExecutionConfiguration.EvolutionStrategies.EvolutionStrategies fecundityDecayRatio populationDiversityRatio,	-- ^ The extent to which various strategies are applied, in an attempt to evolve the /timetable/.+	getMaybeHint				:: Maybe Hint,													-- ^ Optionally define either the order in which a /timetable/'s axes are traversed during construction of the initial deterministic solution or a path to a file from which the initial /StudentView.Timetable.Timetable/ can be read; the default is to perform all traverses, & select the best.+	getMaybeRandomSeed			:: Maybe RandomSeed,												-- ^ Optionally seed the pseudo-random number-generator to produce a repeatable sequence.+	getOptimiseLessonCriteriaWeights	:: ExecutionConfiguration.OptimiseLessonCriteriaWeights.OptimiseLessonCriteriaWeights criterionWeight,		-- ^ Whether & how to optimise the weights of lesson-criteria by maximising the weighted mean of timetable-criteria for the initial deterministic timetable.+	getLessonCriteriaWeights		:: ExecutionConfiguration.LessonCriteriaWeights.LessonCriteriaWeights criterionWeight,				-- ^ The weight associated with criteria used to select a /lesson/, at a specific time-coordinate in the /timetable/.+	getPermitTemporaryStudentBodyMerger	:: PermitTemporaryStudentBodyMerger,										-- ^ Whether to permit a temporary merger between /student-bodies/, to permit a /teacher/ & /location/ to be shared for the duration of a /course/.+	getReduceStudentBodyRegister		:: ReduceStudentBodyRegister,											-- ^ Whether to permanently merge /student-bodies/ with identical profiles, thus reducing the number of independently schedulable entities.+	getRemoveRedundantCourses		:: RemoveRedundantCourses,											-- ^ Whether to remove any /courses/ offered, which aren't required by any /student/.+	getRemovePointlessGroups		:: Bool,													-- ^ Whether to remove /groups/ from the /group-catalogue/, for which zero /meetings/ have been timetable.+	getRemoveUnsubscribedGroups		:: Bool,													-- ^ Whether to remove /groups/ from the /group-catalogue/, to which neither /student-bodies/ nor /teachers/ have subscribed.+	getTimetableCriteriaWeights		:: ExecutionConfiguration.TimetableCriteriaWeights.TimetableCriteriaWeights criterionWeight,			-- ^ The weight associated with criteria used to evaluate a /timetable/, during optimisation.+	getZeroInappropriateOptions		:: Bool														-- ^ Whether to zero the weight of each /lesson-criterion/ & /timetable-criterion/, & the /fecundity/ of each /evolution-strategy/, which is either inappropriate for, or irrelevant to, the specified /problem-parameters/.+} deriving (Eq, Show)++instance (+	Fractional	criterionWeight,+	Fractional	fecundityDecayRatio,+	Fractional	populationDiversityRatio+ ) => Data.Default.Default (ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	def = MkExecutionOptions {+		getEvolutionStrategies			= Data.Default.def,+		getMaybeHint				= Nothing,+		getMaybeRandomSeed			= Nothing,+		getOptimiseLessonCriteriaWeights	= Data.Default.def,+		getLessonCriteriaWeights		= Data.Default.def,+		getPermitTemporaryStudentBodyMerger	= True,+		getReduceStudentBodyRegister		= True,+		getRemoveRedundantCourses		= True,+		getRemovePointlessGroups		= True,+		getRemoveUnsubscribedGroups		= True,+		getTimetableCriteriaWeights		= Data.Default.def,+		getZeroInappropriateOptions		= True+	}++instance (+	Num	fecundityDecayRatio,+	Num	populationDiversityRatio,+	Ord	fecundityDecayRatio,+	Ord	populationDiversityRatio,+	Real	criterionWeight,+	Show	criterionWeight,+	Show	fecundityDecayRatio,+	Show	populationDiversityRatio+ ) => ToolShed.SelfValidate.SelfValidator (ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	getErrors MkExecutionOptions {+		getEvolutionStrategies			= evolutionStrategies,+		getMaybeHint				= maybeHint,+		getOptimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights,+		getLessonCriteriaWeights		= lessonCriteriaWeights,+		getPermitTemporaryStudentBodyMerger	= permitTemporaryStudentBodyMerger,+		getTimetableCriteriaWeights		= timetableCriteriaWeights+	}+		| not $ ToolShed.SelfValidate.isValid evolutionStrategies		= ToolShed.SelfValidate.getErrors evolutionStrategies+		| not $ ToolShed.SelfValidate.isValid optimiseLessonCriteriaWeights	= ToolShed.SelfValidate.getErrors optimiseLessonCriteriaWeights+		| not $ ToolShed.SelfValidate.isValid lessonCriteriaWeights		= ToolShed.SelfValidate.getErrors lessonCriteriaWeights+		| not $ ToolShed.SelfValidate.isValid timetableCriteriaWeights		= ToolShed.SelfValidate.getErrors timetableCriteriaWeights+		| otherwise	= ToolShed.SelfValidate.extractErrors [+			(+				Data.Maybe.maybe False (const False `either` (not . System.FilePath.isValid)) maybeHint,+				"invalid file-path; " ++ show maybeHint+			), (+				permitTemporaryStudentBodyMerger && any (/= minBound) [+					ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverLocationCapacity lessonCriteriaWeights,+					ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverCourseClassSize lessonCriteriaWeights+				],+				"when " ++ permitTemporaryStudentBodyMergerTag ++ "=" ++ show permitTemporaryStudentBodyMerger ++ ", " ++ ExecutionConfiguration.LessonCriteriaWeights.tag ++ "={" ++ show ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseStudentClassSizeOverLocationCapacityTag ++ ", " ++ show ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseStudentClassSizeOverCourseClassSizeTag ++ "} should be zero"+			), (+				not permitTemporaryStudentBodyMerger && any (/= minBound) [+					ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseStudentBodyCombinations lessonCriteriaWeights,+					ExecutionConfiguration.LessonCriteriaWeights.getWeightOfAreResourcesReused lessonCriteriaWeights,+					ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson timetableCriteriaWeights+				],+				"when " ++ permitTemporaryStudentBodyMergerTag ++ "=" ++ show permitTemporaryStudentBodyMerger ++ ", " ++ ExecutionConfiguration.LessonCriteriaWeights.tag ++ "={" ++ show ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseStudentBodyCombinationsTag ++ ", " ++ show ExecutionConfiguration.LessonCriteriaWeights.weightOfAreResourcesReusedTag ++ "} & " ++ ExecutionConfiguration.TimetableCriteriaWeights.tag ++ "={" ++ show ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag ++ "} should be zero"+			)+		]++instance (+	Fractional	criterionWeight,+	Fractional	fecundityDecayRatio,+	Fractional	populationDiversityRatio,+	HXT.XmlPickler	criterionWeight,+	HXT.XmlPickler	fecundityDecayRatio,+	HXT.XmlPickler	populationDiversityRatio,+	Ord		fecundityDecayRatio,+	Ord		populationDiversityRatio,+	Real		criterionWeight,+	Show		criterionWeight,+	Show		fecundityDecayRatio,+	Show		populationDiversityRatio+ ) => HXT.XmlPickler (ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g, h, i, j, k, l)	-> MkExecutionOptions a b c d e f g h i j k l,	-- Construct from a tuple.+		\MkExecutionOptions {+			getEvolutionStrategies			= evolutionStrategies,+			getMaybeHint				= maybeHint,+			getMaybeRandomSeed			= maybeRandomSeed,+			getOptimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights,+			getLessonCriteriaWeights		= lessonCriteriaWeights,+			getPermitTemporaryStudentBodyMerger	= permitTemporaryStudentBodyMerger,+			getReduceStudentBodyRegister		= reduceStudentBodyRegister,+			getRemoveRedundantCourses		= removeRedundantCourses,+			getRemovePointlessGroups		= removePointlessGroups,+			getRemoveUnsubscribedGroups		= removeUnsubscribedGroups,+			getTimetableCriteriaWeights		= timetableCriteriaWeights,+			getZeroInappropriateOptions		= zeroInappropriateOptions+		} -> (+			evolutionStrategies,+			maybeHint,+			maybeRandomSeed,+			optimiseLessonCriteriaWeights,+			lessonCriteriaWeights,+			permitTemporaryStudentBodyMerger,+			reduceStudentBodyRegister,+			removeRedundantCourses,+			removePointlessGroups,+			removeUnsubscribedGroups,+			timetableCriteriaWeights,+			zeroInappropriateOptions+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp12Tuple HXT.xpickle {-evolutionStrategies-} (+		HXT.xpOption . Enhanced.EnhancedEither.xpickle HXT.xpickle {-traversalOrder-} . HXT.xpElem inputStudentViewTimetableTag $ HXT.xpTextAttr filePathTag+	 ) (+		HXT.xpAttrImplied randomSeedTag HXT.xpInt+	 ) HXT.xpickle {-optimiseLessonCriteriaWeights-} HXT.xpickle {-lessonCriteriaWeights-} (+		getPermitTemporaryStudentBodyMerger defaultExecutionOptions `HXT.xpDefault` HXT.xpAttr permitTemporaryStudentBodyMergerTag HXT.xpickle {-Bool-}+	 ) (+		getReduceStudentBodyRegister defaultExecutionOptions `HXT.xpDefault` HXT.xpAttr reduceStudentBodyRegisterTag HXT.xpickle {-Bool-}+	 ) (+		getRemoveRedundantCourses defaultExecutionOptions `HXT.xpDefault` HXT.xpAttr removeRedundantCoursesTag HXT.xpickle {-Bool-}+	 ) (+		getRemovePointlessGroups defaultExecutionOptions `HXT.xpDefault` HXT.xpAttr removePointlessGroupsTag HXT.xpickle {-Bool-}+	 ) (+		getRemoveUnsubscribedGroups defaultExecutionOptions `HXT.xpDefault` HXT.xpAttr removeUnsubscribedGroupsTag HXT.xpickle {-Bool-}+	 ) HXT.xpickle {-timetableCriteriaWeights-} (+		getZeroInappropriateOptions defaultExecutionOptions `HXT.xpDefault` HXT.xpAttr zeroInappropriateOptionsTag HXT.xpickle {-Bool-}+	 ) where+		defaultExecutionOptions :: ExecutionOptions Rational Rational Rational	-- The type-parameters are irrelevant & are therefore largely arbitrarily.+		defaultExecutionOptions	= Data.Default.def++instance (+	Control.DeepSeq.NFData	criterionWeight,+	Control.DeepSeq.NFData	fecundityDecayRatio,+	Control.DeepSeq.NFData	populationDiversityRatio+ ) => Control.DeepSeq.NFData (ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	rnf MkExecutionOptions {+		getEvolutionStrategies			= evolutionStrategies,+		getMaybeHint				= maybeHint,+		getMaybeRandomSeed			= maybeRandomSeed,+		getOptimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights,+		getLessonCriteriaWeights		= lessonCriteriaWeights,+		getPermitTemporaryStudentBodyMerger	= permitTemporaryStudentBodyMerger,+		getReduceStudentBodyRegister		= reduceStudentBodyRegister,+		getRemoveRedundantCourses		= removeRedundantCourses,+		getRemovePointlessGroups		= removePointlessGroups,+		getRemoveUnsubscribedGroups		= removeUnsubscribedGroups,+		getTimetableCriteriaWeights		= timetableCriteriaWeights,+		getZeroInappropriateOptions		= zeroInappropriateOptions+	} = Control.DeepSeq.rnf (+		evolutionStrategies,+		maybeHint,+		maybeRandomSeed,+		optimiseLessonCriteriaWeights,+		lessonCriteriaWeights,+		[+			permitTemporaryStudentBodyMerger,+			reduceStudentBodyRegister,+			removeRedundantCourses,+			removePointlessGroups,+			removeUnsubscribedGroups+		],+		timetableCriteriaWeights,+		zeroInappropriateOptions+	 )++-- | The type of a function used to transform 'ExecutionOptions'.+type Mutator criterionWeight fecundityDecayRatio populationDiversityRatio	= ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio -> ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio++{- |+	* Mutator.++	* If /student-bodies/ can be temporarily merged, allowing the size of /student-class/es to grow,+	then there's no obvious advantage to fitting this transient class-size to either the capacity of the /location/ or to any maximum class-size defined for the /course/;+	so 'ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverLocationCapacity' & 'ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverCourseClassSize' aren't relevant,+	equally if student-bodies can't be merged, then synchronous identical /lesson/s are permissible, so there's no point trying to promote them via 'ExecutionConfiguration.LessonCriteriaWeights.getWeightOfAreResourcesReused'.++	* Alternatively, if /student-bodies/ can't be temporarily merged into a variety of /student-classes/,+	then there's no concept of either 'ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseStudentBodyCombinations' or 'ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson'.+-}+setPermitTemporaryStudentBodyMerger :: Num criterionWeight => PermitTemporaryStudentBodyMerger -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setPermitTemporaryStudentBodyMerger permitTemporaryStudentBodyMerger executionOptions@MkExecutionOptions {+	getLessonCriteriaWeights	= lessonCriteriaWeights,+	getTimetableCriteriaWeights	= timetableCriteriaWeights+}+	| permitTemporaryStudentBodyMerger = executionOptions' {+		getLessonCriteriaWeights	= lessonCriteriaWeights {+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= minBound,	-- The student-class needs space for growth.+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= minBound	-- The student-class needs space for growth.+		} -- Turn off.+	}+	| otherwise = executionOptions' {+		getLessonCriteriaWeights	= lessonCriteriaWeights {+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseStudentBodyCombinations	= minBound,	-- Each student-class, has a single constant member.+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfAreResourcesReused		= minBound	-- Resources can only be reused by merging student-classes.+		}, -- Turn off.+		getTimetableCriteriaWeights	= timetableCriteriaWeights {+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson	= minBound,	-- The mean is constant (one) for all timetable.+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseMeanStudentClassSize			= minBound	-- The size of the student-class equals the size its single student-body.+		} -- Turn off.+	}+	where+		executionOptions'	= executionOptions { getPermitTemporaryStudentBodyMerger = permitTemporaryStudentBodyMerger }	-- Mutate the original request.++-- | Mutator.+setSynchronisedCourseMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setSynchronisedCourseMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setSynchronisedCourseByDayMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setSynchronisedCourseByDayMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseByDayMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setExcessRunlengthMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setExcessRunlengthMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getExcessRunlengthMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setFecundityDecayRatio :: fecundityDecayRatio -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setFecundityDecayRatio fecundityDecayRatio executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getFecundityDecayRatio	= fecundityDecayRatio+	}+}++-- | Mutator.+setHomogeneousStudentViewLessonMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setHomogeneousStudentViewLessonMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getHomogeneousStudentViewLessonMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setIncompleteCourseMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setIncompleteCourseMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getIncompleteCourseMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setMinimumPopulationDiversityRatio :: populationDiversityRatio -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setMinimumPopulationDiversityRatio populationDiversityRatio executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getMinimumPopulationDiversityRatio	= populationDiversityRatio+	}+}++-- | Mutator.+setMaybeNInitialScouts :: Maybe Size.NTimetables -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setMaybeNInitialScouts maybeNInitialScouts executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getMaybeNInitialScouts	= maybeNInitialScouts+	}+}++-- | Mutator.+setSingletonStudentClassMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setSingletonStudentClassMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getSingletonStudentClassMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setSplitSessionMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setSplitSessionMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getSplitSessionMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setStudentBodyCombinationMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setStudentBodyCombinationMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getStudentBodyCombinationMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setStudentViewTimetableForDayMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setStudentViewTimetableForDayMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForDayMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setStudentViewTimetableForWeekMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setStudentViewTimetableForWeekMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationFecundity	= timetableBreederFecundity+	}+}++-- | Mutator.+setSynchronousLessonMutationFecundity :: ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity -> Mutator criterionWeight fecundityDecayRatio populationDiversityRatio+setSynchronousLessonMutationFecundity timetableBreederFecundity executionOptions	= executionOptions {+	getEvolutionStrategies	= (getEvolutionStrategies executionOptions) {+		ExecutionConfiguration.EvolutionStrategies.getSynchronousLessonMutationFecundity	= timetableBreederFecundity+	}+}++-- | True if a (/traversalOrder/, /input file-path/) was specified.+hintWasSpecified :: ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio -> (Bool, Bool)+hintWasSpecified	= Data.Maybe.maybe (False, False) (const (True, False) `either` const (False, True)) . getMaybeHint++instance (+	Eq	criterionWeight,+	Num	criterionWeight+ ) => Configuration.Configuration (ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	issueWarnings executionOptions	= [+		msg | (True, msg) <- [+			(+				ExecutionConfiguration.CriterionWeight.areAllZero $ getTimetableCriteriaWeights executionOptions, {-lazy evaluation-}+				"the weights of all timetable-criteria are zero; the relative fitness of timetables cannot be measured"+			), (+				ExecutionConfiguration.EvolutionStrategies.areAllZero $ getEvolutionStrategies executionOptions,+				"the fecundities of all evolution-strategies are zero; evolution cannot occur"+			)+		 ]+	 ]
+ src-lib/WeekDaze/ExecutionConfiguration/LessonCriteriaWeights.hs view
@@ -0,0 +1,672 @@+{-# LANGUAGE CPP, FlexibleContexts, UndecidableInstances #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the weightings, associated with each of the /soft/-constraints, used to compare & select between alternative /lesson/-definitions,+	at each stage in the construction of a /timetable/.++	* /Hard/-constraints (e.g. that a /student/ or /teacher/ can't be in more than one place at a time,+	or that the capacity of a /location/ can't be exceeded),+	are never violated, & so don't need to be quantified for subsequent comparison.+-}++module WeekDaze.ExecutionConfiguration.LessonCriteriaWeights(+-- * Types+-- ** Type-synonyms+--	Mutator,+-- ** Data-types+	LessonCriteriaWeights(..),+-- * Constants+	associationList,+	tag,+	weightOfAreResourcesReusedTag,+	weightOfGreatestMinimumConsecutiveLessonsTag,+	weightOfGreatestRemainingCourseLessonsTag,+	weightOfGreatestSynchronisedCourseSetSizeTag,+	weightOfIsCoreKnowledgeRequirementTag,+	weightOfIsSpecialistInTopicTag,+	weightOfMatchCourseClassSizeToLocationCapacityTag,+	weightOfMaximiseRelativeFacilityUtilisationTag,+	weightOfMaximiseStudentClassSizeOverCourseClassSizeTag,+	weightOfMaximiseStudentClassSizeOverLocationCapacityTag,+	weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag,+	weightOfMinimiseBookingOfLocationByOtherTeachersTag,+	weightOfMinimiseDeviationFromTimeslotRequestTag,+	weightOfMinimiseInterCampusMigrationsOfStudentsTag,+	weightOfMinimiseInterCampusMigrationsOfTeachersTag,+	weightOfMinimiseStudentBodyCombinationsTag,+	weightOfMinimiseTeachersLocusOperandiTag,+	weightOfMinimiseWasteOfScarceFacilitiesTag,+-- * Functions+	calculateWeightedMean,+-- ** Mutators+--	normalise,+	perturbWeights,+--	zeroWeightOfAreResourcesReused,+	zeroWeightOfGreatestMinimumConsecutiveLessons,+--	zeroWeightOfGreatestRemainingCourseLessons,+	zeroWeightOfGreatestSynchronisedCourseSetSize,+	zeroWeightOfIsCoreKnowledgeRequirement,+	zeroWeightOfIsSpecialistInTopic,+	zeroWeightOfMatchCourseClassSizeToLocationCapacity,+	zeroWeightOfMaximiseRelativeFacilityUtilisation,+	zeroWeightOfMaximiseStudentClassSizeOverCourseClassSize,+	zeroWeightOfMaximiseStudentClassSizeOverLocationCapacity,+	zeroWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+	zeroWeightOfMinimiseBookingOfLocationByOtherTeachers,+	zeroWeightOfMinimiseDeviationFromTimeslotRequest,+	zeroWeightOfMinimiseInterCampusMigrationsOfStudents,+	zeroWeightOfMinimiseInterCampusMigrationsOfTeachers,+--	zeroWeightOfMinimiseStudentBodyCombinations,+	zeroWeightOfMinimiseTeachersLocusOperandi,+	zeroWeightOfMinimiseWasteOfScarceFacilities+) where++import qualified	Control.DeepSeq+import qualified	Control.Monad.Writer+import qualified	Data.Default+import qualified	System.Random+import qualified	Text.XML.HXT.Arrow.Pickle					as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.ExecutionConfiguration.Criterion			as ExecutionConfiguration.Criterion+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight			as ExecutionConfiguration.CriterionWeight+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights	as ExecutionConfiguration.OptimiseLessonCriteriaWeights++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Maybe+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector	as Database.Selector++instance (+	Data.Convertible.Convertible	Database.HDBC.SqlValue w,	-- Flexible context & Undecidable instance.+	Data.Typeable.Typeable		w,+	RealFrac			w+ ) => Database.Selector.Selector (LessonCriteriaWeights w) where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= Database.Selector.tablePrefix ++ tag+	 in do+		criterionWeightRows	<- map (+			map $ Data.Maybe.fromMaybe Data.Default.def . either (+				error . showString "WeekDaze.ExecutionConfiguration.LessonCriteriaWeights.fromDatabase:\tfailed to parse the value of a weight read from the database; " . show+			) id . Database.HDBC.safeFromSql+		 ) `fmap` Database.Selector.select connection (+			map fst associationList+		 ) [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-Monad-} $ case criterionWeightRows of+			[]		-> Data.Default.def+			[weightRow]	-> case weightRow of+				[+					weightOfAreResourcesReused,+					weightOfGreatestMinimumConsecutiveLessons,+					weightOfGreatestRemainingCourseLessons,+					weightOfGreatestSynchronisedCourseSetSize,+					weightOfIsCoreKnowledgeRequirement,+					weightOfIsSpecialistInTopic,+					weightOfMatchCourseClassSizeToLocationCapacity,+					weightOfMaximiseRelativeFacilityUtilisation,+					weightOfMaximiseStudentClassSizeOverCourseClassSize,+					weightOfMaximiseStudentClassSizeOverLocationCapacity,+					weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+					weightOfMinimiseBookingOfLocationByOtherTeachers,+					weightOfMinimiseDeviationFromTimeslotRequest,+					weightOfMinimiseInterCampusMigrationsOfStudents,+					weightOfMinimiseInterCampusMigrationsOfTeachers,+					weightOfMinimiseStudentBodyCombinations,+					weightOfMinimiseTeachersLocusOperandi,+					weightOfMinimiseWasteOfScarceFacilities+				 ] -> MkLessonCriteriaWeights {+					getWeightOfAreResourcesReused				= weightOfAreResourcesReused,+					getWeightOfGreatestMinimumConsecutiveLessons		= weightOfGreatestMinimumConsecutiveLessons,+					getWeightOfGreatestRemainingCourseLessons		= weightOfGreatestRemainingCourseLessons,+					getWeightOfGreatestSynchronisedCourseSetSize		= weightOfGreatestSynchronisedCourseSetSize,+					getWeightOfIsCoreKnowledgeRequirement			= weightOfIsCoreKnowledgeRequirement,+					getWeightOfIsSpecialistInTopic				= weightOfIsSpecialistInTopic,+					getWeightOfMatchCourseClassSizeToLocationCapacity	= weightOfMatchCourseClassSizeToLocationCapacity,+					getWeightOfMaximiseRelativeFacilityUtilisation		= weightOfMaximiseRelativeFacilityUtilisation,+					getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= weightOfMaximiseStudentClassSizeOverCourseClassSize,+					getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= weightOfMaximiseStudentClassSizeOverLocationCapacity,+					getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+					getWeightOfMinimiseBookingOfLocationByOtherTeachers	= weightOfMinimiseBookingOfLocationByOtherTeachers,+					getWeightOfMinimiseDeviationFromTimeslotRequest		= weightOfMinimiseDeviationFromTimeslotRequest,+					getWeightOfMinimiseInterCampusMigrationsOfStudents	= weightOfMinimiseInterCampusMigrationsOfStudents,+					getWeightOfMinimiseInterCampusMigrationsOfTeachers	= weightOfMinimiseInterCampusMigrationsOfTeachers,+					getWeightOfMinimiseStudentBodyCombinations		= weightOfMinimiseStudentBodyCombinations,+					getWeightOfMinimiseTeachersLocusOperandi		= weightOfMinimiseTeachersLocusOperandi,+					getWeightOfMinimiseWasteOfScarceFacilities		= weightOfMinimiseWasteOfScarceFacilities+				}+				_ -> error $ "WeekDaze.ExecutionConfiguration.LessonCriteriaWeights.fromDatabase:\tunexpected number of columns=" ++ show (length weightRow) ++ " in row of table " ++ show tableName ++ "."+			_		-> error $ "WeekDaze.ExecutionConfiguration.LessonCriteriaWeights.fromDatabase:\tunexpected number of rows=" ++ show (length criterionWeightRows) ++ " selected from table " ++ show tableName ++ "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag							= "lessonCriteriaWeights"++-- | Used to qualify XML.+weightOfAreResourcesReusedTag :: String+weightOfAreResourcesReusedTag				= "areResourcesReused"++-- | Used to qualify XML.+weightOfGreatestMinimumConsecutiveLessonsTag :: String+weightOfGreatestMinimumConsecutiveLessonsTag		= "greatestMinimumConsecutiveLessons"++-- | Used to qualify XML.+weightOfGreatestRemainingCourseLessonsTag :: String+weightOfGreatestRemainingCourseLessonsTag		= "greatestRemainingCourseLessons"++-- | Used to qualify XML.+weightOfGreatestSynchronisedCourseSetSizeTag :: String+weightOfGreatestSynchronisedCourseSetSizeTag		= "greatestSynchronisedCourseSetSize"++-- | Used to qualify XML.+weightOfIsCoreKnowledgeRequirementTag :: String+weightOfIsCoreKnowledgeRequirementTag			= "isCoreKnowledgeRequirement"++-- | Used to qualify XML.+weightOfIsSpecialistInTopicTag :: String+weightOfIsSpecialistInTopicTag				= "isSpecialistInTopic"++-- | Used to qualify XML.+weightOfMatchCourseClassSizeToLocationCapacityTag :: String+weightOfMatchCourseClassSizeToLocationCapacityTag	= "matchCourseClassSizeToLocationCapacity"++-- | Used to qualify XML.+weightOfMaximiseRelativeFacilityUtilisationTag :: String+weightOfMaximiseRelativeFacilityUtilisationTag		= "maximiseRelativeFacilityUtilisation"++-- | Used to qualify XML.+weightOfMaximiseStudentClassSizeOverCourseClassSizeTag :: String+weightOfMaximiseStudentClassSizeOverCourseClassSizeTag	= "maximiseStudentClassSizeOverCourseClassSize"++-- | Used to qualify XML.+weightOfMaximiseStudentClassSizeOverLocationCapacityTag :: String+weightOfMaximiseStudentClassSizeOverLocationCapacityTag	= "maximiseStudentClassSizeOverLocationCapacity"++-- | Used to qualify XML.+weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag :: String+weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag	= "minimiseBookingAtAnotherCoursesSpecifiedTime"++-- | Used to qualify XML.+weightOfMinimiseBookingOfLocationByOtherTeachersTag :: String+weightOfMinimiseBookingOfLocationByOtherTeachersTag	= "minimiseBookingOfLocationByOtherTeachers"++-- | Used to qualify XML.+weightOfMinimiseDeviationFromTimeslotRequestTag :: String+weightOfMinimiseDeviationFromTimeslotRequestTag		= "minimiseDeviationFromTimeslotRequest"++-- | Used to qualify XML.+weightOfMinimiseInterCampusMigrationsOfStudentsTag :: String+weightOfMinimiseInterCampusMigrationsOfStudentsTag	= "minimiseInterCampusMigrationsOfStudents"++-- | Used to qualify XML.+weightOfMinimiseInterCampusMigrationsOfTeachersTag :: String+weightOfMinimiseInterCampusMigrationsOfTeachersTag	= "minimiseInterCampusMigrationsOfTeachers"++-- | Used to qualify XML.+weightOfMinimiseStudentBodyCombinationsTag :: String+weightOfMinimiseStudentBodyCombinationsTag		= "minimiseStudentBodyCombinations"++-- | Used to qualify XML.+weightOfMinimiseTeachersLocusOperandiTag :: String+weightOfMinimiseTeachersLocusOperandiTag		= "minimiseTeachersLocusOperandi"++-- | Used to qualify XML.+weightOfMinimiseWasteOfScarceFacilitiesTag :: String+weightOfMinimiseWasteOfScarceFacilitiesTag		= "minimiseWasteOfScarceFacilities"++-- | The ordered list of tags & accessors.+associationList :: [(String, LessonCriteriaWeights w -> ExecutionConfiguration.CriterionWeight.CriterionWeight w)]+associationList	= [+	(weightOfAreResourcesReusedTag,					getWeightOfAreResourcesReused),+	(weightOfGreatestMinimumConsecutiveLessonsTag,			getWeightOfGreatestMinimumConsecutiveLessons),+	(weightOfGreatestRemainingCourseLessonsTag,			getWeightOfGreatestRemainingCourseLessons),+	(weightOfGreatestSynchronisedCourseSetSizeTag,			getWeightOfGreatestSynchronisedCourseSetSize),+	(weightOfIsCoreKnowledgeRequirementTag,				getWeightOfIsCoreKnowledgeRequirement),+	(weightOfIsSpecialistInTopicTag,				getWeightOfIsSpecialistInTopic),+	(weightOfMatchCourseClassSizeToLocationCapacityTag,		getWeightOfMatchCourseClassSizeToLocationCapacity),+	(weightOfMaximiseRelativeFacilityUtilisationTag,		getWeightOfMaximiseRelativeFacilityUtilisation),+	(weightOfMaximiseStudentClassSizeOverCourseClassSizeTag,	getWeightOfMaximiseStudentClassSizeOverCourseClassSize),+	(weightOfMaximiseStudentClassSizeOverLocationCapacityTag,	getWeightOfMaximiseStudentClassSizeOverLocationCapacity),+	(weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag,	getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime),+	(weightOfMinimiseBookingOfLocationByOtherTeachersTag,		getWeightOfMinimiseBookingOfLocationByOtherTeachers),+	(weightOfMinimiseDeviationFromTimeslotRequestTag,		getWeightOfMinimiseDeviationFromTimeslotRequest),+	(weightOfMinimiseInterCampusMigrationsOfStudentsTag,		getWeightOfMinimiseInterCampusMigrationsOfStudents),+	(weightOfMinimiseInterCampusMigrationsOfTeachersTag,		getWeightOfMinimiseInterCampusMigrationsOfTeachers),+	(weightOfMinimiseStudentBodyCombinationsTag,			getWeightOfMinimiseStudentBodyCombinations),+	(weightOfMinimiseTeachersLocusOperandiTag,			getWeightOfMinimiseTeachersLocusOperandi),+	(weightOfMinimiseWasteOfScarceFacilitiesTag,			getWeightOfMinimiseWasteOfScarceFacilities)+ ]++{- |+	* The weight of various criteria used to select a /lesson/ from alternatives, at specific coordinates in the /timetable/.++	* These criteria relate only to the attributes of the /lesson/ rather than its coordinates in the /timetable/; since the latter is common to all alternatives.+-}+data LessonCriteriaWeights w	= MkLessonCriteriaWeights {+	getWeightOfAreResourcesReused				:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /lesson/ is preferred, if the required /resource/s (/location/s & /teacher/s) are shared with other /student-bodies/, by merging them into a single larger /student-class/.+	getWeightOfGreatestMinimumConsecutiveLessons		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /lesson/ is preferred, if the /course/ to which it belongs, has a greater /minimum consecutive lessons/; since this makes it harder to book later, into the smaller spaces remaining.+	getWeightOfGreatestRemainingCourseLessons		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /course/ is preferred, if it has greater unbooked /lesson/s, since a /course/ requiring only one /lesson/ can be booked on any /day/.+	getWeightOfGreatestSynchronisedCourseSetSize		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /course/ is preferred, if it is a member of a larger set of /synchronised course/s; it seems prudent to book the most constrained /course/'s /lesson/s, early.+	getWeightOfIsCoreKnowledgeRequirement			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /subject/ is preferred, if it is categorised by the /student/, as a /core knowledge-requirement/.+	getWeightOfIsSpecialistInTopic				:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /teacher/ is preferred, if their /specialtyTopic/ is the proposed /topic/.+	getWeightOfMatchCourseClassSizeToLocationCapacity	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /location/ is preferred, when its /capacity/ matches the /course/'s optional /maximum class-size/.+	getWeightOfMaximiseRelativeFacilityUtilisation		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /location/ is preferred, the more its /facilities/ are used; cf. 'getWeightOfMinimiseWasteOfScarceFacilities', which tries to make a distinction based on the type of the wasted /facility/.+	getWeightOfMaximiseStudentClassSizeOverCourseClassSize	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /course/ is preferred, the more any /maximum class-size/ is filled by the proposed /student-class/. CAVEAT: this can change retrospectively given 'ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger'.+	getWeightOfMaximiseStudentClassSizeOverLocationCapacity	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /location/ is preferred, the more its /capacity/ is filled by the proposed /student-class/. CAVEAT: this can change retrospectively given 'ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger'.+	getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A booking-/time/ is preferred, if there's minimal probability that /course/s for other the /knowledge-requirement/s of this /student-body/ & any studying /synchronised courses/, will specifically request that /time/; the probability becomes a certainty for those /knowledge-requirement/s which can only be satisfied by one /course/, allowing corresponding /lesson/s to be filtered from all candidate-lessons, before this evaluation.+	getWeightOfMinimiseBookingOfLocationByOtherTeachers	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /location/ is preferred, when booked by the fewest other /teacher/s.+	getWeightOfMinimiseDeviationFromTimeslotRequest		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /course/ is preferred, if it is booked closer to any /timeslot-request/.+	getWeightOfMinimiseInterCampusMigrationsOfStudents	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /course/ is preferred, if inter-/campus/ migrations of /student/s are minimised.+	getWeightOfMinimiseInterCampusMigrationsOfTeachers	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /course/ is preferred, if inter-/campus/ migrations of /teacher/s are minimised.+	getWeightOfMinimiseStudentBodyCombinations		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /lesson/ is preferred, when the number of /student-body combination/s is minimised. CAVEAT: potential conflict with 'getWeightOfMaximiseStudentClassSizeOverLocationCapacity' & 'getWeightOfMaximiseStudentClassSizeOverCourseClassSize'.+	getWeightOfMinimiseTeachersLocusOperandi		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /location/ is preferred, if the size of /teacher/'s locus-operandi is minimised; based merely on the number of distinct /location/s booked, rather than the distance between them.+	getWeightOfMinimiseWasteOfScarceFacilities		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w	-- ^ A /lesson/ is preferred, if the /location/'s unused /facilities/, are commonly available elsewhere; cf. 'getWeightOfMaximiseRelativeFacilityUtilisation', which treats all /facilities/ equally.+} deriving (Eq, Show)++instance (Eq w, Num w) => ToolShed.SelfValidate.SelfValidator (LessonCriteriaWeights w) where+	getErrors lessonCriteriaWeights	= ToolShed.SelfValidate.extractErrors [+		(+			ExecutionConfiguration.CriterionWeight.areAllZero lessonCriteriaWeights,+			"The weight of @ least one lesson-criterion must be non-zero"+		) -- Pair.+	 ]++instance Num w => Data.Default.Default (LessonCriteriaWeights w) where+	def = MkLessonCriteriaWeights {+		getWeightOfAreResourcesReused				= Data.Default.def,+		getWeightOfGreatestMinimumConsecutiveLessons		= Data.Default.def,+		getWeightOfGreatestRemainingCourseLessons		= Data.Default.def,+		getWeightOfGreatestSynchronisedCourseSetSize		= Data.Default.def,+		getWeightOfIsCoreKnowledgeRequirement			= Data.Default.def,+		getWeightOfIsSpecialistInTopic				= Data.Default.def,+		getWeightOfMatchCourseClassSizeToLocationCapacity	= Data.Default.def,+		getWeightOfMaximiseRelativeFacilityUtilisation		= Data.Default.def,+		getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= Data.Default.def,+		getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= Data.Default.def,+		getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= Data.Default.def,+		getWeightOfMinimiseBookingOfLocationByOtherTeachers	= Data.Default.def,+		getWeightOfMinimiseDeviationFromTimeslotRequest		= Data.Default.def,+		getWeightOfMinimiseInterCampusMigrationsOfStudents	= Data.Default.def,+		getWeightOfMinimiseInterCampusMigrationsOfTeachers	= Data.Default.def,+		getWeightOfMinimiseStudentBodyCombinations		= Data.Default.def,+		getWeightOfMinimiseTeachersLocusOperandi		= Data.Default.def,+		getWeightOfMinimiseWasteOfScarceFacilities		= Data.Default.def+	}++instance (HXT.XmlPickler w, Ord w, Real w) => HXT.XmlPickler (LessonCriteriaWeights w) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag $ HXT.xpWrap (+		\(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)	-> MkLessonCriteriaWeights a b c d e f g h i j k l m n o p q r,	-- Construct from a tuple.+		\MkLessonCriteriaWeights {+			getWeightOfAreResourcesReused				= weightOfAreResourcesReused,+			getWeightOfGreatestMinimumConsecutiveLessons		= weightOfGreatestMinimumConsecutiveLessons,+			getWeightOfGreatestRemainingCourseLessons		= weightOfGreatestRemainingCourseLessons,+			getWeightOfGreatestSynchronisedCourseSetSize		= weightOfGreatestSynchronisedCourseSetSize,+			getWeightOfIsCoreKnowledgeRequirement			= weightOfIsCoreKnowledgeRequirement,+			getWeightOfIsSpecialistInTopic				= weightOfIsSpecialistInTopic,+			getWeightOfMatchCourseClassSizeToLocationCapacity	= weightOfMatchCourseClassSizeToLocationCapacity,+			getWeightOfMaximiseRelativeFacilityUtilisation		= weightOfMaximiseRelativeFacilityUtilisation,+			getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= weightOfMaximiseStudentClassSizeOverCourseClassSize,+			getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= weightOfMaximiseStudentClassSizeOverLocationCapacity,+			getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+			getWeightOfMinimiseBookingOfLocationByOtherTeachers	= weightOfMinimiseBookingOfLocationByOtherTeachers,+			getWeightOfMinimiseDeviationFromTimeslotRequest		= weightOfMinimiseDeviationFromTimeslotRequest,+			getWeightOfMinimiseInterCampusMigrationsOfStudents	= weightOfMinimiseInterCampusMigrationsOfStudents,+			getWeightOfMinimiseInterCampusMigrationsOfTeachers	= weightOfMinimiseInterCampusMigrationsOfTeachers,+			getWeightOfMinimiseStudentBodyCombinations		= weightOfMinimiseStudentBodyCombinations,+			getWeightOfMinimiseTeachersLocusOperandi		= weightOfMinimiseTeachersLocusOperandi,+			getWeightOfMinimiseWasteOfScarceFacilities		= weightOfMinimiseWasteOfScarceFacilities+		} -> (+			weightOfAreResourcesReused,+			weightOfGreatestMinimumConsecutiveLessons,+			weightOfGreatestRemainingCourseLessons,+			weightOfGreatestSynchronisedCourseSetSize,+			weightOfIsCoreKnowledgeRequirement,+			weightOfIsSpecialistInTopic,+			weightOfMatchCourseClassSizeToLocationCapacity,+			weightOfMaximiseRelativeFacilityUtilisation,+			weightOfMaximiseStudentClassSizeOverCourseClassSize,+			weightOfMaximiseStudentClassSizeOverLocationCapacity,+			weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+			weightOfMinimiseBookingOfLocationByOtherTeachers,+			weightOfMinimiseDeviationFromTimeslotRequest,+			weightOfMinimiseInterCampusMigrationsOfStudents,+			weightOfMinimiseInterCampusMigrationsOfTeachers,+			weightOfMinimiseStudentBodyCombinations,+			weightOfMinimiseTeachersLocusOperandi,+			weightOfMinimiseWasteOfScarceFacilities+		) -- Deconstruct into a tuple.+	 ) $ HXT.xp18Tuple (+		xpickle' weightOfAreResourcesReusedTag+	 ) (+		xpickle' weightOfGreatestMinimumConsecutiveLessonsTag+	 ) (+		xpickle' weightOfGreatestRemainingCourseLessonsTag+	 ) (+		xpickle' weightOfGreatestSynchronisedCourseSetSizeTag+	 ) (+		xpickle' weightOfIsCoreKnowledgeRequirementTag+	 ) (+		xpickle' weightOfIsSpecialistInTopicTag+	 ) (+		xpickle' weightOfMatchCourseClassSizeToLocationCapacityTag+	 ) (+		xpickle' weightOfMaximiseRelativeFacilityUtilisationTag+	 ) (+		xpickle' weightOfMaximiseStudentClassSizeOverCourseClassSizeTag+	 ) (+		xpickle' weightOfMaximiseStudentClassSizeOverLocationCapacityTag+	 ) (+		xpickle' weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag+	 ) (+		xpickle' weightOfMinimiseBookingOfLocationByOtherTeachersTag+	 ) (+		xpickle' weightOfMinimiseDeviationFromTimeslotRequestTag+	 ) (+		xpickle' weightOfMinimiseInterCampusMigrationsOfStudentsTag+	 ) (+		xpickle' weightOfMinimiseInterCampusMigrationsOfTeachersTag+	 ) (+		xpickle' weightOfMinimiseStudentBodyCombinationsTag+	 ) (+		xpickle' weightOfMinimiseTeachersLocusOperandiTag+	 ) (+		xpickle' weightOfMinimiseWasteOfScarceFacilitiesTag+	 ) where+		xpickle'	= HXT.xpDefault Data.Default.def . (`HXT.xpAttr` HXT.xpickle)++instance (Eq criterionWeight, Num criterionWeight) => ExecutionConfiguration.CriterionWeight.CriterionWeights (LessonCriteriaWeights criterionWeight) where+	areAllZero lessonCriteriaWeights	= ExecutionConfiguration.CriterionWeight.areAllZero $ map (($ lessonCriteriaWeights) . snd) associationList++instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (LessonCriteriaWeights criterionWeight) where+	rnf (MkLessonCriteriaWeights x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17)	= Control.DeepSeq.rnf [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17]++{- |+	* Returns the weighted sum of the specified criteria, divided by the sum of the weights.++	* Each criterion increases in proportion to some desirable attribute of the proposed /lesson/.++	* Each criterion should be in the same range of magnitudes, so that none dominates the total, thus making the total a clear measure of the value attributed to each.++	* The magnitude of the value of each criterion should be independent of the dimensions of the problem, such that the balance isn't disturbed when it's changed;+	i.e. they should be dimensionless.++	* /Lesson/s lacking the concept being measured shouldn't be disadvantaged, but assigned a constant median magnitude.+-}+calculateWeightedMean :: (+	Fractional	weightedMean,+	Real		criterionValue,+	Real		criterionWeight+ )+	=> LessonCriteriaWeights criterionWeight+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /areResourcesReused/:	Maximum if the proposed /lesson/ already exists at the same time in other /student-body/ timetable, & therefore allows resource-reuse, by merging them into a /student-class/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /minimumConsecutiveLessons/:	Maximum when the proposed /lesson/, belongs to a /course/ which specifies the greatest possible /minimum consecutive lessons/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /remainingCourseLessons/:	Maximum when the number of /lesson/s required for the /course/ matches the number of days the /student/ & /teacher/ are mutually available, falling to minimum when there are fewer remaining /lesson/s.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /synchronisedCourseSetSize/:	Maximum if the /course/ is a member of the largest possible set of synchronised /course/s.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /isCoreKnowledgeRequirement/:	Maximum if the /subject/ is categorised as a /core/ knowledge-requirement for the /student/, otherwise minimum.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /isSpecialistInTopic/:	Maximum if the /teacher/ is a specialist in a given /topic/, otherwise minimum.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /matchOfCourseClassSizeToLocationCapacity/:	Maximum when the maximum class-size specified for the /course/ matches the capacity of the /location/, falling to minimum as the deviation increases.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /relativeFacilityUtilisation/:	The number of /facilities/ used (regardless of their nature), over the total number of /facilities/ available at the /location/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /studentClassSizeOverCourseClassSize/:	The number of /student/s in the class, over the /course/'s maximum class-size; this makes little sense if the class-size can grow.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /studentClassSizeOverLocationCapacity/:	The number of /student/s in the class, over the /location/'s capacity; this makes little sense if the class-size can grow.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /bookingAtAnotherCoursesSpecifiedTime/:	Maximum when if there's zero probability that /course/s for this /student-body/'s other /knowledge-requirements/, will specify the proposed /booking-time/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /bookingOfLocationByOtherTeachers/:	Maximum when the /location/ has been booked by zero other /teacher/s, tending to minimum as each additional /teacher/ books a /lesson/ in this /location/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /deviationFromTimeslotRequest/:	Maximum when the proposed booking-time matches a /timeslot-request/ for the /course/, falling to minimum as the deviation rises.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /interCampusMigrationsOfStudents/:	Maximum when the /campus/ for the proposed /booking/ matches that in which the /student/ is located in adjacent /time-slot/s.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /interCampusMigrationsOfTeachers/:	Maximum when the /campus/ for the proposed /booking/ matches that in which the /teacher/ is located in adjacent /time-slot/s.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /studentBodyCombinations/:	Maximum if there's no increase in the number of /student-body/-combinations for the proposed /lesson/, falling towards minimum with each additional /student-body/-combination.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /teachersLocusOperandi/:	Maximum if either the /teacher/ has no previous bookings, or their locus operandi is unchanged, falling towards minimum with large relative increases to the locus operandi.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /wasteOfScarceFacilities/:	Maximum if the proposed /lesson/ either doesn't waste any /facilities/, or failing that merely wastes those which are ubiquitous.+	-> Control.Monad.Writer.Writer [Maybe criterionValue] weightedMean	-- ^ The individual /criteria/ values, & their /weighted mean/.+calculateWeightedMean MkLessonCriteriaWeights {+	getWeightOfAreResourcesReused				= weightOfAreResourcesReused,+	getWeightOfGreatestMinimumConsecutiveLessons		= weightOfGreatestMinimumConsecutiveLessons,+	getWeightOfGreatestRemainingCourseLessons		= weightOfGreatestRemainingCourseLessons,+	getWeightOfGreatestSynchronisedCourseSetSize		= weightOfGreatestSynchronisedCourseSetSize,+	getWeightOfIsCoreKnowledgeRequirement			= weightOfIsCoreKnowledgeRequirement,+	getWeightOfIsSpecialistInTopic				= weightOfIsSpecialistInTopic,+	getWeightOfMatchCourseClassSizeToLocationCapacity	= weightOfMatchCourseClassSizeToLocationCapacity,+	getWeightOfMaximiseRelativeFacilityUtilisation		= weightOfMaximiseRelativeFacilityUtilisation,+	getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= weightOfMaximiseStudentClassSizeOverCourseClassSize,+	getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= weightOfMaximiseStudentClassSizeOverLocationCapacity,+	getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+	getWeightOfMinimiseBookingOfLocationByOtherTeachers	= weightOfMinimiseBookingOfLocationByOtherTeachers,+	getWeightOfMinimiseDeviationFromTimeslotRequest		= weightOfMinimiseDeviationFromTimeslotRequest,+	getWeightOfMinimiseInterCampusMigrationsOfStudents	= weightOfMinimiseInterCampusMigrationsOfStudents,+	getWeightOfMinimiseInterCampusMigrationsOfTeachers	= weightOfMinimiseInterCampusMigrationsOfTeachers,+	getWeightOfMinimiseStudentBodyCombinations		= weightOfMinimiseStudentBodyCombinations,+	getWeightOfMinimiseTeachersLocusOperandi		= weightOfMinimiseTeachersLocusOperandi,+	getWeightOfMinimiseWasteOfScarceFacilities		= weightOfMinimiseWasteOfScarceFacilities+} areResourcesReused minimumConsecutiveLessons remainingCourseLessons synchronisedCourseSetSize isCoreKnowledgeRequirement isSpecialistInTopic matchOfCourseClassSizeToLocationCapacity relativeFacilityUtilisation studentClassSizeOverCourseClassSize studentClassSizeOverLocationCapacity bookingAtAnotherCoursesSpecifiedTime bookingOfLocationByOtherTeachers deviationFromTimeslotRequest interCampusMigrationsOfStudents interCampusMigrationsOfTeachers studentBodyCombinations teachersLocusOperandi wasteOfScarceFacilities = ExecutionConfiguration.Criterion.calculateWeightedMean [+	(areResourcesReused,				weightOfAreResourcesReused),+	(minimumConsecutiveLessons,			weightOfGreatestMinimumConsecutiveLessons),+	(remainingCourseLessons,			weightOfGreatestRemainingCourseLessons),+	(synchronisedCourseSetSize,			weightOfGreatestSynchronisedCourseSetSize),+	(isCoreKnowledgeRequirement,			weightOfIsCoreKnowledgeRequirement),+	(isSpecialistInTopic,				weightOfIsSpecialistInTopic),+	(matchOfCourseClassSizeToLocationCapacity,	weightOfMatchCourseClassSizeToLocationCapacity),+	(relativeFacilityUtilisation,			weightOfMaximiseRelativeFacilityUtilisation),+	(studentClassSizeOverCourseClassSize,		weightOfMaximiseStudentClassSizeOverCourseClassSize),+	(studentClassSizeOverLocationCapacity,		weightOfMaximiseStudentClassSizeOverLocationCapacity),+	(bookingAtAnotherCoursesSpecifiedTime,		weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime),+	(bookingOfLocationByOtherTeachers,		weightOfMinimiseBookingOfLocationByOtherTeachers),+	(deviationFromTimeslotRequest,			weightOfMinimiseDeviationFromTimeslotRequest),+	(interCampusMigrationsOfStudents,		weightOfMinimiseInterCampusMigrationsOfStudents),+	(interCampusMigrationsOfTeachers,		weightOfMinimiseInterCampusMigrationsOfTeachers),+	(studentBodyCombinations,			weightOfMinimiseStudentBodyCombinations),+	(teachersLocusOperandi,				weightOfMinimiseTeachersLocusOperandi),+	(wasteOfScarceFacilities,			weightOfMinimiseWasteOfScarceFacilities)+ ]++-- | The type of a function which mutates lesson-criteria weights.+type Mutator w	= LessonCriteriaWeights w -> LessonCriteriaWeights w++-- Mutator.+zeroWeightOfAreResourcesReused :: Num w => Mutator w+zeroWeightOfAreResourcesReused lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfAreResourcesReused	= minBound+}++-- Mutator.+zeroWeightOfGreatestMinimumConsecutiveLessons :: Num w => Mutator w+zeroWeightOfGreatestMinimumConsecutiveLessons lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfGreatestMinimumConsecutiveLessons	= minBound+}++-- Mutator.+zeroWeightOfGreatestRemainingCourseLessons :: Num w => Mutator w+zeroWeightOfGreatestRemainingCourseLessons lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfGreatestRemainingCourseLessons	= minBound+}++-- Mutator.+zeroWeightOfGreatestSynchronisedCourseSetSize :: Num w => Mutator w+zeroWeightOfGreatestSynchronisedCourseSetSize lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfGreatestSynchronisedCourseSetSize	= minBound+}++-- Mutator.+zeroWeightOfIsCoreKnowledgeRequirement :: Num w => Mutator w+zeroWeightOfIsCoreKnowledgeRequirement lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfIsCoreKnowledgeRequirement	= minBound+}++-- Mutator.+zeroWeightOfIsSpecialistInTopic :: Num w => Mutator w+zeroWeightOfIsSpecialistInTopic lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfIsSpecialistInTopic	= minBound+}++-- Mutator.+zeroWeightOfMatchCourseClassSizeToLocationCapacity :: Num w => Mutator w+zeroWeightOfMatchCourseClassSizeToLocationCapacity lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMatchCourseClassSizeToLocationCapacity	= minBound+}++-- Mutator.+zeroWeightOfMaximiseRelativeFacilityUtilisation :: Num w => Mutator w+zeroWeightOfMaximiseRelativeFacilityUtilisation lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseRelativeFacilityUtilisation	= minBound+}++-- Mutator.+zeroWeightOfMaximiseStudentClassSizeOverCourseClassSize :: Num w => Mutator w+zeroWeightOfMaximiseStudentClassSizeOverCourseClassSize lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= minBound+}++-- Mutator.+zeroWeightOfMaximiseStudentClassSizeOverLocationCapacity :: Num w => Mutator w+zeroWeightOfMaximiseStudentClassSizeOverLocationCapacity lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= minBound+}++-- Mutator.+zeroWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime :: Num w => Mutator w+zeroWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= minBound+}++-- Mutator.+zeroWeightOfMinimiseBookingOfLocationByOtherTeachers :: Num w => Mutator w+zeroWeightOfMinimiseBookingOfLocationByOtherTeachers lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseBookingOfLocationByOtherTeachers	= minBound+}++-- Mutator.+zeroWeightOfMinimiseDeviationFromTimeslotRequest :: Num w => Mutator w+zeroWeightOfMinimiseDeviationFromTimeslotRequest lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseDeviationFromTimeslotRequest	= minBound+}++-- Mutator.+zeroWeightOfMinimiseInterCampusMigrationsOfStudents :: Num w => Mutator w+zeroWeightOfMinimiseInterCampusMigrationsOfStudents lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseInterCampusMigrationsOfStudents	= minBound+}++-- Mutator.+zeroWeightOfMinimiseInterCampusMigrationsOfTeachers :: Num w => Mutator w+zeroWeightOfMinimiseInterCampusMigrationsOfTeachers lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseInterCampusMigrationsOfTeachers	= minBound+}++-- Mutator.+zeroWeightOfMinimiseStudentBodyCombinations :: Num w => Mutator w+zeroWeightOfMinimiseStudentBodyCombinations lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseStudentBodyCombinations	= minBound+}++-- Mutator.+zeroWeightOfMinimiseTeachersLocusOperandi :: Num w => Mutator w+zeroWeightOfMinimiseTeachersLocusOperandi lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseTeachersLocusOperandi	= minBound+}++-- Mutator.+zeroWeightOfMinimiseWasteOfScarceFacilities :: Num w => Mutator w+zeroWeightOfMinimiseWasteOfScarceFacilities lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseWasteOfScarceFacilities	= minBound+}++-- | Adjust the mean weight, so that the maximum weight is '1'.+normalise :: (+	Fractional	w,+	Ord		w,+	Real		w+ ) => Mutator w+normalise lessonCriteriaWeights+	| ExecutionConfiguration.CriterionWeight.areAllZero lessonCriteriaWeights	= lessonCriteriaWeights	-- CAVEAT: otherwise divide-by-zero.+	| otherwise									= MkLessonCriteriaWeights {+		getWeightOfAreResourcesReused				= normaliseCriterionWeight $ getWeightOfAreResourcesReused lessonCriteriaWeights,+		getWeightOfGreatestMinimumConsecutiveLessons		= normaliseCriterionWeight $ getWeightOfGreatestMinimumConsecutiveLessons lessonCriteriaWeights,+		getWeightOfGreatestRemainingCourseLessons		= normaliseCriterionWeight $ getWeightOfGreatestRemainingCourseLessons lessonCriteriaWeights,+		getWeightOfGreatestSynchronisedCourseSetSize		= normaliseCriterionWeight $ getWeightOfGreatestSynchronisedCourseSetSize lessonCriteriaWeights,+		getWeightOfIsCoreKnowledgeRequirement			= normaliseCriterionWeight $ getWeightOfIsCoreKnowledgeRequirement lessonCriteriaWeights,+		getWeightOfIsSpecialistInTopic				= normaliseCriterionWeight $ getWeightOfIsSpecialistInTopic lessonCriteriaWeights,+		getWeightOfMatchCourseClassSizeToLocationCapacity	= normaliseCriterionWeight $ getWeightOfMatchCourseClassSizeToLocationCapacity lessonCriteriaWeights,+		getWeightOfMaximiseRelativeFacilityUtilisation		= normaliseCriterionWeight $ getWeightOfMaximiseRelativeFacilityUtilisation lessonCriteriaWeights,+		getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= normaliseCriterionWeight $ getWeightOfMaximiseStudentClassSizeOverCourseClassSize lessonCriteriaWeights,+		getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= normaliseCriterionWeight $ getWeightOfMaximiseStudentClassSizeOverLocationCapacity lessonCriteriaWeights,+		getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= normaliseCriterionWeight $ getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime lessonCriteriaWeights,+		getWeightOfMinimiseBookingOfLocationByOtherTeachers	= normaliseCriterionWeight $ getWeightOfMinimiseBookingOfLocationByOtherTeachers lessonCriteriaWeights,+		getWeightOfMinimiseDeviationFromTimeslotRequest		= normaliseCriterionWeight $ getWeightOfMinimiseDeviationFromTimeslotRequest lessonCriteriaWeights,+		getWeightOfMinimiseInterCampusMigrationsOfStudents	= normaliseCriterionWeight $ getWeightOfMinimiseInterCampusMigrationsOfStudents lessonCriteriaWeights,+		getWeightOfMinimiseInterCampusMigrationsOfTeachers	= normaliseCriterionWeight $ getWeightOfMinimiseInterCampusMigrationsOfTeachers lessonCriteriaWeights,+		getWeightOfMinimiseStudentBodyCombinations		= normaliseCriterionWeight $ getWeightOfMinimiseStudentBodyCombinations lessonCriteriaWeights,+		getWeightOfMinimiseTeachersLocusOperandi		= normaliseCriterionWeight $ getWeightOfMinimiseTeachersLocusOperandi lessonCriteriaWeights,+		getWeightOfMinimiseWasteOfScarceFacilities		= normaliseCriterionWeight $ getWeightOfMinimiseWasteOfScarceFacilities lessonCriteriaWeights+	}+	where+		normaliseCriterionWeight	= ExecutionConfiguration.CriterionWeight.mkCriterionWeight . (+			/ ExecutionConfiguration.CriterionWeight.deconstruct (+				maximum $ map (($ lessonCriteriaWeights) . snd {-accessor-}) associationList+			)+		 ) . ExecutionConfiguration.CriterionWeight.deconstruct++{- |+	* Perturb each weight by an independent random value, of configurable magnitude.++	* Under this transformation, /criterion-weights/ of zero will remain unchanged.+-}+perturbWeights :: (+	Enum			f,+	Fractional		f,+	Real			f,+	Show			f,+	System.Random.Random	f,+	System.Random.RandomGen	randomGen+ )+	=> randomGen+	-> f	-- ^ The magnitude of the random perturbation; resulting in an increase or a decrease, by a factor of up to @ (1 + x) @.+	-> Mutator f+perturbWeights _ 0 lessonCriteriaWeights	= lessonCriteriaWeights+perturbWeights randomGen changeMagnitude lessonCriteriaWeights+	| changeMagnitude < 0	= error $ "WeekDaze.ExecutionConfiguration.LessonCriteriaWeights.perturbWeights:\t" ++ show ExecutionConfiguration.OptimiseLessonCriteriaWeights.changeMagnitudeTag ++ " must be positive; " ++ show changeMagnitude ++ "."+	| otherwise		= normalise lessonCriteriaWeights {+		getWeightOfAreResourcesReused				= reduceBy a $ getWeightOfAreResourcesReused lessonCriteriaWeights,+		getWeightOfGreatestMinimumConsecutiveLessons		= reduceBy b $ getWeightOfGreatestMinimumConsecutiveLessons lessonCriteriaWeights,+		getWeightOfGreatestRemainingCourseLessons		= reduceBy c $ getWeightOfGreatestRemainingCourseLessons lessonCriteriaWeights,+		getWeightOfGreatestSynchronisedCourseSetSize		= reduceBy d $ getWeightOfGreatestSynchronisedCourseSetSize lessonCriteriaWeights,+		getWeightOfIsCoreKnowledgeRequirement			= reduceBy e $ getWeightOfIsCoreKnowledgeRequirement lessonCriteriaWeights,+		getWeightOfIsSpecialistInTopic				= reduceBy f $ getWeightOfIsSpecialistInTopic lessonCriteriaWeights,+		getWeightOfMatchCourseClassSizeToLocationCapacity	= reduceBy g $ getWeightOfMatchCourseClassSizeToLocationCapacity lessonCriteriaWeights,+		getWeightOfMaximiseRelativeFacilityUtilisation		= reduceBy h $ getWeightOfMaximiseRelativeFacilityUtilisation lessonCriteriaWeights,+		getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= reduceBy i $ getWeightOfMaximiseStudentClassSizeOverCourseClassSize lessonCriteriaWeights,+		getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= reduceBy j $ getWeightOfMaximiseStudentClassSizeOverLocationCapacity lessonCriteriaWeights,+		getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= reduceBy k $ getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime lessonCriteriaWeights,+		getWeightOfMinimiseBookingOfLocationByOtherTeachers	= reduceBy l $ getWeightOfMinimiseBookingOfLocationByOtherTeachers lessonCriteriaWeights,+		getWeightOfMinimiseDeviationFromTimeslotRequest		= reduceBy m $ getWeightOfMinimiseDeviationFromTimeslotRequest lessonCriteriaWeights,+		getWeightOfMinimiseInterCampusMigrationsOfStudents	= reduceBy n $ getWeightOfMinimiseInterCampusMigrationsOfStudents lessonCriteriaWeights,+		getWeightOfMinimiseInterCampusMigrationsOfTeachers	= reduceBy o $ getWeightOfMinimiseInterCampusMigrationsOfTeachers lessonCriteriaWeights,+		getWeightOfMinimiseStudentBodyCombinations		= reduceBy p $ getWeightOfMinimiseStudentBodyCombinations lessonCriteriaWeights,+		getWeightOfMinimiseTeachersLocusOperandi		= reduceBy q $ getWeightOfMinimiseTeachersLocusOperandi lessonCriteriaWeights,+		getWeightOfMinimiseWasteOfScarceFacilities		= reduceBy r $ getWeightOfMinimiseWasteOfScarceFacilities lessonCriteriaWeights+	}+	where+		(a : b : c : d : e : f : g : h : i : j : k : l : m : n : o : p : q : r : _)	= System.Random.randomRs (1, succ changeMagnitude) randomGen+		reduceBy randomValue								= ExecutionConfiguration.CriterionWeight.mkCriterionWeight . (/ randomValue) . ExecutionConfiguration.CriterionWeight.deconstruct+
+ src-lib/WeekDaze/ExecutionConfiguration/OptimiseLessonCriteriaWeights.hs view
@@ -0,0 +1,237 @@+{-# LANGUAGE CPP, FlexibleContexts, UndecidableInstances #-}+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Contains the parameters which govern the attempt to automatically optimise the specified /lesson-criteria/ weights.+-}++module WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights (+-- * Types+-- ** Type-synonyms+--	NTrials,+-- ** Data-types+	OptimiseLessonCriteriaWeights(+--		MkOptimiseLessonCriteriaWeights,+		getNTrials,+		getChangeMagnitude,+		getReductionFactor,+		getUseMeanOverRasterScans+	),+-- * Constants+	tag,+--	nTrialsTag,+	changeMagnitudeTag,+--	reductionFactorTag,+--	useMeanOverRasterScansTag,+-- * Functions+-- ** Constructor+	mkOptimiseLessonCriteriaWeights,+-- ** Predicates+	isRequired+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.Data.Quadruple+import qualified	ToolShed.SelfValidate+import			WeekDaze.Enhanced.EnhancedBool()++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Maybe+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector	as Database.Selector++instance (+	Data.Convertible.Convertible	Database.HDBC.SqlValue criterionWeight,	-- Flexible context.+	Data.Typeable.Typeable		criterionWeight,+	RealFrac			criterionWeight+ ) => Database.Selector.Selector (OptimiseLessonCriteriaWeights criterionWeight) where+	fromDatabase connection	projectIdSql	= let+		optimiseLessonCriteriaWeightsTableName :: Database.Selector.TableName+		optimiseLessonCriteriaWeightsTableName	= Database.Selector.tablePrefix ++ tag+	 in do+		optimiseLessonCriteriaWeightsRows <- Database.Selector.select connection [+			nTrialsTag,+			changeMagnitudeTag,+			reductionFactorTag,+			useMeanOverRasterScansTag+		 ] [optimiseLessonCriteriaWeightsTableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-monad-} $ (+			case optimiseLessonCriteriaWeightsRows of+				[]					-> id+				[optimiseLessonCriteriaWeightsRow]	-> case optimiseLessonCriteriaWeightsRow of+					[nTrialsSql, changeMagnitudeSql, reductionFactorSql, useMeanOverRasterScansSql] -> (+						\optimiseLessonCriteriaWeights -> Data.Maybe.maybe optimiseLessonCriteriaWeights (+							\value -> optimiseLessonCriteriaWeights { getNTrials = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.fromDatabase:\tfailed to parse the value for " . shows nTrialsTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql nTrialsSql+					 ) . (+						\optimiseLessonCriteriaWeights -> Data.Maybe.maybe optimiseLessonCriteriaWeights (+							\value -> optimiseLessonCriteriaWeights { getChangeMagnitude = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.fromDatabase:\tfailed to parse the value for " . shows changeMagnitudeTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql changeMagnitudeSql+					 ) . (+						\optimiseLessonCriteriaWeights -> Data.Maybe.maybe optimiseLessonCriteriaWeights (+							\value -> optimiseLessonCriteriaWeights { getReductionFactor = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.fromDatabase:\tfailed to parse the value for " . shows reductionFactorTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql reductionFactorSql+					 ) . (+						\optimiseLessonCriteriaWeights -> Data.Maybe.maybe optimiseLessonCriteriaWeights (+							\value -> optimiseLessonCriteriaWeights { getUseMeanOverRasterScans = value }+						) . either (+							error . showString "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.fromDatabase:\tfailed to parse the value for " . shows useMeanOverRasterScansTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql useMeanOverRasterScansSql+					 ) -- Compose a mutator to operate on the default value.+					_ -> error $ "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.fromDatabase:\tunexpected number of columns=" ++ show (length optimiseLessonCriteriaWeightsRow) ++ " in row of table " ++ show optimiseLessonCriteriaWeightsTableName+				_					-> error $ "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.fromDatabase:\tunexpected number of rows=" ++ show (length optimiseLessonCriteriaWeightsRows) ++ " selected from table " ++ show optimiseLessonCriteriaWeightsTableName+		 ) Data.Default.def+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag				= "optimiseLessonCriteriaWeights"++-- | Used to qualify SQL & XML.+nTrialsTag :: String+nTrialsTag			= "nTrials"++-- | Used to qualify SQL & XML.+changeMagnitudeTag :: String+changeMagnitudeTag		= "changeMagnitude"++-- | Used to qualify SQL & XML.+reductionFactorTag :: String+reductionFactorTag		= "reductionFactor"++-- | Used to qualify SQL & XML.+useMeanOverRasterScansTag :: String+useMeanOverRasterScansTag	= "useMeanOverRasterScans"++-- | A number of trials.+type NTrials	= Int++-- | Encapsulates the data which drives the optimisation of lesson-criteria weights.+data OptimiseLessonCriteriaWeights criterionWeight	= MkOptimiseLessonCriteriaWeights {+	getNTrials			:: NTrials,		-- ^ The number of random trials used when attempting to optimise the lesson-criteria weights.+	getChangeMagnitude		:: criterionWeight,	-- ^ The magnitude of the random change applied to individual lesson-criteria, while attempting to find a better set.+	getReductionFactor		:: criterionWeight,	-- ^ The factor used to reduce the change-magnitude after each success.+	getUseMeanOverRasterScans	:: Bool			-- ^ Whether to accept a proposed set of /lesson-criteria weights/ on the basis of the mean (as opposed to the maximum) over the specified raster-scans, of the weighted mean over all heterogeneous /timetable-criteria/.+} deriving Eq++instance Show criterionWeight => Show (OptimiseLessonCriteriaWeights criterionWeight) where+	showsPrec _ optimiseLessonCriteriaWeights	= shows (+		getNTrials optimiseLessonCriteriaWeights,+		getChangeMagnitude optimiseLessonCriteriaWeights,+		getReductionFactor optimiseLessonCriteriaWeights,+		getUseMeanOverRasterScans optimiseLessonCriteriaWeights+	 ) -- Quadruple.++instance (+	Read	criterionWeight,+	Real	criterionWeight,+	Show	criterionWeight+ ) => Read (OptimiseLessonCriteriaWeights criterionWeight) where+	readsPrec _	= map (Control.Arrow.first $ ToolShed.Data.Quadruple.uncurry4 mkOptimiseLessonCriteriaWeights) . reads++instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (OptimiseLessonCriteriaWeights criterionWeight) where+	rnf (MkOptimiseLessonCriteriaWeights x0 x1 x2 x3)	= Control.DeepSeq.rnf (x0, x1, x2, x3)++-- | Smart constructor.+mkOptimiseLessonCriteriaWeights :: (Real criterionWeight, Show criterionWeight)+	=> NTrials		-- ^ The number of random trials.+	-> criterionWeight	-- ^ Change-magnitude+	-> criterionWeight	-- ^ Reduction-factor.+	-> Bool			-- ^ Use Mean over Raster-scans.+	-> OptimiseLessonCriteriaWeights criterionWeight+mkOptimiseLessonCriteriaWeights nTrials changeMagnitude reductionFactor useMeanOverRasterScans+	| ToolShed.SelfValidate.isValid optimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights+	| otherwise							= error $ "WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights.mkOptimiseLessonCriteriaWeights:\t" ++ ToolShed.SelfValidate.getFirstError optimiseLessonCriteriaWeights ++ "."+	where+		optimiseLessonCriteriaWeights	= MkOptimiseLessonCriteriaWeights nTrials changeMagnitude reductionFactor useMeanOverRasterScans++instance Fractional criterionWeight => Data.Default.Default (OptimiseLessonCriteriaWeights criterionWeight) where+	def	= MkOptimiseLessonCriteriaWeights {+		getNTrials			= 0,+		getChangeMagnitude		= 1,+		getReductionFactor		= 9 / 10,+		getUseMeanOverRasterScans	= True+	}++instance (Real criterionWeight, Show criterionWeight) => ToolShed.SelfValidate.SelfValidator (OptimiseLessonCriteriaWeights criterionWeight) where+	getErrors optimiseLessonCriteriaWeights@MkOptimiseLessonCriteriaWeights {+		getNTrials		= nTrials,+		getChangeMagnitude	= changeMagnitude,+		getReductionFactor	= reductionFactor+	} = ToolShed.SelfValidate.extractErrors [+		(+			nTrials < 0,+			show nTrialsTag ++ " must be positive; " ++ show optimiseLessonCriteriaWeights+		), (+			changeMagnitude <= 0,+			show changeMagnitudeTag ++ " must be greater than zero; " ++ show optimiseLessonCriteriaWeights+		), (+			any ($ reductionFactor) [(< 0), (> 1)],+			show reductionFactorTag ++ " must be within the closed unit-interval; " ++ show optimiseLessonCriteriaWeights+		)+	 ]++instance (+	Fractional	criterionWeight,+	HXT.XmlPickler	criterionWeight,+	Real		criterionWeight,+	Show		criterionWeight+ ) => HXT.XmlPickler (OptimiseLessonCriteriaWeights criterionWeight) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d)	-> mkOptimiseLessonCriteriaWeights a b c d,	-- Construct from a quadruple.+		\MkOptimiseLessonCriteriaWeights {+			getNTrials			= nTrials,+			getChangeMagnitude		= changeMagnitude,+			getReductionFactor		= reductionFactor,+			getUseMeanOverRasterScans	= useMeanOverRasterScans+		} -> (+			nTrials,+			changeMagnitude,+			reductionFactor,+			useMeanOverRasterScans+		) -- Deconstruct to a quadruple.+	 ) $ HXT.xp4Tuple (+		getNTrials def `HXT.xpDefault` HXT.xpAttr nTrialsTag HXT.xpickle+	 ) (+		getChangeMagnitude def `HXT.xpDefault` HXT.xpAttr changeMagnitudeTag HXT.xpickle+	 ) (+		getReductionFactor def `HXT.xpDefault` HXT.xpAttr reductionFactorTag HXT.xpickle+	 ) (+		getUseMeanOverRasterScans def `HXT.xpDefault` HXT.xpAttr useMeanOverRasterScansTag HXT.xpickle+	 ) where+		def	= Data.Default.def++-- | Whether optimisation is required.+isRequired :: OptimiseLessonCriteriaWeights criterionWeight -> Bool+isRequired MkOptimiseLessonCriteriaWeights { getNTrials = nTrials }	= nTrials > 0+
+ src-lib/WeekDaze/ExecutionConfiguration/TimetableBreederFecundity.hs view
@@ -0,0 +1,136 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the fecundity of two independent instances of a particular evolution-strategy;+	one composed from a /deterministic timetable-constructor/ & the other from a /random timetable-constructor/.++	* It quantifies the number of candidate solutions bred at each generation of the evolution of the /timetable/.++	* If the fecundity is zero, then the corresponding strategy is effectively switched-off.+-}++module WeekDaze.ExecutionConfiguration.TimetableBreederFecundity(+-- * Types+-- ** Type-synonyms+	Fecundity,+-- ** Data-types+	TimetableBreederFecundity(+--		MkTimetableBreederFecundity,+		getDeterministicConstructorFecundity,+		getRandomConstructorFecundity+	),+-- * Constants+--	tag,+--	deterministicConstructorFecundityTag,+--	randomConstructorFecundityTag,+	zero,+-- * Functions+-- ** Constructor+	mkTimetableBreederFecundity,+-- ** Operators+	(>*<)+) where++import			Control.Arrow((&&&))+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.SelfValidate++infixl 7 >*<	-- Like (*).++-- | Used to qualify XML.+tag :: String+tag					= "timetableBreederFecundity"++-- | Used to qualify XML.+deterministicConstructorFecundityTag :: String+deterministicConstructorFecundityTag	= "deterministicConstructorFecundity"++-- | Used to qualify XML.+randomConstructorFecundityTag :: String+randomConstructorFecundityTag		= "randomConstructorFecundity"++-- | The number of candidate solutions to breed in any one generation of the evolution of a /timetable/.+type Fecundity	= Int++-- | Describes a pair of boolean values, which independently switch on or off.+data TimetableBreederFecundity = MkTimetableBreederFecundity {+	getDeterministicConstructorFecundity	:: Fecundity,	-- ^ The /fecundity/ to use when breeding a /timetable/ for subsequent deterministic reconstruction.+	getRandomConstructorFecundity		:: Fecundity	-- ^ The /fecundity/ to use when breeding a /timetable/ for subsequent random reconstruction.+} deriving Eq++instance Read TimetableBreederFecundity where+	readsPrec _	= map (Control.Arrow.first $ uncurry mkTimetableBreederFecundity) . reads++instance Show TimetableBreederFecundity where+	showsPrec _	= shows . (getDeterministicConstructorFecundity &&& getRandomConstructorFecundity)++instance Data.Default.Default TimetableBreederFecundity where+	def	= zero++instance ToolShed.SelfValidate.SelfValidator TimetableBreederFecundity where+	getErrors timetableBreederFecundity	= ToolShed.SelfValidate.extractErrors [+		(+			any ((< 0) . ($ timetableBreederFecundity)) [getDeterministicConstructorFecundity, getRandomConstructorFecundity],+			"fecundity can't be negative; " ++ show timetableBreederFecundity+		) -- Pair.+	 ]++instance HXT.XmlPickler TimetableBreederFecundity where+	xpickle	= HXT.xpDefault defaultTimetableBreederFecundity . HXT.xpElem tag . HXT.xpWrap (+		uncurry mkTimetableBreederFecundity,					-- Construct from a Pair.+		getDeterministicConstructorFecundity &&& getRandomConstructorFecundity	-- Deconstruct to a Pair.+	 ) $ (+		getDeterministicConstructorFecundity defaultTimetableBreederFecundity `HXT.xpDefault` HXT.xpAttr deterministicConstructorFecundityTag HXT.xpInt+	 ) `HXT.xpPair` (+		getRandomConstructorFecundity defaultTimetableBreederFecundity `HXT.xpDefault` HXT.xpAttr randomConstructorFecundityTag HXT.xpInt+	 ) where+		defaultTimetableBreederFecundity	= Data.Default.def++instance Control.DeepSeq.NFData TimetableBreederFecundity where+	rnf	= Control.DeepSeq.rnf . (getDeterministicConstructorFecundity &&& getRandomConstructorFecundity)++-- | Smart constructor.+mkTimetableBreederFecundity :: Fecundity -> Fecundity -> TimetableBreederFecundity+mkTimetableBreederFecundity deterministicConstructorFecundity randomConstructorFecundity+	| ToolShed.SelfValidate.isValid fecundity	= fecundity+	| otherwise					= error $ "WeekDaze.ExecutionConfiguration.TimetableBreederFecundity.mkTimetableBreederFecundity:\t" ++ ToolShed.SelfValidate.getFirstError fecundity ++ "."+	where+		fecundity	= MkTimetableBreederFecundity deterministicConstructorFecundity randomConstructorFecundity++-- | Constant.+zero :: TimetableBreederFecundity+zero	= mkTimetableBreederFecundity 0 0++{- |+	* Combine two 'TimetableBreederFecundity's, returning the geometric mean of the individual 'Fecundity's.++	* The operation is commutative; <https://en.wikipedia.org/wiki/Commutative_property>.+-}+(>*<) :: TimetableBreederFecundity -> TimetableBreederFecundity -> TimetableBreederFecundity+MkTimetableBreederFecundity dl rl >*< MkTimetableBreederFecundity dr rr	= mkTimetableBreederFecundity (round $ getGeometricMean dl dr) (round $ getGeometricMean rl rr) where+	getGeometricMean :: Fecundity -> Fecundity -> Double+	getGeometricMean x y	= sqrt . fromIntegral $ x * y+
+ src-lib/WeekDaze/ExecutionConfiguration/TimetableCriteriaWeights.hs view
@@ -0,0 +1,582 @@+{-# LANGUAGE CPP, FlexibleContexts, UndecidableInstances #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the weightings, associated with each of the /soft/-constraints used to compare & select between alternative /timetable/s.++	* /Hard/-constraints (e.g. that a /student/ or /teacher/ can't be in more than one place at a /time/,+	or that the capacity of a /location/ can't be exceeded),+	are never violated, & so don't need to be quantified for subsequent comparison.+-}++module WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights(+-- * Types+-- ** Type-synonyms+--	Mutator,+-- ** Data-types+	TimetableCriteriaWeights(..),+-- * Constants+	associationList,+	tag,+	weightOfMaximiseComplianceWithFreePeriodPreferencesTag,+	weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag,+	weightOfMaximiseMeanStudentClassSizeTag,+	weightOfMaximiseSynchronisationOfSynchronisedCoursesTag,+	weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag,+	weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag,+	weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag,+	weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag,+	weightOfMinimiseDispersionOfTeacherWorkloadTag,+	weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag,+	weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag,+	weightOfMinimiseMeanLocationChangesOfTeachersTag,+	weightOfMinimiseMeanLocusOperandiOfTeachersTag,+	weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag,+	weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag,+	weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag,+	weightOfMinimiseRatioOfConsecutiveEqualLessonsTag,+	weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag,+-- * Functions+	calculateWeightedMean,+-- ** Mutators+	zeroWeightOfMaximiseComplianceWithFreePeriodPreferences,+--	zeroWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+--	zeroWeightOfMaximiseMeanStudentClassSize,+	zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses,+--	zeroWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+	zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+	zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+--	zeroWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+--	zeroWeightOfMinimiseDispersionOfTeacherWorkload,+	zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents,+	zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers,+	zeroWeightOfMinimiseMeanLocationChangesOfTeachers,+	zeroWeightOfMinimiseMeanLocusOperandiOfTeachers,+--	zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+	zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+	zeroWeightOfMinimiseMeanStudentBodyCombinationsPerLesson,+	zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons,+	zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+) where++import qualified	Control.DeepSeq+import qualified	Control.Monad.Writer+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.ExecutionConfiguration.Criterion	as ExecutionConfiguration.Criterion+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight	as ExecutionConfiguration.CriterionWeight++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Maybe+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector			as Database.Selector++instance (+	Data.Convertible.Convertible	Database.HDBC.SqlValue w,	-- Flexible context & Undecidable instance.+	Data.Typeable.Typeable		w,+	RealFrac			w+ ) => Database.Selector.Selector (TimetableCriteriaWeights w) where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= Database.Selector.tablePrefix ++ tag+	 in do+		criterionWeightRows	<- map (+			map $ Data.Maybe.fromMaybe Data.Default.def . either (+				error . showString "WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights.fromDatabase:\tfailed to parse the value of a weight read from the database; " . show+			) id . Database.HDBC.safeFromSql+		 ) `fmap` Database.Selector.select connection (+			map fst associationList+		 ) [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-Monad-} $ case criterionWeightRows of+			[]		-> Data.Default.def+			[weightRow]	-> case weightRow of+				[+					weightOfMaximiseComplianceWithFreePeriodPreferences,+					weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+					weightOfMaximiseMeanStudentClassSize,+					weightOfMaximiseSynchronisationOfSynchronisedCourses,+					weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+					weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+					weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+					weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+					weightOfMinimiseDispersionOfTeacherWorkload,+					weightOfMinimiseMeanInterCampusMigrationsOfStudents,+					weightOfMinimiseMeanInterCampusMigrationsOfTeachers,+					weightOfMinimiseMeanLocationChangesOfTeachers,+					weightOfMinimiseMeanLocusOperandiOfTeachers,+					weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+					weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+					weightOfMinimiseMeanStudentBodyCombinationsPerLesson,+					weightOfMinimiseRatioOfConsecutiveEqualLessons,+					weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+				 ] -> MkTimetableCriteriaWeights {+					getWeightOfMaximiseComplianceWithFreePeriodPreferences			= weightOfMaximiseComplianceWithFreePeriodPreferences,+					getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	= weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+					getWeightOfMaximiseMeanStudentClassSize					= weightOfMaximiseMeanStudentClassSize,+					getWeightOfMaximiseSynchronisationOfSynchronisedCourses			= weightOfMaximiseSynchronisationOfSynchronisedCourses,+					getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio		= weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+					getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+					getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay			= weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+					getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			= weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+					getWeightOfMinimiseDispersionOfTeacherWorkload				= weightOfMinimiseDispersionOfTeacherWorkload,+					getWeightOfMinimiseMeanInterCampusMigrationsOfStudents			= weightOfMinimiseMeanInterCampusMigrationsOfStudents,+					getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers			= weightOfMinimiseMeanInterCampusMigrationsOfTeachers,+					getWeightOfMinimiseMeanLocationChangesOfTeachers			= weightOfMinimiseMeanLocationChangesOfTeachers,+					getWeightOfMinimiseMeanLocusOperandiOfTeachers				= weightOfMinimiseMeanLocusOperandiOfTeachers,+					getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		= weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+					getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	= weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+					getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson			= weightOfMinimiseMeanStudentBodyCombinationsPerLesson,+					getWeightOfMinimiseRatioOfConsecutiveEqualLessons			= weightOfMinimiseRatioOfConsecutiveEqualLessons,+					getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		= weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+				}+				_ -> error $ "WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights.fromDatabase:\tunexpected number of columns=" ++ show (length weightRow) ++ " in row of table " ++ show tableName ++ "."+			_		-> error $ "WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights.fromDatabase:\tunexpected number of rows=" ++ show (length criterionWeightRows) ++ " selected from table " ++ show tableName ++ "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag									= "timetableCriteriaWeights"++-- | Used to qualify XML.+weightOfMaximiseComplianceWithFreePeriodPreferencesTag :: String+weightOfMaximiseComplianceWithFreePeriodPreferencesTag			= "maximiseComplianceWithFreePeriodPreferences"++-- | Used to qualify XML.+weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag :: String+weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag	= "maximiseMeanRatioOfStudentClassSizeToLocationCapacity"++-- | Used to qualify XML.+weightOfMaximiseMeanStudentClassSizeTag :: String+weightOfMaximiseMeanStudentClassSizeTag					= "maximiseMeanStudentClassSize"++-- | Used to qualify XML.+weightOfMaximiseSynchronisationOfSynchronisedCoursesTag :: String+weightOfMaximiseSynchronisationOfSynchronisedCoursesTag			= "maximiseSynchronisationOfSynchronisedCourses"++-- | Used to qualify XML.+weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag :: String+weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag		= "maximiseWeightedMeanStudentBodyUtilisationRatio"++-- | Used to qualify XML.+weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag :: String+weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag	= "minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"++-- | Used to qualify XML.+weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag :: String+weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag			= "minimiseDispersionOfStudentFreePeriodsPerDay"++-- | Used to qualify XML.+weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag :: String+weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag			= "minimiseDispersionOfTeacherFreePeriodsPerDay"++-- | Used to qualify XML.+weightOfMinimiseDispersionOfTeacherWorkloadTag :: String+weightOfMinimiseDispersionOfTeacherWorkloadTag				= "minimiseDispersionOfTeacherWorkload"++-- | Used to qualify XML.+weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag :: String+weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag			= "minimiseMeanInterCampusMigrationsOfStudents"++-- | Used to qualify XML.+weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag :: String+weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag			= "minimiseMeanInterCampusMigrationsOfTeachers"++-- | Used to qualify XML.+weightOfMinimiseMeanLocationChangesOfTeachersTag :: String+weightOfMinimiseMeanLocationChangesOfTeachersTag			= "minimiseMeanLocationChangesOfTeachers"++-- | Used to qualify XML.+weightOfMinimiseMeanLocusOperandiOfTeachersTag :: String+weightOfMinimiseMeanLocusOperandiOfTeachersTag				= "minimiseMeanLocusOperandiOfTeachers"++-- | Used to qualify XML.+weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag :: String+weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag		= "minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"++-- | Used to qualify XML.+weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag :: String+weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag	= "minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"++-- | Used to qualify XML.+weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag :: String+weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag			= "minimiseMeanStudentBodyCombinationsPerLesson"++-- | Used to qualify XML.+weightOfMinimiseRatioOfConsecutiveEqualLessonsTag :: String+weightOfMinimiseRatioOfConsecutiveEqualLessonsTag			= "minimiseRatioOfConsecutiveEqualLessons"++-- | Used to qualify XML.+weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag :: String+weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag		= "minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"++-- | The ordered list of tags & accessors.+associationList :: [(String, TimetableCriteriaWeights w -> ExecutionConfiguration.CriterionWeight.CriterionWeight w)]+associationList	= [+	(weightOfMaximiseComplianceWithFreePeriodPreferencesTag,		getWeightOfMaximiseComplianceWithFreePeriodPreferences),+	(weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag,	getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity),+	(weightOfMaximiseMeanStudentClassSizeTag,				getWeightOfMaximiseMeanStudentClassSize),+	(weightOfMaximiseSynchronisationOfSynchronisedCoursesTag,		getWeightOfMaximiseSynchronisationOfSynchronisedCourses),+	(weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag,		getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio),+	(weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag,	getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest),+	(weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag,		getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay),+	(weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag,		getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay),+	(weightOfMinimiseDispersionOfTeacherWorkloadTag,			getWeightOfMinimiseDispersionOfTeacherWorkload),+	(weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag,		getWeightOfMinimiseMeanInterCampusMigrationsOfStudents),+	(weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag,		getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers),+	(weightOfMinimiseMeanLocationChangesOfTeachersTag,			getWeightOfMinimiseMeanLocationChangesOfTeachers),+	(weightOfMinimiseMeanLocusOperandiOfTeachersTag,			getWeightOfMinimiseMeanLocusOperandiOfTeachers),+	(weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag,		getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge),+	(weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag,	getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge),+	(weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag,		getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson),+	(weightOfMinimiseRatioOfConsecutiveEqualLessonsTag,			getWeightOfMinimiseRatioOfConsecutiveEqualLessons),+	(weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag,		getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay)+ ]++-- | The weight of criteria used to select a /timetable/ from alternatives.+data TimetableCriteriaWeights w	= MkTimetableCriteriaWeights {+	getWeightOfMaximiseComplianceWithFreePeriodPreferences			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when it complies with any /free time-slot preference/, of /student-bodies/ & /teacher/s.+	getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the mean over all /booking/s, of the ratio of the size of the /student-class/ to the /location/'s capacity, is greatest.+	getWeightOfMaximiseMeanStudentClassSize					:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the mean over the size of /student-class/es, relative to the total number of /student/s, is greatest.+	getWeightOfMaximiseSynchronisationOfSynchronisedCourses			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the /lesson/s of /synchronised course/s are consistently synchronised.+	getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the mean over all /student-bodies/, of their utilisation-ratio, is maximised. It doesn't distinguish between /core/ & /optional/ subjects like /minimiseMeanRatioOfIncompletelyBookedCoreKnowledge/ & /minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge/, but it does value partially booked /course/s.+	getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when /lesson/s are booked close to any /ideal timeslot-request/ for their /course/. CAVEAT: excessive weight makes it preferable to take the penalty from 'getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge' or 'getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge', by not scheduling a /lesson/ if the available /time-slot/s are far from any specified ideal.+	getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when /student/s' free /period/s are spread evenly across their working-week.+	getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when /teacher/s' free /period/s are spread evenly across their working-week.+	getWeightOfMinimiseDispersionOfTeacherWorkload				:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the relative workload between all /teacher/s, is similar.+	getWeightOfMinimiseMeanInterCampusMigrationsOfStudents			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average over all /student/s, of the number of inter-/campus/ migrations in a week, is minimised.+	getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average over all /teacher/s, of the number of inter-/campus/ migrations in a week, is minimised.+	getWeightOfMinimiseMeanLocationChangesOfTeachers			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average over all /teacher/s, of the number of changes in their /location/ in a week, is minimised; cf. /minimiseMeanLocusOperandiOfTeachers/, which merely counts the number of distinct /location/s used.+	getWeightOfMinimiseMeanLocusOperandiOfTeachers				:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average over all /teacher/s, of the size of their locus-operandi, is minimised; based merely on the number of /location/s, rather than the distance or the number of changes, between them.+	getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average over all /student-bodies/, of the ratio of incompletely booked /core/ /knowledge-requirements/, to all requirements, is minimised. All incomplete /course/s are valued equally, regardless of the extent.+	getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average over all /student-bodies/, of the ratio of incompletely booked /optional/ /knowledge-requirements/, to all requirements, is minimised. All incomplete /course/s are valued equally, regardless of the extent; cf. /maximiseWeightedMeanStudentBodyUtilisationRatio/.+	getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when the average number of combinations of /student-class/ per /lesson/-definition, is minimised; ideally a /student-body/ always studies a /subject/, in a class composed from the same other /student-bodies/.+	getWeightOfMinimiseRatioOfConsecutiveEqualLessons			:: ExecutionConfiguration.CriterionWeight.CriterionWeight w,	-- ^ A /timetable/ is preferred, when blocks of consecutive identical /lesson/s are booked, whose length most closely corresponds, to that requested for the /course/ to which they belong.+	getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		:: ExecutionConfiguration.CriterionWeight.CriterionWeight w	-- ^ A /timetable/ is preferred, when the /lesson/s of any /course/, are on any /day/, booked in one contiguous block.+} deriving (Eq, Show)++instance (Eq w, Num w) => ToolShed.SelfValidate.SelfValidator (TimetableCriteriaWeights w) where+	getErrors timetableCriteriaWeights	= ToolShed.SelfValidate.extractErrors [+		(+			ExecutionConfiguration.CriterionWeight.areAllZero timetableCriteriaWeights,+			"The weight of @ least one timetable-criterion must be non-zero"+		) -- Pair.+	 ]+++instance Num w => Data.Default.Default (TimetableCriteriaWeights w) where+	def = MkTimetableCriteriaWeights {+		getWeightOfMaximiseComplianceWithFreePeriodPreferences			= Data.Default.def,+		getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	= Data.Default.def,+		getWeightOfMaximiseMeanStudentClassSize					= Data.Default.def,+		getWeightOfMaximiseSynchronisationOfSynchronisedCourses			= Data.Default.def,+		getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio		= Data.Default.def,+		getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= Data.Default.def,+		getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay			= Data.Default.def,+		getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			= Data.Default.def,+		getWeightOfMinimiseDispersionOfTeacherWorkload				= Data.Default.def,+		getWeightOfMinimiseMeanInterCampusMigrationsOfStudents			= Data.Default.def,+		getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers			= Data.Default.def,+		getWeightOfMinimiseMeanLocationChangesOfTeachers			= Data.Default.def,+		getWeightOfMinimiseMeanLocusOperandiOfTeachers				= Data.Default.def,+		getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		= Data.Default.def,+		getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	= Data.Default.def,+		getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson			= Data.Default.def,+		getWeightOfMinimiseRatioOfConsecutiveEqualLessons			= Data.Default.def,+		getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		= Data.Default.def+	}++instance (HXT.XmlPickler w, Ord w, Real w) => HXT.XmlPickler (TimetableCriteriaWeights w) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag $ HXT.xpWrap (+		\(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)	-> MkTimetableCriteriaWeights a b c d e f g h i j k l m n o p q r,	-- Construct from a tuple.+		\MkTimetableCriteriaWeights {+			getWeightOfMaximiseComplianceWithFreePeriodPreferences			= weightOfMaximiseComplianceWithFreePeriodPreferences,+			getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	= weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+			getWeightOfMaximiseMeanStudentClassSize					= weightOfMaximiseMeanStudentClassSize,+			getWeightOfMaximiseSynchronisationOfSynchronisedCourses			= weightOfMaximiseSynchronisationOfSynchronisedCourses,+			getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio		= weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+			getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+			getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay			= weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+			getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			= weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+			getWeightOfMinimiseDispersionOfTeacherWorkload				= weightOfMinimiseDispersionOfTeacherWorkload,+			getWeightOfMinimiseMeanInterCampusMigrationsOfStudents			= weightOfMinimiseMeanInterCampusMigrationsOfStudents,+			getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers			= weightOfMinimiseMeanInterCampusMigrationsOfTeachers,+			getWeightOfMinimiseMeanLocationChangesOfTeachers			= weightOfMinimiseMeanLocationChangesOfTeachers,+			getWeightOfMinimiseMeanLocusOperandiOfTeachers				= weightOfMinimiseMeanLocusOperandiOfTeachers,+			getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		= weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+			getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	= weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+			getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson			= weightOfMinimiseMeanStudentBodyCombinationsPerLesson,+			getWeightOfMinimiseRatioOfConsecutiveEqualLessons			= weightOfMinimiseRatioOfConsecutiveEqualLessons,+			getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		= weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+		} -> (+			weightOfMaximiseComplianceWithFreePeriodPreferences,+			weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+			weightOfMaximiseMeanStudentClassSize,+			weightOfMaximiseSynchronisationOfSynchronisedCourses,+			weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+			weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+			weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+			weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+			weightOfMinimiseDispersionOfTeacherWorkload,+			weightOfMinimiseMeanInterCampusMigrationsOfStudents,+			weightOfMinimiseMeanInterCampusMigrationsOfTeachers,+			weightOfMinimiseMeanLocationChangesOfTeachers,+			weightOfMinimiseMeanLocusOperandiOfTeachers,+			weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+			weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+			weightOfMinimiseMeanStudentBodyCombinationsPerLesson,+			weightOfMinimiseRatioOfConsecutiveEqualLessons,+			weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+		) -- Deconstruct into a tuple.+	 ) $ HXT.xp18Tuple (+		xpickle' weightOfMaximiseComplianceWithFreePeriodPreferencesTag+	 ) (+		xpickle' weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag+	 ) (+		xpickle' weightOfMaximiseMeanStudentClassSizeTag+	 ) (+		xpickle' weightOfMaximiseSynchronisationOfSynchronisedCoursesTag+	 ) (+		xpickle' weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag+	 ) (+		xpickle' weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag+	 ) (+		xpickle' weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag+	 ) (+		xpickle' weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag+	 ) (+		xpickle' weightOfMinimiseDispersionOfTeacherWorkloadTag+	 ) (+		xpickle' weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag+	 ) (+		xpickle' weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag+	 ) (+		xpickle' weightOfMinimiseMeanLocationChangesOfTeachersTag+	 ) (+		xpickle' weightOfMinimiseMeanLocusOperandiOfTeachersTag+	 ) (+		xpickle' weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag+	 ) (+		xpickle' weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag+	 ) (+		xpickle' weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag+	 ) (+		xpickle' weightOfMinimiseRatioOfConsecutiveEqualLessonsTag+	 ) (+		xpickle' weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag+	 ) where+		xpickle'	= HXT.xpDefault Data.Default.def . (`HXT.xpAttr` HXT.xpickle)++instance (Eq criterionWeight, Num criterionWeight) => ExecutionConfiguration.CriterionWeight.CriterionWeights (TimetableCriteriaWeights criterionWeight) where+	areAllZero timetableCriteriaWeights	= ExecutionConfiguration.CriterionWeight.areAllZero $ map (($ timetableCriteriaWeights) . snd) associationList++instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (TimetableCriteriaWeights criterionWeight) where+	rnf (MkTimetableCriteriaWeights x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17)	= Control.DeepSeq.rnf [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17]++{- |+	* Returns the weighted sum of the specified criteria, divided by the sum of the weights.++	* The magnitude of each /criterion/ should be in the same range, so that none dominates the total, thus making the total a clear measure of the value attributed to each.++	* The magnitude of the value of each /criterion/ should be independent of the dimensions of the /timetable/ (/observerId/s, /day/s per week, /time-slot/s per day),+	so that should any of these change, the balance between criteria doesn't shift; i.e. they should be dimensionless.+-}+calculateWeightedMean :: (+	Fractional	weightedMean,+	Real		criterionValue,+	Real		criterionWeight+ )+	=> TimetableCriteriaWeights criterionWeight+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /complianceWithFreePeriodPreferences/: maximum when each unallocated /time-slot/ complies with the preferences of both /student-bodies/ & /teacher/s.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /classSizeOverLocationCapacity/: maximum when /location/ which has been booked, is completely filled by the /student-class/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ A /timetable/ is preferred, when the mean over the size of /student-class/es, relative to the total number of /student/s, is greatest.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /synchronisationOfSynchronisedCourses/: maximum if the /lesson/s for all /synchronised course/s, are synchronised.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /weightedMeanStudentBodyUtilisationRatio/: maximum if all /student-bodies/ are fully utilised.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /averageAbsoluteDeviationFromIdealTimeslotRequest/: maximum if all /lesson/s, whose /course/ specifies an ideal /time-slot/, have been booked exactly on it, falling towards minimum as the mean absolute deviation increases.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /dispersionOfStudentFreePeriodsPerDay/: maximum when the deviation in the number of free /student-period/s per day is zero, falling towards minimum when they all fall on one /day/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /dispersionOfTeacherFreePeriodsPerDay/: maximum when the deviation in the number of free /teacher-period/s per day is zero, falling towards minimum when they all fall on one /day/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /dispersionOfTeacherWorkload/: maximum when the deviation in the /workload/ between /teacher/s is zero, falling towards minimum as their workloads move away from the mean.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanInterCampusMigrationsOfStudents/: maximum when each /student/ migrates to a different /campus/ between each /timeslot/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanInterCampusMigrationsOfTeachers/: maximum when each /teacher/ migrates to a different /campus/ between each /timeslot/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanLocationChangesOfTeachers/: maximum when the location of each /teacher/ changes at every /time-slot/, falling towards minimum as each /lesson/ is taught at the same /location/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanLocusOperandiOfTeachers/: maximum when the locus-operandi of each /teacher/ is just one location, falling towards minimum as each /lesson/ taught is in a different /location/.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanRatioOfIncompletelyBookedCoreKnowledge/: maximum when all of a /student-body/'s required core /subject/s are completely booked, falling towards minimum when none are met.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanRatioOfIncompletelyBookedOptionalKnowledge/: maximum when all of a /student-body/'s required optional /subject/s are completely booked, falling towards minimum when none are met.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /meanStudentBodyCombinationsPerLesson/: maximum when each /student-body/ studies a /subject/, as a member of a constant /student-class/, falling towards minimum as the mean number of different /student-body/-combinations per /subject/ rises.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /ratioOfConsecutiveEqualLessons/: maximum when blocks of consecutive identical /lesson/s are booked, whose length equals that requested for the /course/ to which they belong.+	-> ExecutionConfiguration.Criterion.Criterion criterionValue		-- ^ /ratioOfSeparatedEqualLessonsWithinAnyDay/: maximum when only one contiguous block of /lesson/s in any /subject/, has been booked each /day/, falling towards minimum where separated blocks of equal /lesson/s occur within any one /day/.+	-> Control.Monad.Writer.Writer [Maybe criterionValue] weightedMean	-- ^ The individual /criteria/ values, & their /weighted mean/.+calculateWeightedMean MkTimetableCriteriaWeights {+	getWeightOfMaximiseComplianceWithFreePeriodPreferences			= weightOfMaximiseComplianceWithFreePeriodPreferences,+	getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	= weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+	getWeightOfMaximiseMeanStudentClassSize					= weightOfMaximiseMeanStudentClassSize,+	getWeightOfMaximiseSynchronisationOfSynchronisedCourses			= weightOfMaximiseSynchronisationOfSynchronisedCourses,+	getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio		= weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+	getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+	getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay			= weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+	getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			= weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+	getWeightOfMinimiseDispersionOfTeacherWorkload				= weightOfMinimiseDispersionOfTeacherWorkload,+	getWeightOfMinimiseMeanInterCampusMigrationsOfStudents			= weightOfMinimiseMeanInterCampusMigrationsOfStudents,+	getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers			= weightOfMinimiseMeanInterCampusMigrationsOfTeachers,+	getWeightOfMinimiseMeanLocationChangesOfTeachers			= weightOfMinimiseMeanLocationChangesOfTeachers,+	getWeightOfMinimiseMeanLocusOperandiOfTeachers				= weightOfMinimiseMeanLocusOperandiOfTeachers,+	getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		= weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+	getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	= weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+	getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson			= weightOfMinimiseMeanStudentBodyCombinationsPerLesson,+	getWeightOfMinimiseRatioOfConsecutiveEqualLessons			= weightOfMinimiseRatioOfConsecutiveEqualLessons,+	getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		= weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+} complianceWithFreePeriodPreferences meanRatioOfStudentClassSizeToLocationCapacity meanStudentClassSize synchronisationOfSynchronisedCourses weightedMeanStudentBodyUtilisationRatio averageAbsoluteDeviationFromIdealTimeslotRequest dispersionOfStudentFreePeriodsPerDay dispersionOfTeacherFreePeriodsPerDay dispersionOfTeacherWorkload meanInterCampusMigrationsOfStudents meanInterCampusMigrationsOfTeachers meanLocationChangesOfTeachers meanLocusOperandiOfTeachers meanRatioOfIncompletelyBookedCoreKnowledge meanRatioOfIncompletelyBookedOptionalKnowledge meanStudentBodyCombinationsPerLesson ratioOfConsecutiveEqualLessons ratioOfSeparatedEqualLessonsWithinAnyDay	= ExecutionConfiguration.Criterion.calculateWeightedMean [+	(complianceWithFreePeriodPreferences,			weightOfMaximiseComplianceWithFreePeriodPreferences),+	(meanRatioOfStudentClassSizeToLocationCapacity,		weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity),+	(meanStudentClassSize,					weightOfMaximiseMeanStudentClassSize),+	(synchronisationOfSynchronisedCourses,			weightOfMaximiseSynchronisationOfSynchronisedCourses),+	(weightedMeanStudentBodyUtilisationRatio,		weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio),+	(averageAbsoluteDeviationFromIdealTimeslotRequest,	weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest),+	(dispersionOfStudentFreePeriodsPerDay,			weightOfMinimiseDispersionOfStudentFreePeriodsPerDay),+	(dispersionOfTeacherFreePeriodsPerDay,			weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay),+	(dispersionOfTeacherWorkload,				weightOfMinimiseDispersionOfTeacherWorkload),+	(meanInterCampusMigrationsOfStudents,			weightOfMinimiseMeanInterCampusMigrationsOfStudents),+	(meanInterCampusMigrationsOfTeachers,			weightOfMinimiseMeanInterCampusMigrationsOfTeachers),+	(meanLocationChangesOfTeachers,				weightOfMinimiseMeanLocationChangesOfTeachers),+	(meanLocusOperandiOfTeachers,				weightOfMinimiseMeanLocusOperandiOfTeachers),+	(meanRatioOfIncompletelyBookedCoreKnowledge,		weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge),+	(meanRatioOfIncompletelyBookedOptionalKnowledge,	weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge),+	(meanStudentBodyCombinationsPerLesson,			weightOfMinimiseMeanStudentBodyCombinationsPerLesson),+	(ratioOfConsecutiveEqualLessons,			weightOfMinimiseRatioOfConsecutiveEqualLessons),+	(ratioOfSeparatedEqualLessonsWithinAnyDay,		weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay)+ ]++-- | The type of a function which mutates timetable-criteria weights.+type Mutator w	= TimetableCriteriaWeights w -> TimetableCriteriaWeights w++-- Mutator.+zeroWeightOfMaximiseComplianceWithFreePeriodPreferences :: Num w => Mutator w+zeroWeightOfMaximiseComplianceWithFreePeriodPreferences lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseComplianceWithFreePeriodPreferences	= minBound+}++-- Mutator.+zeroWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity :: Num w => Mutator w+zeroWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	= minBound+}++-- Mutator.+zeroWeightOfMaximiseMeanStudentClassSize :: Num w => Mutator w+zeroWeightOfMaximiseMeanStudentClassSize lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseMeanStudentClassSize	= minBound+}++-- Mutator.+zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses :: Num w => Mutator w+zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseSynchronisationOfSynchronisedCourses	= minBound+}++-- Mutator.+zeroWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio :: Num w => Mutator w+zeroWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio	= minBound+}++-- Mutator.+zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest :: Num w => Mutator w+zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= minBound+}++-- Mutator.+zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay :: Num w => Mutator w+zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay	= minBound+}++-- Mutator.+zeroWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay :: Num w => Mutator w+zeroWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay	= minBound+}++-- Mutator.+zeroWeightOfMinimiseDispersionOfTeacherWorkload :: Num w => Mutator w+zeroWeightOfMinimiseDispersionOfTeacherWorkload lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseDispersionOfTeacherWorkload	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents :: Num w => Mutator w+zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanInterCampusMigrationsOfStudents	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers :: Num w => Mutator w+zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanLocationChangesOfTeachers :: Num w => Mutator w+zeroWeightOfMinimiseMeanLocationChangesOfTeachers lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanLocationChangesOfTeachers	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanLocusOperandiOfTeachers :: Num w => Mutator w+zeroWeightOfMinimiseMeanLocusOperandiOfTeachers lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanLocusOperandiOfTeachers	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge :: Num w => Mutator w+zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge :: Num w => Mutator w+zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	= minBound+}++-- Mutator.+zeroWeightOfMinimiseMeanStudentBodyCombinationsPerLesson :: Num w => Mutator w+zeroWeightOfMinimiseMeanStudentBodyCombinationsPerLesson lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson	= minBound+}++-- Mutator.+zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons :: Num w => Mutator w+zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseRatioOfConsecutiveEqualLessons	= minBound+}++-- Mutator.+zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay :: Num w => Mutator w+zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay lessonCriteriaWeights	= lessonCriteriaWeights {+	getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay	= minBound+}+
+ src-lib/WeekDaze/Identifiers/Campus.hs view
@@ -0,0 +1,93 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines a suitable type for its polymorphic namesake.++	* Defines a concrete type used to describe the /campus/ in which a /location/ exists.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.Campus(+-- * Types+-- ** Data-types+	Campus(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkCampus+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue Campus {-multi-parameter type-class-} where+	safeConvert	= fmap mkCampus . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag	= "campus"++-- | Define a concrete type for the identifier for a /campus/.+newtype Campus	= MkCampus {+	deconstruct	:: String+} deriving (Eq, Ord)++-- | Constructor.+mkCampus :: String -> Campus+mkCampus	= MkCampus++instance Data.Default.Default Campus where+	def	= mkCampus ""++instance Show Campus where+	showsPrec _	= shows . deconstruct++instance Read Campus where+	readsPrec _	= map (Control.Arrow.first mkCampus) . reads++instance HXT.XmlPickler Campus where+	xpickle	= HXT.xpWrap (+		mkCampus,	-- Construct from a String.+		deconstruct	-- Deconstruct to a String.+	 ) $ HXT.xpAttr tag HXT.xpText0 {-can be null-}++instance Control.DeepSeq.NFData Campus where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML Campus where+	toHtml (MkCampus "")	= Text.XHtml.Strict.noHtml+	toHtml (MkCampus s)	= Text.XHTML.mkXHTMLSpan tag << s+
+ src-lib/WeekDaze/Identifiers/Level.hs view
@@ -0,0 +1,89 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines a suitable type for its polymorphic namesake.++	* This qualifies the /topic/s offered by /teacher/s, & in this context defines the /level/ at which they are taught.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.Level(+-- * Types+-- ** Data-types+	Level(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkLevel+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue Level {-multi-parameter type-class-} where+	safeConvert	= fmap mkLevel . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML & CSS.+tag :: String+tag	= "level"++-- | Define a concrete type for the level of a /topic/.+newtype Level	= MkLevel {+	deconstruct	:: String	-- Could also be an Int.+} deriving (Eq, Ord)++-- | Constructor.+mkLevel :: String -> Level+mkLevel	= MkLevel++instance Show Level where+	showsPrec _	= shows . deconstruct++instance Read Level where+	readsPrec _	= map (Control.Arrow.first mkLevel) . reads++instance HXT.XmlPickler Level where+	xpickle	= HXT.xpWrap (+		mkLevel,	-- Construct from a String.+		deconstruct	-- Deconstruct to a String.+	 ) $ HXT.xpAttr tag HXT.xpText0 {-can be null-}++instance Control.DeepSeq.NFData Level where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML Level where+	toHtml (MkLevel "")	= Text.XHtml.Strict.noHtml+	toHtml (MkLevel s)	= Text.XHTML.mkXHTMLSpan tag << s+
+ src-lib/WeekDaze/Identifiers/LocationId.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a suitable type for its polymorphic namesake.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.LocationId(+-- * Types+-- ** Data-types+	LocationId(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkLocationId+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue LocationId {-multi-parameter type-class-} where+	safeConvert	= fmap mkLocationId . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML & CSS.+tag :: String+tag	= "locationId"++-- | Define a concrete type for the identifier for a /location/.+newtype LocationId	= MkLocationId {+	deconstruct	:: String	-- Could also be an Int.+} deriving (Eq, Ord)++-- | Constructor.+mkLocationId :: String -> LocationId+mkLocationId	= MkLocationId++instance Show LocationId where+	showsPrec _	= shows . deconstruct++instance Read LocationId where+	readsPrec _	= map (Control.Arrow.first mkLocationId) . reads++instance HXT.XmlPickler LocationId where+	xpickle	= HXT.xpWrap (+		mkLocationId,	-- Construct from a String.+		deconstruct	-- Deconstruct to a String.+	 ) $ HXT.xpTextAttr tag {-can't be null-}++instance Control.DeepSeq.NFData LocationId where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML LocationId where+	toHtml (MkLocationId s)		= Text.XHTML.mkXHTMLSpan tag << s+
+ src-lib/WeekDaze/Identifiers/Stream.hs view
@@ -0,0 +1,93 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines a suitable type for its polymorphic namesake.++	* This value permits one to distinguish between the academic year of a /student/ & optionally also their /stream/ within the year.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.Stream(+-- * Types+-- ** Data-types+	Stream(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkStream+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue Stream {-multi-parameter type-class-} where+	safeConvert	= fmap mkStream . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML & CSS.+tag :: String+tag	= "stream"++-- | Define a concrete type for the stream of a /student/.+newtype Stream	= MkStream {+	deconstruct	:: String	-- Could also be an Int.+} deriving (Eq, Ord)++-- | Constructor.+mkStream :: String -> Stream+mkStream	= MkStream++instance Data.Default.Default Stream where+	def	= mkStream ""++instance Show Stream where+	showsPrec _	= shows . deconstruct++instance Read Stream where+	readsPrec _	= map (Control.Arrow.first mkStream) . reads++instance HXT.XmlPickler Stream where+	xpickle	= HXT.xpWrap (+		mkStream,	-- Construct from a String.+		deconstruct	-- Deconstruct to a String.+	 ) $ HXT.xpAttr tag HXT.xpText0 {-can be null-}++instance Control.DeepSeq.NFData Stream where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML Stream where+	toHtml (MkStream "")	= Text.XHtml.Strict.noHtml+	toHtml (MkStream s)	= Text.XHTML.mkXHTMLSpan tag << s+
+ src-lib/WeekDaze/Identifiers/SynchronisationId.hs view
@@ -0,0 +1,80 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a suitable type for its polymorphic namesake.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.SynchronisationId(+-- * Types+-- ** Data-types+	SynchronisationId(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkSynchronisationId+) where++import qualified	Control.DeepSeq+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML+import			Text.XHtml.Strict((<<))++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible++instance Data.Convertible.Convertible Database.HDBC.SqlValue SynchronisationId {-multi-parameter type-class-} where+	safeConvert	= fmap mkSynchronisationId . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag	= "synchronisationId"++-- | Define a concrete type for the identifier of a set of /course/s, whose heterogeneous /lesson/s must be synchronised.+newtype SynchronisationId	= MkSynchronisationId {+	deconstruct	:: String	-- Could also be an Int.+} deriving (Eq, Ord)++-- | Constructor.+mkSynchronisationId :: String -> SynchronisationId+mkSynchronisationId	= MkSynchronisationId++instance Show SynchronisationId where+	showsPrec _	= shows . deconstruct++instance HXT.XmlPickler SynchronisationId where+	xpickle	= HXT.xpWrap (+		mkSynchronisationId,	-- Construct from a String.+		deconstruct		-- Deconstruct to a String.+	 ) $ HXT.xpTextAttr tag {-can't be null-}++instance Control.DeepSeq.NFData SynchronisationId where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML SynchronisationId where+	toHtml (MkSynchronisationId s)	= Text.XHTML.mkXHTMLDiv tag << s+
+ src-lib/WeekDaze/Identifiers/TeacherId.hs view
@@ -0,0 +1,84 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a suitable type for its polymorphic namesake.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.TeacherId(+-- * Types+-- ** Data-types+	TeacherId(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkTeacherId+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue TeacherId {-multi-parameter type-class-} where+	safeConvert	= fmap mkTeacherId . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML & CSS.+tag :: String+tag	= "teacherId"++-- | Define a concrete type for the identifier for a /teacher/.+newtype TeacherId	= MkTeacherId {+	deconstruct	:: String	-- Could also be an Int.+} deriving (Eq, Ord)++-- | Constructor.+mkTeacherId :: String -> TeacherId+mkTeacherId	= MkTeacherId++instance Show TeacherId where+	showsPrec _	= shows . deconstruct++instance Read TeacherId where+	readsPrec _	= map (Control.Arrow.first mkTeacherId) . reads++instance HXT.XmlPickler TeacherId where+	xpickle	= HXT.xpWrap (+		MkTeacherId,	-- Construct from a String.+		deconstruct	-- Deconstruct to a String.+	 ) $ HXT.xpTextAttr tag {-can't be null-}++instance Control.DeepSeq.NFData TeacherId where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML TeacherId where+	toHtml (MkTeacherId s)	= Text.XHTML.mkXHTMLSpan tag << s+
+ src-lib/WeekDaze/Identifiers/TimeslotId.hs view
@@ -0,0 +1,89 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a suitable type for its polymorphic namesake.++ [@CAVEAT@]	Exporting nothing but the type-constructor forces this to be used only as an interface, & therefore to be easily replaced; though a data-constructor is also exported for testing.+-}++module WeekDaze.Identifiers.TimeslotId(+-- * Types+-- ** Data-types+	TimeslotId(),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkTimeslotId+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Array.IArray+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((<<))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Text.XHTML		as Text.XHTML++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue TimeslotId {-multi-parameter type-class-} where+	safeConvert	= fmap mkTimeslotId . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify XML & CSS.+tag :: String+tag	= "timeslotId"++-- | Define a concrete type for the identifier of a time-slot in any /day/.+newtype TimeslotId	= MkTimeslotId {+	deconstruct	:: Int+} deriving (Data.Array.IArray.Ix, Eq, Ord)++-- | Constructor.+mkTimeslotId :: Int -> TimeslotId+mkTimeslotId	= MkTimeslotId++instance Show TimeslotId where+	showsPrec _	= shows . deconstruct++instance Read TimeslotId where+	readsPrec _	= map (Control.Arrow.first mkTimeslotId) . reads++instance Enum TimeslotId where+	toEnum		= mkTimeslotId+	fromEnum	= deconstruct++instance HXT.XmlPickler TimeslotId where+	xpickle	= HXT.xpWrap (+		mkTimeslotId,	-- Construct from an Int.+		deconstruct	-- Deconstruct to an Int.+	 ) $ HXT.xpAttr tag HXT.xpInt++instance Control.DeepSeq.NFData TimeslotId where+	rnf	= Control.DeepSeq.rnf . deconstruct++instance Text.XHtml.Strict.HTML TimeslotId where+	toHtml (MkTimeslotId i)	= Text.XHTML.mkXHTMLSpan tag << i+
+ src-lib/WeekDaze/Input/ConfigVersion.hs view
@@ -0,0 +1,89 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes the version of the configuration-structure, & facilitates translation to & from a dotted-decimal string representation.+-}++module WeekDaze.Input.ConfigVersion(+-- * Types+-- ** Type-synonyms+	ConfigVersion,+-- * Constants+	tag,+	elementTag,+	defaultConfigVersion,+--	separator,+-- * Functions+	normalise,+-- ** Translation+	fromString,+	toString+) where++import qualified	Data.List++-- | Used to qualify SQL & XML.+tag :: String+tag		= "configVersion"++-- | Used to qualify XML.+elementTag :: String+elementTag	= "versionElement"++-- | The type of the version of the configuration-file format; major to minor.+type ConfigVersion	= [Int]++-- | The default value for 'getConfigVersion'.+defaultConfigVersion :: ConfigVersion+defaultConfigVersion	= []++-- | Discard irrelevant trailing zeroes.+normalise :: ConfigVersion -> ConfigVersion+normalise	= Data.List.dropWhileEnd (== 0)++-- | The separator to use when representing 'ConfigVersion' as a dotted-decimal 'String'.+separator :: Char+separator	= '.'++{- |+	* Splits a dotted-decimal string into a list of integers.++	* CAVEAT: negative version-elements aren't accepted & trailing zeroes are dropped.+-}+fromString :: String -> ConfigVersion+fromString	= normalise . slave where+	slave s+		| null remainder	= [i]	-- Terminate.+		| otherwise		= i : slave (tail {-drop the separator-} remainder) {-recurse-}+		where+			(versionElement, remainder)	= break (== separator) s	-- CAVEAT: either part may be null.++			i+				| null versionElement	= 0	-- Interpret a blank element as zero.+				| num < 0		= error $ "WeekDaze.Input.ConfigVersion.fromString:\tnegative version-element" ++ show num ++ "."+				| otherwise		= num+				where+					num	= read versionElement	-- Parse.++-- | Represent a /ConfigVersion/ as a dotted-decimal string.+toString :: ConfigVersion -> String+toString	= Data.List.intercalate [separator] . map show+
+ src-lib/WeekDaze/Input/Options.hs view
@@ -0,0 +1,1030 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines all configured options.++	* These options are categorised into those which; define the problem, drive the implementation of the solution, & govern the required output;+	& consequently, most of this module's interface merely proxies requests to the appropriate sub-module.+-}++module WeekDaze.Input.Options(+-- * Types+-- ** Type-synonyms+	ShowLocationViewOfTimetable,+	ShowTeacherViewOfTimetable,+--	Mutator,+-- ** Data-types+	Options(..),+-- * Constants+	tag,+-- * Functions+-- ** Mutators+	appendOutputStudentViewTimetableFilePath,+--	criteriaWeightsMutator,+	setDisplayRuntimeInformation,+	setFecundityDecayRatio,+	setInputStudentViewTimetableFilePath,+	setMaybeNInitialScouts,+	setMaybeOutputConfigFilePath,+	setMaybeRandomSeed,+	setMinimumPopulationDiversityRatio,+	setNDecimalDigits,+	setOptimiseLessonCriteriaWeights,+--	setLessonCriteriaWeights,+	setPermitTemporaryStudentBodyMerger,+	setReduceStudentBodyRegister,+	setRemoveRedundantCourses,+--	setTimetableCriteriaWeights,+	setTimeslotIdBounds,+	setVerbosity,+--	setWeekend,+	zeroInappropriateExecutionOptions+) where++import			Control.Arrow((&&&))+import qualified	Control.Arrow+import qualified	Control.Monad.Writer+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Distribution.Verbosity+import qualified	Factory.Data.Interval+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle					as HXT+import qualified	Text.XML.HXT.DOM.Util+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Aggregate.LocationCatalogue				as Aggregate.LocationCatalogue+import qualified	WeekDaze.Aggregate.StudentBodyRegister				as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Aggregate.StudentClass					as Aggregate.StudentClass+import qualified	WeekDaze.Aggregate.TeacherRegister				as Aggregate.TeacherRegister+import qualified	WeekDaze.Configuration						as Configuration+import qualified	WeekDaze.Data.Course						as Data.Course+import qualified	WeekDaze.Data.Student						as Data.Student+import qualified	WeekDaze.Data.Teacher						as Data.Teacher+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight			as ExecutionConfiguration.CriterionWeight+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies		as ExecutionConfiguration.EvolutionStrategies+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions		as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.ExecutionConfiguration.LessonCriteriaWeights		as ExecutionConfiguration.LessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights	as ExecutionConfiguration.OptimiseLessonCriteriaWeights+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity	as ExecutionConfiguration.TimetableBreederFecundity+import qualified	WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights	as ExecutionConfiguration.TimetableCriteriaWeights+import qualified	WeekDaze.Input.ConfigVersion					as Input.ConfigVersion+import qualified	WeekDaze.OutputConfiguration.FileFormat				as OutputConfiguration.FileFormat+import qualified	WeekDaze.OutputConfiguration.Format				as OutputConfiguration.Format+import qualified	WeekDaze.OutputConfiguration.Options				as OutputConfiguration.Options+import qualified	WeekDaze.OutputConfiguration.Style				as OutputConfiguration.Style+import qualified	WeekDaze.OutputConfiguration.View				as OutputConfiguration.View+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters			as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.ProblemConfiguration.ProblemValidationSwitches		as ProblemConfiguration.ProblemValidationSwitches+import qualified	WeekDaze.Size							as Size+import qualified	WeekDaze.Temporal.Day						as Temporal.Day++#ifdef USE_HDBC+import qualified	Control.DeepSeq+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector					as Database.Selector++instance (+	Control.DeepSeq.NFData			campus,+	Control.DeepSeq.NFData			criterionWeight,+	Control.DeepSeq.NFData			level,+	Control.DeepSeq.NFData			fecundityDecayRatio,+	Control.DeepSeq.NFData			locationId,+	Control.DeepSeq.NFData			minimumContrastRatio,+	Control.DeepSeq.NFData			populationDiversityRatio,+	Control.DeepSeq.NFData			stream,+	Control.DeepSeq.NFData			synchronisationId,+	Control.DeepSeq.NFData			teacherId,+	Control.DeepSeq.NFData			teachingRatio,+	Control.DeepSeq.NFData			timeslotId,+	Data.Convertible.Convertible		Database.HDBC.SqlValue campus,				-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue criterionWeight,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue fecundityDecayRatio,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue level,				-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue locationId,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue populationDiversityRatio,	-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue stream,				-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue synchronisationId,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue teacherId,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue teachingRatio,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue timeslotId,			-- Flexible context.+	Data.Default.Default			campus,+	Data.Default.Default			stream,+	Data.Typeable.Typeable			criterionWeight,+	Data.Typeable.Typeable			fecundityDecayRatio,+	Data.Typeable.Typeable			populationDiversityRatio,+	Data.Typeable.Typeable			teachingRatio,+	Fractional				minimumContrastRatio,+	Ord					level,+	Ord					locationId,+	Ord					synchronisationId,+	Ord					teacherId,+	Ord					timeslotId,+	RealFrac				criterionWeight,+	RealFrac				fecundityDecayRatio,+	RealFrac				populationDiversityRatio,+	RealFrac				teachingRatio,+	Show					campus,+	Show					criterionWeight,+	Show					level,+	Show					locationId,+	Show					minimumContrastRatio,+	Show					synchronisationId,+	Show					timeslotId+ ) => Database.Selector.Selector (Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId) where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= Database.Selector.tablePrefix ++ tag+	 in do+		configVersionStrings	<- map head {-for each row select the only column-} `fmap` Database.Selector.select connection [Input.ConfigVersion.tag] [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]	-- Extract the configVersion for this project; there can only be zero or one row.++		(problemParameters, executionOptions, outputOptions)+#ifdef QUERY_DB_CONCURRENTLY+			<- Database.Selector.fromDatabaseConcurrently connection projectIdSql+#else+			<- Database.Selector.fromDatabase connection projectIdSql+#endif+		return {-to IO-monad-} MkOptions {+			getConfigVersion	= if null configVersionStrings+				then Input.ConfigVersion.defaultConfigVersion+				else {-defined-} Data.Maybe.maybe (+					error $ "WeekDaze.Input.Options.fromDatabase:\tnull " ++ show Input.ConfigVersion.tag ++ "."+				) Input.ConfigVersion.fromString . Database.HDBC.fromSql $ head configVersionStrings,+			getProblemParameters	= problemParameters,+			getExecutionOptions	= executionOptions,+			getOutputOptions	= outputOptions+		}+#endif /* USE_HDBC */++-- | The type of a function used to transform 'Options'.+type Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId	= Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId -> Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId++-- | Mutator.+appendOutputStudentViewTimetableFilePath+	:: Show minimumContrastRatio+	=> System.FilePath.FilePath+	-> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+appendOutputStudentViewTimetableFilePath filePath options	= options {+	getOutputOptions	= outputOptions {+		OutputConfiguration.Options.getFileFormats	= OutputConfiguration.FileFormat.mkFileFormat filePath (OutputConfiguration.Format.XML OutputConfiguration.View.StudentView) : OutputConfiguration.Options.getFileFormats outputOptions+	}+} where+	outputOptions	= getOutputOptions options++-- Used to qualify XML.+tag :: String+tag	= "options"++-- | Defines whether the /timetable/ should be shown, from the point-of-view of each /location/.+type ShowLocationViewOfTimetable	= Bool++-- | Defines whether the /timetable/ should be shown, from the point-of-view of each /teacher/.+type ShowTeacherViewOfTimetable	= Bool++-- | Defines the command-line options.+data Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId	= MkOptions {+	getConfigVersion	:: Input.ConfigVersion.ConfigVersion,														-- ^ The version of the semantics & structure of the configuration-file; cf. the version of XML in which it's written.+	getExecutionOptions	:: ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio,			-- ^ Defines the means by which the problem should be solved.+	getOutputOptions	:: OutputConfiguration.Options.Options minimumContrastRatio,											-- ^ Defines the presentation of the results.+	getProblemParameters	:: ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	-- ^ Defines the parameters of the problem.+} deriving (Eq, Show)++instance (+	Enum		timeslotId,+	Num		fecundityDecayRatio,+	Num		populationDiversityRatio,+	Ord		fecundityDecayRatio,+	Ord		level,+	Ord		locationId,+	Ord		populationDiversityRatio,+	Ord		stream,+	Ord		synchronisationId,+	Ord		teacherId,+	Ord		timeslotId,+	Real		criterionWeight,+	RealFrac	teachingRatio,+	Show		criterionWeight,+	Show		fecundityDecayRatio,+	Show		level,+	Show		locationId,+	Show		minimumContrastRatio,+	Show		populationDiversityRatio,+	Show		stream,+	Show		synchronisationId,+	Show		teacherId,+	Show		teachingRatio,+	Show		timeslotId+ ) => ToolShed.SelfValidate.SelfValidator (Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId) where+	getErrors MkOptions {+		getExecutionOptions	= executionOptions,+		getOutputOptions	= outputOptions,+		getProblemParameters	= problemParameters+	}+		| not $ ToolShed.SelfValidate.isValid executionOptions	= ToolShed.SelfValidate.getErrors executionOptions+		| not $ ToolShed.SelfValidate.isValid outputOptions	= ToolShed.SelfValidate.getErrors outputOptions+		| not $ ToolShed.SelfValidate.isValid problemParameters	= ToolShed.SelfValidate.getErrors problemParameters+		| otherwise						= ToolShed.SelfValidate.extractErrors [+			(+				ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions && uncurry (||) (+					ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodiesExceedTeachers &&& ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsLocationCapacity $ ProblemConfiguration.ProblemParameters.getProblemValidationSwitches problemParameters+				),+				show ExecutionConfiguration.ExecutionOptions.permitTemporaryStudentBodyMergerTag ++ " & any of " ++ show [ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodiesExceedTeachersTag, ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodySizeExceedsLocationCapacityTag] ++ ", are incompatible"+			),+			let+				nMutations, nTimeslotsPerWeek :: Size.NTimeslots+				nMutations		= ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationNTimeslots $ ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions+				nTimeslotsPerWeek	= ProblemConfiguration.ProblemParameters.calculateNTimeslotsPerDay (ProblemConfiguration.ProblemParameters.getTimeslotIdBounds problemParameters) * Temporal.Day.nDaysPerWeek+			in (+				nMutations > nTimeslotsPerWeek,+				"the specified number of time-slots " ++ show nMutations ++ ", to mutate during " ++ show ExecutionConfiguration.EvolutionStrategies.studentViewTimetableForWeekMutationTag ++ ", mustn't exceed the " ++ show nTimeslotsPerWeek ++ " available time-slots per week"+			)+		]++instance (+	Data.Default.Default	campus,+	Data.Default.Default	stream,+	Eq			campus,+	Eq			stream,+	Fractional		criterionWeight,+	Fractional		fecundityDecayRatio,+	Fractional		minimumContrastRatio,+	Fractional		populationDiversityRatio,+	HXT.XmlPickler		campus,+	HXT.XmlPickler		criterionWeight,+	HXT.XmlPickler		fecundityDecayRatio,+	HXT.XmlPickler		level,+	HXT.XmlPickler		locationId,+	HXT.XmlPickler		minimumContrastRatio,+	HXT.XmlPickler		populationDiversityRatio,+	HXT.XmlPickler		stream,+	HXT.XmlPickler		synchronisationId,+	HXT.XmlPickler		teacherId,+	HXT.XmlPickler		teachingRatio,+	HXT.XmlPickler		timeslotId,+	Ord			fecundityDecayRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			populationDiversityRatio,+	Ord			synchronisationId,+	Ord			teacherId,+	Ord			timeslotId,+	Real			criterionWeight,+	Real			teachingRatio,+	Show			campus,+	Show			criterionWeight,+	Show			fecundityDecayRatio,+	Show			level,+	Show			minimumContrastRatio,+	Show			populationDiversityRatio,+	Show			synchronisationId,+	Show			timeslotId+ ) => HXT.XmlPickler (Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		Text.XML.HXT.DOM.Util.uncurry4 MkOptions,	-- Construct from a quadruple.+		\MkOptions {+			getConfigVersion	= configVersion,+			getExecutionOptions	= executionOptions,+			getOutputOptions	= outputOptions,+			getProblemParameters	= problemParameters+		} -> (+			configVersion,+			executionOptions,+			outputOptions,+			problemParameters+		) -- Deconstruct to a quadruple.+	 ) $ HXT.xp4Tuple (+		HXT.xpDefault Input.ConfigVersion.defaultConfigVersion . HXT.xpElem Input.ConfigVersion.tag . HXT.xpList1 {-the default is null-} . HXT.xpElem Input.ConfigVersion.elementTag $ HXT.xpAttr "integer" HXT.xpInt+	 ) (+		HXT.xpDefault Data.Default.def HXT.xpickle	-- executionOptions.+	 ) HXT.xpickle {-outputOptions-} HXT.xpickle {-problemParameters-}++{- |+	* Mutator.++	* Sets /displayRuntimeInformation/ in all XHTML-formats.+-}+setDisplayRuntimeInformation :: OutputConfiguration.Style.DisplayRuntimeInformation -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setDisplayRuntimeInformation b options	= options {+	getOutputOptions	= outputOptions {+		OutputConfiguration.Options.getFileFormats	= map (+			\fileFormat -> fileFormat {+				OutputConfiguration.FileFormat.getFormat	= case OutputConfiguration.FileFormat.getFormat fileFormat of+					OutputConfiguration.Format.XHTML style	-> OutputConfiguration.Format.XHTML style { OutputConfiguration.Style.getDisplayRuntimeInformation = b }+					xml					-> xml+			}+		) $ OutputConfiguration.Options.getFileFormats outputOptions+	}+} where+	outputOptions	= getOutputOptions options++-- | Mutator.+setFecundityDecayRatio :: fecundityDecayRatio -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setFecundityDecayRatio fecundityDecayRatio options	= options {+	getExecutionOptions	= ExecutionConfiguration.ExecutionOptions.setFecundityDecayRatio fecundityDecayRatio $ getExecutionOptions options+}++-- | Mutator.+setInputStudentViewTimetableFilePath :: System.FilePath.FilePath -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setInputStudentViewTimetableFilePath filePath options	= options {+	getExecutionOptions	= (getExecutionOptions options) {+		ExecutionConfiguration.ExecutionOptions.getMaybeHint	= Just $ Right filePath+	}+}++-- | Mutator.+setMaybeNInitialScouts :: Maybe Size.NTimetables -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setMaybeNInitialScouts maybeNInitialScouts options	= options {+	getExecutionOptions	= ExecutionConfiguration.ExecutionOptions.setMaybeNInitialScouts maybeNInitialScouts $ getExecutionOptions options+}++-- | Mutator.+setMaybeOutputConfigFilePath :: Maybe System.FilePath.FilePath -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setMaybeOutputConfigFilePath maybeOutputConfigFilePath options	= options {+	getOutputOptions	= (getOutputOptions options) {+		OutputConfiguration.Options.getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath+	}+}++-- | Mutator.+setMaybeRandomSeed :: Maybe ExecutionConfiguration.ExecutionOptions.RandomSeed -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setMaybeRandomSeed maybeSeed options	= options {+	getExecutionOptions	= (getExecutionOptions options) {+		ExecutionConfiguration.ExecutionOptions.getMaybeRandomSeed	= maybeSeed+	}+}++-- | Mutator.+setMinimumPopulationDiversityRatio :: populationDiversityRatio -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setMinimumPopulationDiversityRatio populationDiversityRatio options	= options {+	getExecutionOptions	= ExecutionConfiguration.ExecutionOptions.setMinimumPopulationDiversityRatio populationDiversityRatio $ getExecutionOptions options+}++-- | Mutator.+setNDecimalDigits :: OutputConfiguration.Options.NDecimalDigits -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setNDecimalDigits nDecimalDigits options	= options {+	getOutputOptions	= (getOutputOptions options) {+		OutputConfiguration.Options.getNDecimalDigits	= nDecimalDigits+	}+}++-- | Mutator.+setOptimiseLessonCriteriaWeights :: ExecutionConfiguration.OptimiseLessonCriteriaWeights.OptimiseLessonCriteriaWeights criterionWeight -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setOptimiseLessonCriteriaWeights optimiseLessonCriteriaWeights options	= options {+	getExecutionOptions	= (getExecutionOptions options) {+		ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights+	}+}++{- |+	* Mutator.++	* Other options are dependent on this one, & so are also toggled.+	If this is inappropriate, then they can always be toggled back, by a separate request.+-}+setPermitTemporaryStudentBodyMerger :: Num criterionWeight => ExecutionConfiguration.ExecutionOptions.PermitTemporaryStudentBodyMerger -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setPermitTemporaryStudentBodyMerger permitTemporaryStudentBodyMerger options	= options {+	getProblemParameters	= problemParameters {+		ProblemConfiguration.ProblemParameters.getProblemValidationSwitches	= (ProblemConfiguration.ProblemParameters.getProblemValidationSwitches problemParameters) {+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodiesExceedTeachers		= not permitTemporaryStudentBodyMerger,+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsLocationCapacity	= not permitTemporaryStudentBodyMerger+		}+	},+	getExecutionOptions	= ExecutionConfiguration.ExecutionOptions.setPermitTemporaryStudentBodyMerger permitTemporaryStudentBodyMerger $ getExecutionOptions options+} where+	problemParameters	= getProblemParameters options++-- | Mutator.+setReduceStudentBodyRegister :: ExecutionConfiguration.ExecutionOptions.ReduceStudentBodyRegister -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setReduceStudentBodyRegister b options	= options {+	getExecutionOptions	= (getExecutionOptions options) {+		ExecutionConfiguration.ExecutionOptions.getReduceStudentBodyRegister	= b+	}+}++-- | Mutator.+setRemoveRedundantCourses :: ExecutionConfiguration.ExecutionOptions.RemoveRedundantCourses -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setRemoveRedundantCourses b options	= options {+	getExecutionOptions	= (getExecutionOptions options) {+		ExecutionConfiguration.ExecutionOptions.getRemoveRedundantCourses	= b+	}+}++-- | Mutator.+setTimetableCriteriaWeights :: ExecutionConfiguration.TimetableCriteriaWeights.TimetableCriteriaWeights criterionWeight -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setTimetableCriteriaWeights timetableCriteriaWeights options	= options {+	getExecutionOptions	= (getExecutionOptions options) {+		ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights	= timetableCriteriaWeights+	}+}++{- |+	* Mutator.++	* As a side-effect various criteria-weights may be turned-off, because the concepts to which they relate, don't exist until there're sufficient /time-slot/s per day.+-}+setTimeslotIdBounds :: (Enum timeslotId, Num criterionWeight) => Factory.Data.Interval.Interval timeslotId -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setTimeslotIdBounds timeslotIdBounds options+	| timeslotsPerDay < 2	= setTimetableCriteriaWeights (+		timetableCriteriaWeights {+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= minBound,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfConsecutiveEqualLessons			= minBound,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		= minBound+		} -- Turn off those criteria for which there's no concept until there're two timeslots per day.+	) options'+	| timeslotsPerDay < 3	= setTimetableCriteriaWeights (+		timetableCriteriaWeights {+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay	= minBound+		} -- Turn off those criteria for which there's no concept until there're three timeslots per day.+	) options'+	| otherwise	= options'+	where+		timeslotsPerDay	= ProblemConfiguration.ProblemParameters.calculateNTimeslotsPerDay timeslotIdBounds++		options'	= options {+			getProblemParameters	= (getProblemParameters options) {+				ProblemConfiguration.ProblemParameters.getTimeslotIdBounds	= timeslotIdBounds+			}+		} -- Amend timeslotIdBounds as directly requested.++		timetableCriteriaWeights	= ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights $ getExecutionOptions options'++-- | Mutator.+setVerbosity :: Distribution.Verbosity.Verbosity -> Mutator campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId+setVerbosity verbosity options	= options {+	getOutputOptions	= (getOutputOptions options) {+		OutputConfiguration.Options.getVerbosity	= verbosity+	}+}++{- |+	* Depending on each of the specified flags, uses the specified function to mutate each corresponding /criterion-weight/.+	* Logs the tags of all those criterion-weights changed.+-}+criteriaWeightsMutator :: (+	Eq	criterionWeight,+	Num	criterionWeight+ )+	=> criteriaWeights+	-> [+		(+			(+				criteriaWeights -> ExecutionConfiguration.CriterionWeight.CriterionWeight criterionWeight,+				Bool+			), (+				criteriaWeights -> criteriaWeights,+				String+			) -- Pair.+		) -- Pair.+	] -- ^ [((Criterion-weights accessor, Whether to mutate this criterion-weight), (Criteria-weights mutator, Criterion-weight tag))].+	-> Control.Monad.Writer.Writer [String] criteriaWeights	-- ^ Zeroed tags & transformed value.+criteriaWeightsMutator criteriaWeights = foldr (+	(+		\(mutator, message)	-> (+			Control.Monad.Writer.tell [message] >>	-- Log the tag.+		) . fmap mutator	-- Apply the mutator.+	) . snd+ ) (+	return {-to Writer-monad-} criteriaWeights	-- Initial value.+ ) . filter (+	uncurry (&&) . Control.Arrow.first (+		(/= minBound) . ($ criteriaWeights)+	) . fst {-conditions-}+ )++{- |+	* Zeroes the weight of each /lesson-criterion/ & /timetable-criterion/, & the /fecundity/ of each /evolution-strategy/,+	which is either inappropriate for, or irrelevant to, the specified /problem-parameters/.++	* Logs the affected tags.+-}+zeroInappropriateExecutionOptions :: (+	Enum		timeslotId,+	Eq		criterionWeight,+	Num		criterionWeight,+	Ord		campus,+	Ord		level,+	Ord		synchronisationId,+	Ord		timeslotId,+	RealFrac	teachingRatio+ )+	=> Bool	-- ^ Whether to zero non-critical weights, or merely those that must be zeroed to avoid generating an error.+	-> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio	-- ^ Initial value.+	-> (+		ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio,+		(+			(+				[String],+				[String]+			),+			[String]+		)+	) -- ^ Transformed /evolution-strategies/, & the tags of zeroed ((/lesson-criteria weights/, /timetable-criteria weights/), /evolution-strategy fecundities/).+zeroInappropriateExecutionOptions zeroNonCritical problemParameters executionOptions	= (+	executionOptions {+		ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights	= lessonCriteriaWeights,+		ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights	= timetableCriteriaWeights,+		ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies		= evolutionStrategies+	}, (+		(+			zeroedLessonCriterionWeightTags,+			zeroedTimetableCriterionWeightTags+		), -- Pair.+		zeroedEvolutionStrategyFecundityTags+	) -- Pair.+ ) where+	nTimeslotsPerDay :: Size.NTimeslots+	nTimeslotsPerDay	= ProblemConfiguration.ProblemParameters.calculateNTimeslotsPerDay $ ProblemConfiguration.ProblemParameters.getTimeslotIdBounds problemParameters++	permitTemporaryStudentBodyMerger :: Bool+	permitTemporaryStudentBodyMerger	= ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions++	locationCatalogue	= ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters		-- Access.+	studentBodyRegister	= ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters	-- Access.+	teacherRegister		= ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters		-- Access.++	nLocations :: Size.NLocations+	nLocations	= Data.Map.size locationCatalogue++	nStudents :: Size.NStudents+	nStudents	= Aggregate.StudentClass.getSize $ Aggregate.StudentBodyRegister.getStudentBodies studentBodyRegister++	nTeachers :: Size.NTeachers+	nTeachers	= Data.Map.size teacherRegister++	(distinctCourses, noTeacherHasMoreThanOneLesson)	= Aggregate.TeacherRegister.extractDistinctCourses &&& Data.Foldable.all (+		(<= 1) . Data.Foldable.foldr (+			(+) . Data.Course.getRequiredLessonsPerWeek+		) 0 . Data.Teacher.getService+	 ) $ teacherRegister++	hasAnyFacilities, isSingleCampus, hasAnyOptionalKnowledgeRequirements, hasAnyCourseMaximumClassSizes, hasAnySynchronisedCourses, requireAnyFacilities :: Bool+	(hasAnyFacilities, isSingleCampus)				= Aggregate.LocationCatalogue.hasAnyFacilities &&& Aggregate.LocationCatalogue.isSingleCampus $ locationCatalogue+	hasAnyOptionalKnowledgeRequirements				= Aggregate.StudentBodyRegister.hasAnyOptionalKnowledgeRequirements studentBodyRegister+	(hasAnyCourseMaximumClassSizes, hasAnySynchronisedCourses)	= Aggregate.TeacherRegister.hasAnyCourseMaximumClassSizes &&& Aggregate.TeacherRegister.hasAnySynchronisedCourses $ teacherRegister+	requireAnyFacilities						= Data.Foldable.any (not . Data.Set.null . Data.Course.getRequiredFacilityNames) distinctCourses++	smallestMinimumConsecutivePeriods :: Size.NTimeslots+	smallestMinimumConsecutivePeriods	= Data.Foldable.minimum $ Data.Set.map Data.Course.getMinimumConsecutiveLessons distinctCourses++	(lessonCriteriaWeights, zeroedLessonCriterionWeightTags)	= Control.Monad.Writer.runWriter $ criteriaWeightsMutator (+		ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights executionOptions+	 ) [+		(+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfGreatestMinimumConsecutiveLessons,+				zeroNonCritical && not (+					ProblemConfiguration.ProblemParameters.hasVariousMinimumConsecutiveLessons problemParameters+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfGreatestMinimumConsecutiveLessons,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfGreatestMinimumConsecutiveLessonsTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfGreatestSynchronisedCourseSetSize,+				zeroNonCritical && not hasAnySynchronisedCourses	-- Singleton synchronised courses are trapped by ProblemParameters.+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfGreatestSynchronisedCourseSetSize,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfGreatestSynchronisedCourseSetSizeTag+			)+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfIsCoreKnowledgeRequirement,+				zeroNonCritical && not (+					Aggregate.StudentBodyRegister.hasAnyCoreKnowledgeRequirements studentBodyRegister {-enforced by DTD, but not by database-} && hasAnyOptionalKnowledgeRequirements+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfIsCoreKnowledgeRequirement,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfIsCoreKnowledgeRequirementTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfIsSpecialistInTopic,+				zeroNonCritical && (+					nTeachers == 1 || not (Aggregate.TeacherRegister.hasAnySpecialists teacherRegister)+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfIsSpecialistInTopic,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfIsSpecialistInTopicTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMatchCourseClassSizeToLocationCapacity,+				zeroNonCritical && (+					nLocations == 1 || not hasAnyCourseMaximumClassSizes+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMatchCourseClassSizeToLocationCapacity,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMatchCourseClassSizeToLocationCapacityTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseRelativeFacilityUtilisation,+				zeroNonCritical && not (+					hasAnyFacilities && requireAnyFacilities+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMaximiseRelativeFacilityUtilisation,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseRelativeFacilityUtilisationTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverCourseClassSize,+				zeroNonCritical && or [+					Data.Map.size studentBodyRegister == 1,+					not hasAnyCourseMaximumClassSizes,+					Data.Foldable.all (+						Data.Maybe.maybe True (+							>= nStudents -- Compare each maximum class-size with the total number of students.+						) . Data.Course.getMaybeMaximumClassSize+					) distinctCourses+				]+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMaximiseStudentClassSizeOverCourseClassSize,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseStudentClassSizeOverCourseClassSizeTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverLocationCapacity,+				zeroNonCritical && nLocations == 1	-- CAVEAT: if there's only one student-body, it's still better to book them into a location of appropriate capacity, since it reduces the heating-bill.+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMaximiseStudentClassSizeOverLocationCapacity,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseStudentClassSizeOverLocationCapacityTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+				zeroNonCritical && not (Aggregate.TeacherRegister.hasAnySpecificTimeRequests teacherRegister)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseBookingOfLocationByOtherTeachers,+				zeroNonCritical && (+					nLocations == 1 || nTeachers == 1+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseBookingOfLocationByOtherTeachers,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseBookingOfLocationByOtherTeachersTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseDeviationFromTimeslotRequest,+				zeroNonCritical && not (Aggregate.TeacherRegister.hasAnyTimeslotRequests teacherRegister)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseDeviationFromTimeslotRequest,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseDeviationFromTimeslotRequestTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseInterCampusMigrationsOfStudents,+				zeroNonCritical && (+					nTimeslotsPerDay <= smallestMinimumConsecutivePeriods || isSingleCampus+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseInterCampusMigrationsOfStudents,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseInterCampusMigrationsOfStudentsTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseInterCampusMigrationsOfTeachers,+				zeroNonCritical && (+					nTimeslotsPerDay <= smallestMinimumConsecutivePeriods || isSingleCampus+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseInterCampusMigrationsOfTeachers,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseInterCampusMigrationsOfTeachersTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseTeachersLocusOperandi,+				zeroNonCritical && (+					nLocations == 1 || noTeacherHasMoreThanOneLesson+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseTeachersLocusOperandi,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseTeachersLocusOperandiTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseWasteOfScarceFacilities,+				zeroNonCritical && not (+					hasAnyFacilities && requireAnyFacilities+				)+			), (+				ExecutionConfiguration.LessonCriteriaWeights.zeroWeightOfMinimiseWasteOfScarceFacilities,+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseWasteOfScarceFacilitiesTag+			) -- Pair.+		) -- Pair.+	 ]++	(timetableCriteriaWeights, zeroedTimetableCriterionWeightTags)	= Control.Monad.Writer.runWriter $ criteriaWeightsMutator (+		ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights executionOptions+	 ) [+		(+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseComplianceWithFreePeriodPreferences,+				zeroNonCritical && (+					nTimeslotsPerDay <= smallestMinimumConsecutivePeriods || not (+						ProblemConfiguration.ProblemParameters.hasAnyFreePeriodPreference problemParameters+					)+				)+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMaximiseComplianceWithFreePeriodPreferences,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseComplianceWithFreePeriodPreferencesTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseSynchronisationOfSynchronisedCourses,+				zeroNonCritical && not hasAnySynchronisedCourses	-- Singleton synchronised courses are trapped by ProblemParameters.+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseSynchronisationOfSynchronisedCoursesTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+				zeroNonCritical && (+					nTimeslotsPerDay <= smallestMinimumConsecutivePeriods || not (+						Aggregate.TeacherRegister.hasAnyIdealTimeslotRequests teacherRegister+					)+				)+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+				zeroNonCritical && Data.Foldable.all (+					(== 1) . Data.Student.getTeachingRatio+				) studentBodyRegister+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanInterCampusMigrationsOfStudents,+				zeroNonCritical && (+					nTimeslotsPerDay <= smallestMinimumConsecutivePeriods || isSingleCampus+				)+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers,+				zeroNonCritical && (+					nTimeslotsPerDay <= smallestMinimumConsecutivePeriods || isSingleCampus+				)+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanLocationChangesOfTeachers,+				zeroNonCritical && (+					nLocations == 1 || noTeacherHasMoreThanOneLesson+				)+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseMeanLocationChangesOfTeachers,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanLocationChangesOfTeachersTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanLocusOperandiOfTeachers,+				zeroNonCritical && (+					nLocations == 1 || noTeacherHasMoreThanOneLesson+				)+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseMeanLocusOperandiOfTeachers,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanLocusOperandiOfTeachersTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+				zeroNonCritical && not hasAnyOptionalKnowledgeRequirements+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfConsecutiveEqualLessons,+				nTimeslotsPerDay <= smallestMinimumConsecutivePeriods	-- CAVEAT: required to prevent an attempt to divide by zero.+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseRatioOfConsecutiveEqualLessonsTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay,+				nTimeslotsPerDay <= 2 * smallestMinimumConsecutivePeriods	-- CAVEAT: required to prevent an attempt to divide by zero.+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay,+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag+			) -- Pair.+		) -- Pair.+	 ]++	(evolutionStrategies, zeroedEvolutionStrategyFecundityTags)	= Control.Monad.Writer.runWriter . foldr (+		(+			\(mutator, message)	-> (+				Control.Monad.Writer.tell [message] >>	-- Log the tag.+			) . fmap mutator	-- Apply the mutator.+		) . snd+	 ) (+		return {-to Writer-monad-} $ ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions	-- Initial value.+	 ) $ filter (+		uncurry (&&) . Control.Arrow.first (+			(/= ExecutionConfiguration.TimetableBreederFecundity.zero) . ($ ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies executionOptions)+		) . fst {-conditions-}+	 ) [+		(+			(+				ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseMutationFecundity,+				zeroNonCritical && not hasAnySynchronisedCourses	-- Singleton synchronised courses are trapped by ProblemParameters.+			), (+				ExecutionConfiguration.EvolutionStrategies.zeroSynchronisedCourseMutationFecundity,+				ExecutionConfiguration.EvolutionStrategies.synchronisedCourseMutationTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseByDayMutationFecundity,+				zeroNonCritical && not hasAnySynchronisedCourses	-- Singleton synchronised courses are trapped by ProblemParameters.+			), (+				ExecutionConfiguration.EvolutionStrategies.zeroSynchronisedCourseByDayMutationFecundity,+				ExecutionConfiguration.EvolutionStrategies.synchronisedCourseByDayMutationTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.EvolutionStrategies.getExcessRunlengthMutationFecundity,+				zeroNonCritical && nTimeslotsPerDay <= smallestMinimumConsecutivePeriods+			), (+				ExecutionConfiguration.EvolutionStrategies.zeroExcessRunlengthMutationFecundity,+				ExecutionConfiguration.EvolutionStrategies.excessRunlengthMutationTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.EvolutionStrategies.getSingletonStudentClassMutationFecundity,+				zeroNonCritical && not permitTemporaryStudentBodyMerger+			), (+				ExecutionConfiguration.EvolutionStrategies.zeroSingletonStudentClassMutationFecundity,+				ExecutionConfiguration.EvolutionStrategies.singletonStudentClassMutationTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.EvolutionStrategies.getSplitSessionMutationFecundity,+				zeroNonCritical && nTimeslotsPerDay <= 2 * smallestMinimumConsecutivePeriods+			), (+				ExecutionConfiguration.EvolutionStrategies.zeroSplitSessionMutationFecundity,+				ExecutionConfiguration.EvolutionStrategies.splitSessionMutationTag+			) -- Pair.+		), (+			(+				ExecutionConfiguration.EvolutionStrategies.getStudentBodyCombinationMutationFecundity,+				zeroNonCritical && not permitTemporaryStudentBodyMerger+			), (+				ExecutionConfiguration.EvolutionStrategies.zeroStudentBodyCombinationMutationFecundity,+				ExecutionConfiguration.EvolutionStrategies.studentBodyCombinationMutationTag+			) -- Pair.+		) -- Pair.+	 ]++instance (+	Enum		timeslotId,+	Eq		criterionWeight,+	Num		criterionWeight,+	Ord		campus,+	Ord		level,+	Ord		synchronisationId,+	Ord		teacherId,+	Ord		timeslotId,+	RealFrac	teachingRatio,+	Show		level,+	Show		synchronisationId,+	Show		teacherId,+	Show		timeslotId+ ) => Configuration.Configuration (Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId) where+	issueWarnings inputOptions	= Configuration.issueWarnings executionOptions ++ Configuration.issueWarnings problemParameters ++ [+		message ++ ", but the weight assigned to the lesson-criterion " ++ show criterionTag ++ " is zero" | (criterionWeightAccessor, condition, message, criterionTag)	<- [+			(+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfGreatestSynchronisedCourseSetSize,+				hasAnySynchronisedCourses,+				"synchronised courses have been defined",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfGreatestSynchronisedCourseSetSizeTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfIsSpecialistInTopic,+				Aggregate.TeacherRegister.hasAnySpecialists teacherRegister,+				"topic-specialists have been defined",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfIsSpecialistInTopicTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseRelativeFacilityUtilisation,+				hasAnyFacilities,+				"facilities have been defined in various locations",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMaximiseRelativeFacilityUtilisationTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseWasteOfScarceFacilities,+				hasAnyFacilities,+				"facilities have been defined in various locations",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseWasteOfScarceFacilitiesTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+				hasAnyTimeslotRequests,+				"time-slots have been requested by teachers",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseBookingAtAnotherCoursesSpecifiedTimeTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseDeviationFromTimeslotRequest,+				hasAnyTimeslotRequests,+				"time-slots have been requested by teachers",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseDeviationFromTimeslotRequestTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseInterCampusMigrationsOfStudents,+				not isSingleCampus,+				"locations have been partitioned into different campuses",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseInterCampusMigrationsOfStudentsTag+			), (+				ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseInterCampusMigrationsOfTeachers,+				not isSingleCampus,+				"locations have been partitioned into different campuses",+				ExecutionConfiguration.LessonCriteriaWeights.weightOfMinimiseInterCampusMigrationsOfTeachersTag+			) -- Quadruple.+		],+		criterionWeightAccessor lessonCriteriaWeights == minBound,+		condition+	 ] ++ [+		message ++ ", but the weight assigned to the timetable-criterion " ++ show criterionTag ++ " is zero" | (criterionWeightAccessor, condition, message, criterionTag)	<- [+			(+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseSynchronisationOfSynchronisedCourses,+				hasAnySynchronisedCourses,+				"synchronised courses have been defined",+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseSynchronisationOfSynchronisedCoursesTag+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+				Aggregate.TeacherRegister.hasAnyIdealTimeslotRequests teacherRegister,+				"ideal time-slots have been specified for courses",+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseComplianceWithFreePeriodPreferences,+				ProblemConfiguration.ProblemParameters.hasAnyFreePeriodPreference problemParameters,+				"free-period preferences have been expressed",+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMaximiseComplianceWithFreePeriodPreferencesTag+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanInterCampusMigrationsOfStudents,+				not isSingleCampus,+				"locations have been partitioned into different campuses",+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers,+				not isSingleCampus,+				"locations have been partitioned into different campuses",+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag+			), (+				ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+				Aggregate.StudentBodyRegister.hasAnyOptionalKnowledgeRequirements studentBodyRegister,+				"student-bodies have specified optional knowledge-requirements",+				ExecutionConfiguration.TimetableCriteriaWeights.weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag+			) -- Quadruple.+		],+		criterionWeightAccessor timetableCriteriaWeights == minBound,+		condition+	 ] where+		(executionOptions, problemParameters)			= getExecutionOptions &&& getProblemParameters $ inputOptions+		(lessonCriteriaWeights, timetableCriteriaWeights)	= ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights &&& ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights $ executionOptions+		(studentBodyRegister, teacherRegister)			= ProblemConfiguration.ProblemParameters.getStudentBodyRegister &&& ProblemConfiguration.ProblemParameters.getTeacherRegister $ problemParameters+		locationCatalogue					= ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters+		(hasAnyFacilities, isSingleCampus)			= Aggregate.LocationCatalogue.hasAnyFacilities &&& Aggregate.LocationCatalogue.isSingleCampus $ locationCatalogue+		(hasAnySynchronisedCourses, hasAnyTimeslotRequests)	= Aggregate.TeacherRegister.hasAnySynchronisedCourses &&& Aggregate.TeacherRegister.hasAnyTimeslotRequests $ teacherRegister+
+ src-lib/WeekDaze/LinearModel/Timetable.hs view
@@ -0,0 +1,58 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	A flattened /timetable/, with undefined /time-slot/s removed.+-}++module WeekDaze.LinearModel.Timetable(+-- * Types+-- ** Type-synonyms+	Timetable,+-- * Functions+	unbookWhere,+-- ** Translation+	fromTimetable+) where++import			Control.Arrow((&&&))+import qualified	Data.Array.IArray+import qualified	Data.Map+import qualified	WeekDaze.LinearModel.TimetableForWeek	as LinearModel.TimetableForWeek+import qualified	WeekDaze.Model.Timetable		as Model.Timetable++-- | A flattened /timetable/, compressed by removing all undefined /time-slot/s.+type Timetable observerId timeslotId resourceIds level	= [Model.Timetable.Booking observerId timeslotId resourceIds level]++-- | Serialises the /lesson/-definitions in the specified /timetable/.+fromTimetable :: Data.Array.IArray.Ix timeslotId => Model.Timetable.Timetable observerId timeslotId resourceIds level -> Timetable observerId timeslotId resourceIds level+fromTimetable timetable	= [+	((observerId, time), lesson) |+		(observerId, timetableForWeek)	<- Data.Map.toList timetable,+		(time, lesson)			<- LinearModel.TimetableForWeek.fromTimetableForWeek timetableForWeek+ ] -- List-comprehension.++-- | Unbook anything matching the specified predicate.+unbookWhere :: (Data.Array.IArray.Ix timeslotId, Ord observerId)+	=> (Model.Timetable.Booking observerId timeslotId resourceIds level -> Bool)	-- ^ Predicate used to select bookings.+	-> Model.Timetable.Timetable observerId timeslotId resourceIds level+	-> Model.Timetable.Timetable observerId timeslotId resourceIds level+unbookWhere predicate	= uncurry ($) . (Model.Timetable.undefineTimeslots &&& map Model.Timetable.getBookedCoordinates . filter predicate . fromTimetable)+
+ src-lib/WeekDaze/LinearModel/TimetableForWeek.hs view
@@ -0,0 +1,48 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	A flattened /timetable/, for one week, without any undefined /time-slot/s.+-}++module WeekDaze.LinearModel.TimetableForWeek(+-- * Types+-- ** Type-synonyms+	TimetableForWeek,+-- * Functions+-- ** Translation+	fromTimetableForWeek+) where++import qualified	Data.Array.IArray+import qualified	WeekDaze.Model.TimetableForWeek	as Model.TimetableForWeek+import qualified	WeekDaze.Temporal.Time		as Temporal.Time++-- | A flattened /timetable/, with undefined /time-slot/s removed.+type TimetableForWeek timeslotId resourceIds level	= [Model.TimetableForWeek.Booking timeslotId resourceIds level]++-- | Serialises the /lesson/-definitions in the weekly /timetable/.+fromTimetableForWeek :: Data.Array.IArray.Ix timeslotId => Model.TimetableForWeek.TimetableForWeek timeslotId resourceIds level -> TimetableForWeek timeslotId resourceIds level+fromTimetableForWeek timetableForWeek	= [+	(Temporal.Time.mkTime day timeslotId, lesson) |+		(day, timetableForDay)				<- Data.Array.IArray.assocs timetableForWeek,+		(timeslotId, Just {-i.e. allocated-} lesson)	<- Data.Array.IArray.assocs timetableForDay+ ] -- List-comprehension.+
+ src-lib/WeekDaze/LocationView/Lesson.hs view
@@ -0,0 +1,53 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the data required to define a /time-slot/, in the /timetable/ viewed from the perspective of a /location/.+-}++module WeekDaze.LocationView.Lesson(+-- * Types+-- ** Type-synonyms+	Lesson,+-- ** Translation+	fromStudentView,+	toStudentView+) where++import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.LocationView.LessonResourceIds	as LocationView.LessonResourceIds+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.StudentView.Lesson		as StudentView.Lesson++-- | Specialise for the case in which a /lesson/ is viewed from the perspective of the /location/.+type Lesson teacherId level	= Model.Lesson.Lesson (LocationView.LessonResourceIds.LessonResourceIds teacherId) level++-- | Convert from the /student/-view to a /location/-view.+fromStudentView :: Show teacherId => Aggregate.StudentClass.StudentClass -> StudentView.Lesson.Lesson locationId teacherId level -> Lesson teacherId level+fromStudentView studentClass studentViewLesson	= studentViewLesson {+	Model.Lesson.getResourceIds	= LocationView.LessonResourceIds.fromStudentView studentClass $ Model.Lesson.getResourceIds studentViewLesson+}++-- | Convert from the /location/-view to a /student/-view.+toStudentView :: locationId -> Lesson teacherId level -> StudentView.Lesson.Lesson locationId teacherId level+toStudentView locationId lesson	= lesson {+	Model.Lesson.getResourceIds	= LocationView.LessonResourceIds.toStudentView locationId $ Model.Lesson.getResourceIds lesson+}+
+ src-lib/WeekDaze/LocationView/LessonResourceIds.hs view
@@ -0,0 +1,114 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the /resource/s required for a /lesson/, from the perspective of a /location/.+-}++module WeekDaze.LocationView.LessonResourceIds(+-- * Types+-- ** Data-types+	LessonResourceIds(+--		MkLessonResourceIds,+		getStudentClass,+		getTeacherId+	),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkLessonResourceIds,+-- ** Translation+	fromStudentView,+	toStudentView+) where++import			Control.Arrow((&&&))+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Model.ResourceUser		as Model.ResourceUser+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds+import			Text.XHtml.Strict((+++), (<<))++-- | Used to qualify XML.+tag :: String+tag	= "locationViewLessonResourceIds"++-- | Composed from both the 'Aggregate.StudentClass.StudentClass' & 'teacherId'.+data LessonResourceIds teacherId	= MkLessonResourceIds {+	getStudentClass	:: Aggregate.StudentClass.StudentClass,	-- ^ The class of /student/s to be taught.+	getTeacherId	:: teacherId				-- ^ The identifier for the /teacher/ instructing this /class/.+} deriving (Eq, Show)++instance Text.XHtml.Strict.HTML	teacherId => Text.XHtml.Strict.HTML (LessonResourceIds teacherId) where+	toHtml	= (+		\(studentClass, teacherId) -> Text.XHtml.Strict.li << (studentClass +++ '.') +++ Text.XHtml.Strict.li << (teacherId +++ '.')+	 ) . (+		Aggregate.StudentClass.toHtml . getStudentClass &&& getTeacherId+	 )++instance HXT.XmlPickler teacherId => HXT.XmlPickler (LessonResourceIds teacherId) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry MkLessonResourceIds,		-- Construct from a Pair.+		getStudentClass &&& getTeacherId	-- Deconstruct to a Pair.+	 ) $ (+		HXT.xpElem Aggregate.StudentClass.tag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) $ HXT.xpList1 {-can't be null-} HXT.xpickle {-StudentBody-}+	 ) `HXT.xpPair` HXT.xpickle++instance Eq teacherId => Model.ResourceUser.ResourceUser (LessonResourceIds teacherId) where+	areIndependent l r	= Model.ResourceUser.areIndependent (getStudentClass l) (getStudentClass r) && getTeacherId l /= getTeacherId r++instance Show teacherId => ToolShed.SelfValidate.SelfValidator (LessonResourceIds teacherId) where+	getErrors lessonResourceIds	= ToolShed.SelfValidate.extractErrors [+		(+			Data.Set.null $ getStudentClass lessonResourceIds,+			"a class should be composed from one or more student-bodies; " ++ show lessonResourceIds+		) -- Pair.+	 ]++-- | Smart constructor.+mkLessonResourceIds+	:: Show teacherId+	=> Aggregate.StudentClass.StudentClass	-- ^ The class of /student/s to be instructed.+	-> teacherId				-- ^ The identifier of the /teacher/ taking the class.+	-> LessonResourceIds teacherId+mkLessonResourceIds studentClass teacherId+	| ToolShed.SelfValidate.isValid lessonResourceIds	= lessonResourceIds+	| otherwise						= error $ "WeekDaze.LocationView.LessonResourceIds.mkLessonResourceIds:\t" ++ ToolShed.SelfValidate.getFirstError lessonResourceIds ++ "."+	where+		lessonResourceIds	= MkLessonResourceIds studentClass teacherId++-- | Convert from the /student/-view to a /location/-view.+fromStudentView :: Show teacherId => Aggregate.StudentClass.StudentClass -> StudentView.LessonResourceIds.LessonResourceIds locationId teacherId -> LessonResourceIds teacherId+fromStudentView studentClass	= mkLessonResourceIds studentClass . StudentView.LessonResourceIds.getTeacherId++-- | Convert from the /location/-view to a /student/-view.+toStudentView :: locationId -> LessonResourceIds teacherId -> StudentView.LessonResourceIds.LessonResourceIds locationId teacherId+toStudentView locationId resourceIds	= StudentView.LessonResourceIds.MkLessonResourceIds {+	StudentView.LessonResourceIds.getLocationId	= locationId,+	StudentView.LessonResourceIds.getTeacherId	= getTeacherId resourceIds+}+
+ src-lib/WeekDaze/LocationView/Timetable.hs view
@@ -0,0 +1,277 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the personal /timetable/ for any week, for each /location/.++	* It contains identical information to 'StudentView.Timetable.Timetable',+	but the data has been re-indexed to present it in a form relevant to a /location/ rather than a /student/.+-}++module WeekDaze.LocationView.Timetable(+-- * Types+-- ** Type-synonyms+	Timetable,+--	Booking,+-- * Functions+-- ** Mutators+--	bookStudentViewLesson,+--	bookLocationViewLesson,+-- ** Translation+	fromStudentViewTimetable,+	toStudentViewTimetable,+	toXHtml+) where++import			Data.Map((!))+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	WeekDaze.Aggregate.LocationCatalogue	as Aggregate.LocationCatalogue+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.Location			as Data.Location+import qualified	WeekDaze.LocationView.Lesson		as LocationView.Lesson+import qualified	WeekDaze.LocationView.LessonResourceIds	as LocationView.LessonResourceIds+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.Meeting			as Model.Meeting+import qualified	WeekDaze.Model.Timetable		as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek		as Model.TimetableForWeek+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable		as StudentView.Timetable+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import qualified	WeekDaze.Text.CSS			as Text.CSS+import			Text.XHtml.Strict((+++), (<<))+import			WeekDaze.Text.XHTML()++-- | An association-list of the timetables for all /locations/.+type Timetable locationId timeslotId teacherId level	= Model.Timetable.Timetable locationId timeslotId (LocationView.LessonResourceIds.LessonResourceIds teacherId) level++{- |+	* Build a 'Timetable' by inverting a 'StudentView.Timetable.Timetable'.++	* CAVEAT: in the original 'StudentView.Timetable.Timetable', different /student-bodies/ may simultaneously reference a single /location/.+	This is normal behaviour, provided the /location/ has sufficient capacity,+	& is implemented seemlessly, as a /map/-structure with one or more /key/s referencing a /value/, containing the same /location/.++	* When inverting such a /timetable/, this many-to-one relationship becomes a one-to-many, & a single /location-id/ must now reference many /student-bodies/.+	The /map/-structure (cf. /multi-map/), can't directly accommodate multiple identical keys, with different values,+	so this is achieved by merging the /student-bodies/ into a class of /student/s.+-}+fromStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			teacherId,+	Ord			locationId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> Bool							-- ^ Permit a temporary /student-body/ merger.+	-> Timetable locationId timeslotId teacherId level	-- ^ An unallocated /timetable/, supplied for efficiency.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Timetable locationId timeslotId teacherId level+fromStudentViewTimetable permitTemporaryStudentBodyMerger	= Data.Map.foldrWithKey (+	\studentBody studentViewTimetableForWeek locationViewTimetable	-> snd {-timetable-} $ Data.Foldable.foldr (+		\studentViewTimetableForDay (day, locationViewTimetable')	-> (+			pred day,	-- Because of the use of 'foldr'.+			snd {-timetable-} $ Data.Foldable.foldr (+				\maybeStudentViewLesson (timeslotId, locationViewTimetable'')	-> (+					pred timeslotId,	-- Because of the use of 'foldr'.+					Data.Maybe.maybe locationViewTimetable'' (+						($ locationViewTimetable'') . bookStudentViewLesson permitTemporaryStudentBodyMerger {-partially apply-} . (,) (+							studentBody,+							Temporal.Time.mkTime day timeslotId+						) {-construct a booking-}+					) maybeStudentViewLesson+				)+			) (+				snd {-maximum timeslotId-} $ Data.Array.IArray.bounds studentViewTimetableForDay,+				locationViewTimetable'+			) studentViewTimetableForDay+		)+	) (+		snd {-maximum day-} $ Data.Array.IArray.bounds studentViewTimetableForWeek,+		locationViewTimetable+	) studentViewTimetableForWeek+ )++{- |+	* Build a 'StudentView.Timetable.Timetable', by inverting a 'Timetable'.++	* Each /lesson/ in the /timetable/ seen from the /location/'s perspective, contains a /student-class/.+	This /student-class/ must be broken into /student-bodies/, before inserting repeatedly into the required /timetable/ as seen from the /student-body/'s perpective.+-}+toStudentViewTimetable+	:: (Data.Array.IArray.Ix timeslotId, Enum timeslotId)+	=> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ An unallocated /timetable/, supplied for efficiency.+	-> Timetable locationId timeslotId teacherId level+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+toStudentViewTimetable	= Data.Map.foldrWithKey (+	\locationId locationViewTimetableForWeek studentViewTimetable	-> snd {-timetable-} $ Data.Foldable.foldr (+		\locationViewTimetableForDay (day, studentViewTimetable')	-> (+			pred day,	-- Because of the use of 'foldr'.+			snd {-timetable-} $ Data.Foldable.foldr (+				\maybeLocationViewLesson (timeslotId, studentViewTimetable'')	-> (+					pred timeslotId,	-- Because of the use of 'foldr'.+					Data.Maybe.maybe studentViewTimetable'' (+						($ studentViewTimetable'') . bookLocationViewLesson {-partially apply-} . (,) (+							locationId,+							Temporal.Time.mkTime day timeslotId+						) {-construct a booking-}+					) maybeLocationViewLesson+				)+			) (+				snd {-maximum timeslotId-} $ Data.Array.IArray.bounds locationViewTimetableForDay,+				studentViewTimetable'+			) locationViewTimetableForDay+		)+	) (+		snd {-maximum day-} $ Data.Array.IArray.bounds locationViewTimetableForWeek,+		studentViewTimetable+	) locationViewTimetableForWeek+ )++-- | Make a 'StudentView.Timetable.Booking' in a /LocationView-timetable/.+bookStudentViewLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Eq			teacherId,+	Ord			locationId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> Bool									-- ^ Permit a temporary /student-body/ merger.+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level	-- ^ The /coordinates/ & /lesson/ from the perspective of the /student/-view of the /timetable/.+	-> Timetable locationId timeslotId teacherId level			-- ^ The /timetable/ as seen from the /location/'s perspective.+	-> Timetable locationId timeslotId teacherId level+bookStudentViewLesson permitTemporaryStudentBodyMerger ((studentBody, time), studentViewLesson) locationViewTimetable	= Model.Timetable.defineTimeslot (+	locationViewTimetableCoordinates,+	Just studentViewLesson {+		Model.Lesson.getResourceIds	= LocationView.LessonResourceIds.mkLessonResourceIds (+			Data.Set.insert studentBody $ case Model.Timetable.getMaybeLesson locationViewTimetableCoordinates locationViewTimetable of+				Nothing	-> Data.Set.empty	-- Start a new student-class.+				Just locationViewLesson+					| and [+						permitTemporaryStudentBodyMerger,+						LocationView.LessonResourceIds.getTeacherId locationViewResourceIds == teacherId,+						Model.Lesson.getSubject locationViewLesson == Model.Lesson.getSubject studentViewLesson+					]		-> LocationView.LessonResourceIds.getStudentClass locationViewResourceIds+					| otherwise	-> error $ "WeekDaze.LocationView.Timetable.bookStudentViewLesson:\tlesson at coordinates=" ++ show locationViewTimetableCoordinates ++ " has already been booked in either a different subject or location; " ++ show (locationViewLesson, studentViewLesson) ++ "."+					where+						locationViewResourceIds	= Model.Lesson.getResourceIds locationViewLesson+		 ) teacherId+	} -- Mutate.+ ) locationViewTimetable where+	studentViewResourceIds			= Model.Lesson.getResourceIds studentViewLesson+	teacherId				= StudentView.LessonResourceIds.getTeacherId studentViewResourceIds+	locationViewTimetableCoordinates	= (StudentView.LessonResourceIds.getLocationId studentViewResourceIds, time)++-- | A /lesson/ qualified by the /coordinates/ at which it is booked.+type Booking locationId timeslotId teacherId level	= Model.Timetable.Booking locationId timeslotId (LocationView.LessonResourceIds.LessonResourceIds teacherId) level++-- | Books a /LocationView-lesson/ in a /StudentView-timetable/.+bookLocationViewLesson+	:: Data.Array.IArray.Ix timeslotId+	=> Booking locationId timeslotId teacherId level				-- ^ The /coordinates/ & /lesson/ from the perspective of the /location/-view of the /timetable/.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The /timetable/ as seen from the /student/'s perspective.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+bookLocationViewLesson ((locationId, time), locationViewLesson) studentViewTimetable	= Data.Set.foldr (+	Model.Timetable.defineTimeslot . flip (,) (+		Just $ LocationView.Lesson.toStudentView locationId locationViewLesson+	) . flip (,) time+ ) studentViewTimetable $ LocationView.LessonResourceIds.getStudentClass locationViewResourceIds where+	locationViewResourceIds	= Model.Lesson.getResourceIds locationViewLesson++-- | Render in /XHTML/, as a /definition-list/.+toXHtml :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	Show			level,+	Show			teacherId,+	Text.XHtml.Strict.HTML	campus,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> (locationId -> LocationView.Lesson.Lesson teacherId level -> Data.Course.Course synchronisationId level timeslotId)	-- ^ Find the /course/ to which the specified /lesson/ belongs.+	-> Aggregate.LocationCatalogue.LocationCatalogue locationId campus+	-> Model.Timetable.GenericTimetableToMarkup locationId minimumContrastRatio teacherId timeslotId (Timetable locationId timeslotId teacherId level)+toXHtml findCourseForLocationViewLesson locationCatalogue displaySupplementaryInformation meetingsByTime htmlMergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom	= Text.XHtml.Strict.defList . map (+	\(locationId, timetableForWeek)	-> let+		locationProfile			= locationCatalogue ! locationId+		nUnallocatedAvailableTimeslots	= Model.TimetableForWeek.countUnallocatedAvailableTimeslots locationProfile timetableForWeek+	in (+		Text.XHtml.Strict.unordList (+			(+				Data.Location.getCampus locationProfile +++ ' ' +++ locationId+			) : if displaySupplementaryInformation+				then Data.Maybe.catMaybes [+					Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+						Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+						Text.XHtml.Strict.title "The total capacity to accommodate students at this location."+					] << (+						"Capacity" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+						] << Data.Location.getCapacity (locationCatalogue ! locationId)+					),+					if nUnallocatedAvailableTimeslots == 0+						then Nothing+						else Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+							Text.XHtml.Strict.title "Available but unallocated time-slots, at this location."+						] << (+							"Unallocated time-slots" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << nUnallocatedAvailableTimeslots+						),+					let+						facilityNames	= Data.Location.getFacilityNames locationProfile+					in if Data.Set.null facilityNames+						then Nothing+						else Just $ Text.XHtml.Strict.unordList (map show $ Data.Set.toList facilityNames) Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+							Text.XHtml.Strict.title "Facilities available at this location."+						]+				]+				else []+		) Text.XHtml.Strict.! [Text.XHtml.Strict.theclass Text.CSS.observerSummaryCSSIdentifier],	-- CAVEAT: xhtml only permits inline elements to be nested inside a 'dt' element, & 'ul' is a block element.+		Model.TimetableForWeek.toXHtml (+			findCourseForLocationViewLesson locationId	-- Partially apply.+		) locationProfile (+			Model.Meeting.deleteLocationId locationId meetingsByTime+		) htmlMergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom timetableForWeek+	)+ ) . Data.Map.toList+
+ src-lib/WeekDaze/Model/GeneralisedBooking.hs view
@@ -0,0 +1,47 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	The specification for a potential booking, of either a /lesson/ or nothing, at a /time/, in a /timetable/.+-}++module WeekDaze.Model.GeneralisedBooking(+-- * Types+-- ** Type-synonyms+	GeneralisedBooking,+-- * Functions+-- ** Accessors+	getCoordinates,+	getMaybeLesson+) where++import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.TimetableCoordinates	as Model.TimetableCoordinates++-- | The details of a booking, of either a /lesson/ or nothing, at a /coordinate/, in the /timetable/ for an /observer/.+type GeneralisedBooking observerId timeslotId resourceIds level	= (Model.TimetableCoordinates.Coordinates observerId timeslotId, Maybe (Model.Lesson.Lesson resourceIds level))++-- | Accessor.+getCoordinates :: GeneralisedBooking observerId timeslotId resourceIds level -> Model.TimetableCoordinates.Coordinates observerId timeslotId+getCoordinates	= fst++-- | Accessor.+getMaybeLesson :: GeneralisedBooking observerId timeslotId resourceIds level -> Maybe (Model.Lesson.Lesson resourceIds level)+getMaybeLesson	= snd
+ src-lib/WeekDaze/Model/GenerateLessonColourFrom.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Used to specify the source of the data, used to automatically generate the colour of a /lesson/.+-}++module WeekDaze.Model.GenerateLessonColourFrom(+-- * Types+-- ** Data-types+	GenerateLessonColourFrom(..),+-- * Constants+	tag+) where++import qualified	Control.DeepSeq+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue GenerateLessonColourFrom {-multi-parameter type-class-} where+	safeConvert	= fmap read . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify SQL & XML.+tag :: String+tag	= "generateLessonColourFrom"++-- | The source of the string to hash, when generating the colour of a /lesson/ in the timetable.+data GenerateLessonColourFrom+	= Lesson+	| Subject+	| Topic+	| Level+	| ResourceIds+	deriving (Bounded, Enum, Eq, Read, Show)++instance HXT.XmlPickler GenerateLessonColourFrom where+--	xpickle	= HXT.xpPrim+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show [minBound :: GenerateLessonColourFrom .. maxBound]++instance Control.DeepSeq.NFData GenerateLessonColourFrom where+	rnf _	= ()
+ src-lib/WeekDaze/Model/Lesson.hs view
@@ -0,0 +1,86 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a lesson, suitable for any /time-slot/ in the generic /timetable/.+-}++module WeekDaze.Model.Lesson(+-- * Types+-- ** Type-synonyms+	GeneralisedLesson,+-- ** Data-types+	Lesson(..)+-- * Constants+--	resourceIdsCSSIdentifier,+--	tag+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Data.Subject		as Data.Subject+import qualified	WeekDaze.Text.CSS		as Text.CSS+import			Text.XHtml.Strict((+++), (<<), (!))++-- | Used to qualify output.+resourceIdsCSSIdentifier :: Text.CSS.CSSIdentifier+resourceIdsCSSIdentifier	= "resourceIds"	-- CAVEAT: coordinate with 'Data.Meeting.resourceIdsCSSIdentifier'.++-- | Used to qualify CSS & XML.+tag :: String+tag	= "lesson"++{- |+	* Defines a potential /booking/ of the /resource/s required to teach a /subject/.++	* It doesn't specify the /time-slot/ at which it's to be booked, because that's defined by it's position within a /timetable/.++	* A /timetable/ composed from these /lesson/s, can be viewed by either a /location/, /student/ or /teacher/, so 'getResourceIds' is polymorphic.+-}+data Lesson resourceIds level	= MkLesson {+	getResourceIds	:: resourceIds,			-- ^ The concrete type depends on whether viewed from the perspective of the /location/, /student/ or /teacher/.+	getSubject	:: Data.Subject.Subject level	-- ^ The /subject/ to be taught.+} deriving (Eq, Ord, Show)++instance (Text.XHtml.Strict.HTML level, Text.XHtml.Strict.HTML resourceIds) => Text.XHtml.Strict.HTML (Lesson resourceIds level) where+	toHtml lesson	= Text.XHtml.Strict.thediv ! [+		Text.XHtml.Strict.theclass tag,+		Text.XHtml.Strict.title tag+	 ] << (+		getSubject lesson +++ '.' +++ Text.XHtml.Strict.ulist ! [+			Text.XHtml.Strict.theclass resourceIdsCSSIdentifier,+			Text.XHtml.Strict.title resourceIdsCSSIdentifier+		] << getResourceIds lesson+	 )++instance (HXT.XmlPickler level, HXT.XmlPickler resourceIds, Show level) => HXT.XmlPickler (Lesson resourceIds level) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry MkLesson,		-- Construct from a Pair.+		getResourceIds &&& getSubject	-- Deconstruct to a Pair.+	 ) $ HXT.xpickle `HXT.xpPair` HXT.xpickle++instance (Control.DeepSeq.NFData level, Control.DeepSeq.NFData resourceIds) => Control.DeepSeq.NFData (Lesson resourceIds level) where+	rnf	= Control.DeepSeq.rnf . (getResourceIds &&& getSubject)++-- | A potentially undefined /lesson/.+type GeneralisedLesson resourceIds level	= Maybe (Lesson resourceIds level)+
+ src-lib/WeekDaze/Model/Meeting.hs view
@@ -0,0 +1,205 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a meeting of a /group/, suitable for any /time-slot/ in the generic /timetable/.++-}++module WeekDaze.Model.Meeting(+-- * Types+-- ** Type-synonyms+	MeetingsByTime,+--	MeetingsByTimeMutator,+-- ** Data-types+	Meeting(+--		MkMeeting,+		getMaybeLocationId,+		getStudentClass,+		getTeacherIds,+		getGroupId+	),+-- * Constants+--	cssIdentifier,+--	resourceIdsCSSIdentifier,+-- * Functions+	deleteLocationId,+	deleteStudentBody,+	deleteTeacherId,+-- ** Constructor+	mkMeeting+) where++import			Control.Arrow((&&&))+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Aggregate.StudentBody	as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentClass	as Aggregate.StudentClass+import qualified	WeekDaze.Data.Group		as Data.Group+import qualified	WeekDaze.Data.HumanResource	as Data.HumanResource+import qualified	WeekDaze.Temporal.Time		as Temporal.Time+import qualified	WeekDaze.Text.CSS		as Text.CSS+import			Text.XHtml.Strict((+++), (<<), (!))++-- | Used to qualify output.+cssIdentifier :: Text.CSS.CSSIdentifier+cssIdentifier			= "meeting"++-- | Used to qualify output.+resourceIdsCSSIdentifier :: Text.CSS.CSSIdentifier+resourceIdsCSSIdentifier	= "resourceIds"	-- CAVEAT: coordinate with 'Model.Lesson.resourceIdsCSSIdentifier'.++{- |+	* Defines a potential /booking/ of the /resource/s required for a /group/ to meet.++	* It doesn't directly specify the /time-slot/ at which it's to be booked, because that's defined by it's position within a /timetable/.+-}+data Meeting locationId teacherId = MkMeeting {+	getGroupId		:: Data.Group.Id,			-- ^ The name of the /group/ which is meeting.+	getMaybeLocationId	:: Maybe locationId,			-- ^ The optional /location/ at which the meeting will be held. Whilst this could be found by looking-up the /group/, containing it permits implementation of 'Text.XHtml.Strict.HTML'.+	getStudentClass		:: Aggregate.StudentClass.StudentClass,	-- ^ The /student-bodies/ that will be attending.+	getTeacherIds		:: Data.Set.Set teacherId		-- ^ The /teacher/s who will be attending.+} deriving (Eq, Ord, Show)++instance (+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	teacherId+ ) => Text.XHtml.Strict.HTML (Meeting locationId teacherId) where+	toHtml MkMeeting {+		getGroupId		= groupId,+		getMaybeLocationId	= maybeLocationId,+		getStudentClass		= studentClass,+		getTeacherIds		= teacherIds+	} = Text.XHtml.Strict.thediv ! [+		Text.XHtml.Strict.theclass cssIdentifier,+		Text.XHtml.Strict.title cssIdentifier+	 ] << (+		Text.XHtml.Strict.thediv ! [+			Text.XHtml.Strict.theclass Data.Group.groupIdTag,+			Text.XHtml.Strict.title Data.Group.groupIdTag+		] << (groupId +++ '.') +++ Text.XHtml.Strict.unordList (+			Data.Maybe.catMaybes [+				fmap terminate maybeLocationId,+				if Data.Set.null studentClass+					then Nothing+					else Just . terminate . Data.List.intersperse separator . map Text.XHtml.Strict.toHtml $ Data.Set.toList studentClass,+				if Data.Set.null teacherIds+					then Nothing+					else Just . terminate . Data.List.intersperse separator . map Text.XHtml.Strict.toHtml $ Data.Set.toList teacherIds+			]+		) ! [+			Text.XHtml.Strict.theclass resourceIdsCSSIdentifier,+			Text.XHtml.Strict.title resourceIdsCSSIdentifier+		]+	 ) where+		separator	= Text.XHtml.Strict.toHtml ", "	-- There may be many list-elements, so don't use a non-breaking space.++		terminate :: Text.XHtml.Strict.HTML html => html -> Text.XHtml.Strict.Html+		terminate	= (+++ '.')++instance (Show locationId, Show teacherId) => ToolShed.SelfValidate.SelfValidator (Meeting locationId teacherId) where+	getErrors meeting	= ToolShed.SelfValidate.extractErrors [+		(+			uncurry (&&) $ (Data.Set.null . getStudentClass &&& Data.Set.null . getTeacherIds) meeting,	-- CAVEAT: arguably two is the minimum.+			"a meeting can't have an empty " ++ show Data.HumanResource.groupMembershipTag ++ "; " ++ show meeting+		) -- Pair.+	 ]++-- | Smart constructor.+mkMeeting+	:: (Show locationId, Show teacherId)+	=> Data.Group.Id			-- ^ The identifier of the /group/ which it meeting.+	-> Maybe locationId			-- ^ The optional /location/ of the rendezvous.+	-> Aggregate.StudentClass.StudentClass	-- ^ The potentially empty set of /student/-members of the /group/.+	-> Data.Set.Set teacherId		-- ^ The potentially empty set of /teacher/-members of the /group/.+	-> Meeting locationId teacherId+mkMeeting groupId maybeLocationId studentClass teacherIds+	| ToolShed.SelfValidate.isValid meeting	= meeting+	| otherwise				= error $ "WeekDaze.Model.Meeting.mkMeeting:\t" ++ ToolShed.SelfValidate.getFirstError meeting ++ "."+	where+		meeting	= MkMeeting groupId maybeLocationId studentClass teacherIds++-- | A map indexed by /time/, of sets of /meeting/s.+type MeetingsByTime timeslotId locationId teacherId	= Data.Map.Map (Temporal.Time.Time timeslotId) (Data.Set.Set (Meeting locationId teacherId))++-- | A function used to mutate a 'MeetingsByTime'.+type MeetingsByTimeMutator timeslotId locationId teacherId	= MeetingsByTime timeslotId locationId teacherId -> MeetingsByTime timeslotId locationId teacherId++-- | Delete the specified /location-Id/ from all specified meetings.+deleteLocationId :: (+	Ord	locationId,+	Ord	teacherId+ ) => locationId -> MeetingsByTimeMutator timeslotId locationId teacherId+deleteLocationId locationId	= Data.Map.map (+	Data.Set.map (+		\meeting -> meeting {+			getMaybeLocationId	= Nothing	-- Remove the locationId.+		}+	)+ ) . Data.Map.filter (+	not . Data.Set.null	-- Leave only times at which there's a relevant meeting.+ ) . Data.Map.map (+	Data.Set.filter (+		(== Just locationId) . getMaybeLocationId	-- Leave only meetings relevant to this location.+	)+ )++-- | Delete the specified /student-body/ from the members of all specified meetings.+deleteStudentBody :: (+	Ord	locationId,+	Ord	teacherId+ ) => Aggregate.StudentBody.StudentBody -> MeetingsByTimeMutator timeslotId locationId teacherId+deleteStudentBody studentBody	= Data.Map.map (+	Data.Set.map (+		\meeting -> meeting {+			getStudentClass	= Data.Set.delete studentBody $ getStudentClass meeting+		}+	)+ ) . Data.Map.filter (+	not . Data.Set.null	-- Leave only times at which there's a relevant meeting.+ ) . Data.Map.map (+	Data.Set.filter (+		Data.Set.member studentBody . getStudentClass	-- Leave only meetings relevant to this student.+	)+ )++-- | Delete the specified /teacher-Id/ from the members of all specified meetings.+deleteTeacherId :: (+	Ord	locationId,+	Ord	teacherId+ ) => teacherId -> MeetingsByTimeMutator timeslotId locationId teacherId+deleteTeacherId teacherId	= Data.Map.map (+	Data.Set.map (+		\meeting -> meeting {+			getTeacherIds	= Data.Set.delete teacherId $ getTeacherIds meeting+		}+	)+ ) . Data.Map.filter (+	not . Data.Set.null	-- Leave only times at which there's a relevant meeting.+ ) . Data.Map.map (+	Data.Set.filter (+		Data.Set.member teacherId . getTeacherIds	-- Leave only meetings relevant to this teacher.+	)+ )+
+ src-lib/WeekDaze/Model/ResourceUser.hs view
@@ -0,0 +1,86 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Describes the interface to an abstract user of /resource/s.++-}++module WeekDaze.Model.ResourceUser(+-- * Type-classes+	ResourceUser(..),+-- * Functions+-- ** Predicates+	areMergeableWith,+	areMutuallyMergeable+) where++import			Control.Arrow((&&&))+import qualified	Data.Foldable+import qualified	Data.Set+import qualified	WeekDaze.Model.Lesson	as Model.Lesson++-- | An interface to which users of /resource/s can conform.+class ResourceUser resourceUser where+	areIndependent	:: resourceUser -> resourceUser -> Bool	-- ^ Whether the /resource/s used by the first instance, are independent of those used by the second.++instance Ord resource => ResourceUser (Data.Set.Set resource) where+	areIndependent s	= Data.Set.null . Data.Set.intersection s	-- To support student-classes.++{- |+	* Check whether the specified /lesson/ is compatible with the incumbent collection of synchronous /lesson/s.++	* Each of the incumbent /lesson/s must either be identical to the proposed /lesson/, or use completely different /resource/s.++	* This property allows the specified /lesson/ to be booked into a /timetable/ at the same /time/.++	* CAVEAT: performance-hotspot.+-}+areMergeableWith :: (+	Data.Foldable.Foldable	foldable,+	Eq			resourceIds,+	Eq			level,+	ResourceUser		resourceIds+ )+	=> Model.Lesson.Lesson resourceIds level		-- ^ The proposed /lesson/.+	-> foldable (Model.Lesson.Lesson resourceIds level)	-- ^ The /lesson/s already booked in the /timetable/, at the proposed /time/.+	-> Bool+areMergeableWith lesson	= Data.Foldable.all (+	uncurry (||) . (+		(== lesson) &&& areIndependent (Model.Lesson.getResourceIds lesson) . Model.Lesson.getResourceIds+	)+ )++{- |+	* 'True' if all the listed /lesson/s are identical, or none of their /resource-Id/s are common.++	* This property allows them to co-exist, when booked into the weekly /timetable/s of distinct /observer/s, but at the same /time/.++	* CAVEAT: is pretty inefficient; all we're really want to do is 'nub' the list of /lesson/s, then check that neither of the two /resource/s per /lesson/, is used more than once,+	it's just that we can't access the two /resource/s, because they're behind the class-interface.+-}+areMutuallyMergeable :: (+	Eq		resourceIds,+	Eq		level,+	ResourceUser	resourceIds+ ) => [Model.Lesson.Lesson resourceIds level] -> Bool+areMutuallyMergeable []		= True+areMutuallyMergeable (x : xs)	= areMergeableWith x xs && areMutuallyMergeable xs {-recurse-}+
+ src-lib/WeekDaze/Model/Timetable.hs view
@@ -0,0 +1,512 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Describes a 'Data.Map.Map' of 'Model.TimetableForWeek'.++	* This is the shape of a generic /timetable/, from which specific instances;+	indexed by either /student-bodies/, /teacher/-ids or /location/-ids; can be built.++	* It doesn't reference the parameters of the specific problem, or the means by which a solution is obtained.+-}++module WeekDaze.Model.Timetable(+-- * Types+-- ** Type-synonyms+	Timetable,+	AugmentMarkup,+	GenericTimetableToMarkup,+	Booking,+	Wrapper(+		MkWrapper,+		deconstruct+	),+-- * Constants+	tag,+--	observerIdTag,+--	observerIdToTimetableAssociationTag,+-- * Functions+	calculateAverageAbsoluteDeviationOfFreeLessonsPerDay,+	calculateUtilisationRatioByObserverId,+--	locateUnallocatedAvailableCoordinates,+	locateUnallocatedAvailableUnreservedCoordinates,+	findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId,+	findGeneralisedLessonRunlengthsByCoordinates,+	findSeparatedEqualLessonsWithinAnyDayByObserverId,+	findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId,+	countLessons,+	countUnallocatedAvailableTimeslots,+	extractLessons,+	extractCoordinates,+	extractDistinctLessons,+	extractSynchronousLessonsAt,+	calculateMeanFreePeriodCompliance,+-- ** Constructor+	mkFreeTimetable,+-- ** Accessors+	getMaybeLesson,+	getBookedCoordinates,+	getBookedLesson,+-- ** Mutators+	defineTimeslot,+	undefineTimeslot,+	undefineTimeslots,+	undefineTimeslotsFor,+	purge,+-- ** Predicates+	isDefinedTimeslot,+	areMergeableWith,+	hasMatchingLessonAt,+	isBookedWith,+-- ** Translation+	toGeneralisedBooking+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Factory.Data.Interval+import qualified	Factory.Math.Statistics+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	WeekDaze.Data.HumanResource		as Data.HumanResource+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Model.GeneralisedBooking	as Model.GeneralisedBooking+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.ResourceUser		as Model.ResourceUser+import qualified	WeekDaze.Model.TimetableCoordinates	as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForDay		as Model.TimetableForDay+import qualified	WeekDaze.Model.TimetableForWeek		as Model.TimetableForWeek+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.Temporal.Time			as Temporal.Time++-- | Used to qualify XML.+tag :: String+tag					= "timetable"++-- | Used to qualify XML.+observerIdTag :: String+observerIdTag				= "observerId"++-- | Used to qualify XML.+observerIdToTimetableAssociationTag :: String+observerIdToTimetableAssociationTag	= "observerIdToTimetableAssociation"++{- |+	* A map of weekly timetables, indexed by the /observer-Id/ for whom it is intended.++	* One can visualise this as a /3-D/ structure, indexed by /observer-Id/, /day/, & /timeslot-Id/, optionally defining a /lesson/ at each coordinate.++	* The type of the /observer-Id/ & of the /resource-Id/s referenced in each /lesson/,+	depend on the perspective from which the polymorphic /timetable/ was designed to be viewed:+	if viewed by a /student/, then the /observer-Id/ is a /student-body/, & the /resource-Ids/ are /location-Id/ & /teacher-Id/;+	if viewed by a /teacher/, then the /observer-Id/ is a /teacher-Id/, & the /resource-Ids/ are /location-Id/ & /student-body/;+	if viewed by a /location/, then the /observer-Id/ is a /location-Id/, & the /resource-Ids/ are /student-body/ & /teacher-Id/.+-}+type Timetable observerId timeslotId resourceIds level	= Data.Map.Map observerId (Model.TimetableForWeek.TimetableForWeek timeslotId resourceIds level)++-- | Whether to augment the marked-up output with supplementary information.+type AugmentMarkup	= Bool++-- | For use when converting any /timetable/-view to XHTML.+type GenericTimetableToMarkup locationId minimumContrastRatio teacherId timeslotId timetable	= AugmentMarkup -> Model.TimetableForWeek.GenericTimetableToMarkup' locationId minimumContrastRatio teacherId timeslotId timetable++{- |+	* Constructor.++	* Creates an unallocated weekly /timetable/,+	for each of the specified list of generic /observer-Id/s; i.e. /location/s, /student-bodies/ or /teacher-ids/.++	* Each daily /timetable/ has the specified list of /timeslots-Id/s, into which a /lesson/ can be booked.+-}+mkFreeTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			observerId+ )+	=> [observerId]+	-> Factory.Data.Interval.Interval timeslotId+	-> Timetable observerId timeslotId resourceIds level+mkFreeTimetable observerIds	= Data.Map.fromList . zip observerIds . repeat . Model.TimetableForWeek.mkFreeTimetableForWeek++-- | Get any /lesson/ booked at the specified /coordinates/.+getMaybeLesson+	:: (Data.Array.IArray.Ix timeslotId, Ord observerId)+	=> Model.TimetableCoordinates.Coordinates observerId timeslotId+	-> Timetable observerId timeslotId resourceIds level+	-> Model.Lesson.GeneralisedLesson resourceIds level+getMaybeLesson (observerId, time)	= Model.TimetableForWeek.getMaybeLesson time . (! observerId)++-- | True if a /booking/ has been made at the specified /coordinates/ in the /timetable/.+isDefinedTimeslot+	:: (Data.Array.IArray.Ix timeslotId, Ord observerId)+	=> Model.TimetableCoordinates.Coordinates observerId timeslotId+	-> Timetable observerId timeslotId resourceIds level+	-> Bool+isDefinedTimeslot coordinates	= Data.Maybe.isJust . getMaybeLesson coordinates++{- |+	* Extracts a /core/ of synchronous events, by drilling through the /timetable/ for all /observer-Id/s, at the specified /time/.++	* The /observer-id/s are discarded, rendering the results anonymous.++	* CAVEAT: performance-hotspot.+-}+extractSynchronousLessonsAt+	:: Data.Array.IArray.Ix timeslotId+	=> Temporal.Time.Time timeslotId+	-> Timetable observerId timeslotId resourceIds level+	-> [Model.Lesson.Lesson resourceIds level]+-- extractSynchronousLessonsAt time	= Data.Maybe.mapMaybe (Model.TimetableForWeek.getMaybeLesson time) . Data.Map.elems	-- CAVEAT: too slow.+-- extractSynchronousLessonsAt time	= Data.Foldable.concatMap (Data.Maybe.maybeToList . Model.TimetableForWeek.getMaybeLesson time)	-- CAVEAT: too slow.+extractSynchronousLessonsAt time	= Data.Map.foldr (Data.Maybe.maybe id (:) . Model.TimetableForWeek.getMaybeLesson time) [] {-initial value-}++-- | Extracts the /lesson/s from the specified /timetable/, by discarding the /coordinates/ at which each was booked.+extractLessons :: Data.Array.IArray.Ix timeslotId => Timetable observerId timeslotId resourceIds level -> [Model.Lesson.Lesson resourceIds level]+extractLessons	= Data.Foldable.concatMap Model.TimetableForWeek.extractLessons	-- Implementation by list-comprehension is no faster.++-- | Extract the list of all /coordinates/ in the specified /timetable/.+extractCoordinates :: Data.Array.IArray.Ix timeslotId => Timetable observerId timeslotId resourceIds level -> [Model.TimetableCoordinates.Coordinates observerId timeslotId]+extractCoordinates timetable	= [+	(observerId, time) |+		(observerId, timetableForWeek)	<- Data.Map.toList timetable,+		time				<- Model.TimetableForWeek.extractTimes timetableForWeek	-- In practice, these are consistent across all observer-Ids.+ ] -- List-comprehension.++-- | Extracts the set of distinct /lesson/s from the specified /timetable/.+extractDistinctLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			resourceIds,+	Ord			level+ ) => Timetable observerId timeslotId resourceIds level -> Data.Set.Set (Model.Lesson.Lesson resourceIds level)+extractDistinctLessons	= Data.Set.fromList . extractLessons++-- | Overwrites any /lesson/ defined at the specified /coordinates/.+defineTimeslot+	:: (Data.Array.IArray.Ix timeslotId, Ord observerId)+	=> Model.GeneralisedBooking.GeneralisedBooking observerId timeslotId resourceIds level+	-> Timetable observerId timeslotId resourceIds level+	-> Timetable observerId timeslotId resourceIds level+defineTimeslot ((observerId, time), maybeLesson) timetable	= Data.Map.insert observerId (Model.TimetableForWeek.defineTimeslot (time, maybeLesson) $ timetable ! observerId) timetable++-- | Undefine the /lesson/, at the specified /coordinates/.+undefineTimeslot+	:: (Data.Array.IArray.Ix timeslotId, Ord observerId)+	=> Model.TimetableCoordinates.Coordinates observerId timeslotId+	-> Timetable observerId timeslotId resourceIds level+	-> Timetable observerId timeslotId resourceIds level+undefineTimeslot coordinates	= defineTimeslot (coordinates, Nothing)++{- |+	* Undefines each /lesson/, at the specified list of /coordinates/.++	* CAVEAT: if all the /coordinates/ have the same /observerId/, then 'undefineTimeslotsFor' should be more efficient.+-}+undefineTimeslots :: (+	Data.Array.IArray.Ix		timeslotId,+	Data.Foldable.Foldable		foldable,+	Ord				observerId+ )+	=> Timetable observerId timeslotId resourceIds level+	-> foldable (Model.TimetableCoordinates.Coordinates observerId timeslotId)	-- ^ The /coordinates/ to undefine.+	-> Timetable observerId timeslotId resourceIds level+undefineTimeslots	= Data.Foldable.foldr $ defineTimeslot . flip (,) Nothing++-- | Undefines each /lesson/, at the specified list of /time/s, within the /timetableForWeek/ for the specified /observerId/.+undefineTimeslotsFor :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Foldable.Foldable	foldable,+	Ord			observerId+ )+	=> observerId					-- ^ Identifies the single observer, in whose /timetableForWeek/ all unwanted /lesson/s exist.+	-> Timetable observerId timeslotId resourceIds level+	-> foldable (Temporal.Time.Time timeslotId)	-- ^ The /time/s of /lesson/s to undefine.+	-> Timetable observerId timeslotId resourceIds level+undefineTimeslotsFor observerId timetable	= ($ timetable) . Data.Map.insert observerId {-overwrite original-} . Model.TimetableForWeek.undefineTimeslots (timetable ! observerId)++-- | Undefine the whole /timetable/.+purge :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			observerId+ ) => Timetable observerId timeslotId resourceIds level -> Timetable observerId timeslotId resourceIds level+purge timetable+	| Data.Map.null timetable	= timetable+	| otherwise			= mkFreeTimetable (+		Data.Map.keys timetable	-- The observerIds.+	) . Data.Array.IArray.bounds {-timeslotIds-} . (+		Data.Array.IArray.! minBound	-- Arbitrarily use the first timetableForDay.+	) . snd {-timetableForWeek-} $ Data.Map.findMin timetable++-- | Finds runlengths of consecutive equal generalised (i.e. potentially undefined) /lesson/s, & the run-length of each sequence, indexed by /observerId/, /day/ & /timeslotId/.+findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ ) => Timetable observerId timeslotId resourceIds level -> Data.Map.Map observerId (Model.TimetableForWeek.GeneralisedLessonRunlengthByTimeslotIdByDay timeslotId resourceIds level)+findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId	= Data.Map.map Model.TimetableForWeek.findGeneralisedLessonRunlengthsByTimeslotIdByDay++-- | Calls 'findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId', & flattens the results.+findGeneralisedLessonRunlengthsByCoordinates :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ ) => Timetable observerId timeslotId resourceIds level -> [(Model.TimetableCoordinates.Coordinates observerId timeslotId, Model.TimetableForDay.GeneralisedLessonRunlength resourceIds level)]+findGeneralisedLessonRunlengthsByCoordinates timetable	= [+	((observerId, Temporal.Time.mkTime day startingTimeslotId), runlengthCode) |+		(observerId, generalisedLessonRunlengthsByTimeslotIdByDay)	<- Data.Map.toList $ findGeneralisedLessonRunlengthsByTimeslotIdByDayByObserverId timetable,+		(day, generalisedLessonRunlengthsByTimeslotId)			<- Data.Array.IArray.assocs generalisedLessonRunlengthsByTimeslotIdByDay,+		(startingTimeslotId, runlengthCode)				<- generalisedLessonRunlengthsByTimeslotId+ ] -- List-comprehension.++-- | Finds runlengths of separated equal /lesson/s, within the /timetable/ for any single /day/.+findSeparatedEqualLessonsWithinAnyDayByObserverId :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			resourceIds+ ) => Timetable observerId timeslotId resourceIds level -> Data.Map.Map observerId (Model.TimetableForDay.LessonRunlengths resourceIds level)+findSeparatedEqualLessonsWithinAnyDayByObserverId	= Data.Map.map Model.TimetableForWeek.findSeparatedEqualLessonsWithinAnyDay++{- |+	* Finds runlengths of separated equal /lesson/s, within the /timetable/ for any single /day/; separated unallocated /time-slot/s don't count.++	* Returns a map indexed by /observerId/, of arrays indexed by /day/, of lists associated by common /lesson/, of lists associated by starting /timeslotId/, of runlengths.+-}+findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			resourceIds+ ) => Timetable observerId timeslotId resourceIds level -> Data.Map.Map observerId (Model.TimetableForWeek.RunlengthsByTimeslotIdByLessonByDay resourceIds level timeslotId)+findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId	= Data.Map.map Model.TimetableForWeek.findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDay++-- | Counts the number of /lesson/s booked.+countLessons :: Data.Array.IArray.Ix timeslotId => Timetable observerId timeslotId resourceIds level -> Size.NTimeslots+countLessons	= length . extractLessons++{- |+	* Locates unallocated /coordinates/, omitting any /day/s on which the /observerId/ is un/available/.++	* CAVEAT: doesn't account for /coordinates/ reserved for /meeting/s.+-}+locateUnallocatedAvailableCoordinates :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Ord			observerId+ )+	=> Data.Resource.ResourceMap observerId resource	-- ^ The /resource/s, from which one can determine /availability/.+	-> Timetable observerId timeslotId resourceIds level+	-> Model.TimetableCoordinates.Vector observerId timeslotId+locateUnallocatedAvailableCoordinates resourceMap timetable	= [+	(observerId, unallocatedAvailableTime) |+		(observerId, timetableForWeek)	<- Data.Map.toList timetable,+		unallocatedAvailableTime	<- Model.TimetableForWeek.locateUnallocatedAvailableTimes (resourceMap ! observerId) timetableForWeek+ ] -- List-comprehension.++{- |+	Locates unallocated /coordinates/ in the specified /timetable/,+	omitting any /day/s on which the /observerId/ is un/available/, & any /coordinates/ reserved by the /observerId/ for a /meeting/.+-}+locateUnallocatedAvailableUnreservedCoordinates :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Ord			observerId+ )+	=> Data.Map.Map (Temporal.Time.Time timeslotId) (Data.Set.Set observerId)	-- ^ Those /observerId/s booked for a /meeting/, indexed by /time/.+	-> Data.Resource.ResourceMap observerId resource				-- ^ The /resource/s, from which one can determine /availability/.+	-> Timetable observerId timeslotId resourceIds level+	-> Model.TimetableCoordinates.Vector observerId timeslotId+locateUnallocatedAvailableUnreservedCoordinates observerIdsBookedForMeetingByTime resourceMap	= filter (+	uncurry (+		Data.Maybe.maybe True {-the time is unreserved by any observerId-}+	) . (+		Data.Set.notMember . Model.TimetableCoordinates.getObserverId &&& (`Data.Map.lookup` observerIdsBookedForMeetingByTime) . Model.TimetableCoordinates.getTime+	) -- Ensure that this observerId hasn't reserved the time for a meeting.+ ) . locateUnallocatedAvailableCoordinates resourceMap++{- |+	* Counts the total number of unallocated /time-slot/s, across all /observer/s in one week (i.e. the whle /timetable/); discounting those when the /observer/ is unavailable.++	* CAVEAT: this function takes no account of the possibility that when the /observer/ represents a /student-body/,+	some /time-slot/s may be allocated to unsupervised study,+	& the remainder must be multiplied by the number of members in the /student-body/.+-}+countUnallocatedAvailableTimeslots :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Ord			observerId+ )+	=> Data.Resource.ResourceMap observerId resource+	-> Timetable observerId timeslotId resourceIds level+	-> Size.NTimeslots+countUnallocatedAvailableTimeslots resourceMap	= length . locateUnallocatedAvailableCoordinates resourceMap++{- |+	* Calculates the average over all /observer-Id/s,+	of the average over the /day/s in the week on which the /observer/ is actually available,+	of the /absolute deviation/ (<https://en.wikipedia.org/wiki/Absolute_deviation#Average_absolute_deviation>),+	in the number of free-/period/s.++	* CAVEAT: includes in the count, those /time-slot/s allocated for /meeting/s.+-}+calculateAverageAbsoluteDeviationOfFreeLessonsPerDay :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Fractional		average,+	Ord			observerId+ )+	=> Data.Resource.ResourceMap observerId resource+	-> Timetable observerId timeslotId resourceIds level+	-> average+calculateAverageAbsoluteDeviationOfFreeLessonsPerDay resourceMap timetable+	| Data.Map.null timetable	= 0	-- TODO: query.+	| otherwise			= Factory.Math.Statistics.getMean {-amongst observers-} $ Data.Map.mapWithKey (+		\observerId timetableForWeek	-> Model.TimetableForWeek.calculateAverageAbsoluteDeviationOfFreeLessonsPerDay (resourceMap ! observerId) timetableForWeek :: Rational+	) timetable++{- |+	The number of /lesson/s booked for each /observer/, relative to the required limit of their teaching-time;+	based on 'Model.TimetableForWeek.calculateUtilisationRatio'.+-}+calculateUtilisationRatioByObserverId :: (+	Data.Array.IArray.Ix			timeslotId,+	Data.HumanResource.HumanResource	resource,+	Fractional				teachingRatio,+	Ord					observerId+ )+	=> Data.Resource.ResourceMap observerId resource+	-> Size.NTimeslots+	-> Timetable observerId timeslotId resourceIds level+	-> Data.Map.Map observerId teachingRatio+calculateUtilisationRatioByObserverId resourceMap nTimeslotsPerDay	= Data.Map.mapWithKey (Model.TimetableForWeek.calculateUtilisationRatio nTimeslotsPerDay . (resourceMap !))++{- |+	* Check whether all the /lesson/s currently booked for the specified time, are compatible with the specified /lesson/.++	* To pass, any synchronous /lesson/-definitions must either be identical to the proposed /lesson/, or use neither of its /resource/s.++	* CAVEAT: it doesn't check whether the /ability-stream/ of the /student-body/ matches those for the existing bookings.++	* CAVEAT: performance-hotspot.+-}+areMergeableWith :: (+	Data.Array.IArray.Ix		timeslotId,+	Eq				resourceIds,+	Eq				level,+	Model.ResourceUser.ResourceUser	resourceIds+ )+	=> Model.TimetableForWeek.Booking timeslotId resourceIds level+	-> Timetable observerId timeslotId resourceIds level+	-> Bool+areMergeableWith booking	= Model.ResourceUser.areMergeableWith (Model.TimetableForWeek.getBookedLesson booking) . extractSynchronousLessonsAt (Model.TimetableForWeek.getBookedTime booking)++{- |+	Calculates the mean, over those days on which the /resource/ is available,+	of the ratio of those free (neither booked with a /lesson/, not reserved for a /meeting/) /time-slot/s which comply with the specified preference,+	to the total number of free /time-slot/s.+-}+calculateMeanFreePeriodCompliance :: (+	Data.Array.IArray.Ix			timeslotId,+	Data.HumanResource.HumanResource	humanResource,+	Data.Resource.Resource			humanResource,+	Fractional				ratio,+	Ord					observerId+ )+	=> Data.Resource.ResourceMap observerId humanResource	-- ^ A map of /resource/s by /observerId/.+	-> (humanResource -> Temporal.Time.TimeSet timeslotId)	-- ^ A function which returns the times of the /meeting/s, for all /group/s of which this /human-resource/ is a member.+	-> Timetable observerId timeslotId resourceIds level+	-> ratio+calculateMeanFreePeriodCompliance humanResourceMap getMeetingTimes timetable+	| null ratios	= 1	-- TODO: query.+	| otherwise	= Factory.Math.Statistics.getMean ratios+	where+		ratios = [+			compliantPortionOfDay :: Rational |+				(observerId, timetableForWeek)	<- Data.Map.toList timetable,+				let profile	= humanResourceMap ! observerId,+				compliantPortionOfDay		<- Data.Maybe.maybe [] (+					\freePeriodPreference -> Model.TimetableForWeek.getFreePeriodCompliance freePeriodPreference (+						Temporal.Time.categoriseByDay $ getMeetingTimes profile+					) profile timetableForWeek+				) $ Data.HumanResource.getMaybeFreePeriodPreference profile+		 ] -- List-comprehension.++-- | A dummy type on which to hang instance-definitions.+newtype Wrapper observerId timeslotId resourceIds level	= MkWrapper {+	deconstruct	:: Timetable observerId timeslotId resourceIds level+}++instance (+	Data.Array.IArray.Ix	timeslotId,+	HXT.XmlPickler		level,+	HXT.XmlPickler		observerId,+	HXT.XmlPickler		resourceIds,+	HXT.XmlPickler		timeslotId,+	Ord			observerId,+	Show			level+ ) => HXT.XmlPickler (Wrapper observerId timeslotId resourceIds level) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		MkWrapper . Data.Map.fromList,	-- Construct from an association-list.+		Data.Map.toList . deconstruct	-- Deconstruct to an association-list.+	 ) . HXT.xpList1 {-can't be null-} . HXT.xpElem observerIdToTimetableAssociationTag $ HXT.xpElem observerIdTag HXT.xpickle `HXT.xpPair` Model.TimetableForWeek.xpickle++-- | A /lesson/ qualified by the /coordinates/ at which it is booked.+type Booking observerId timeslotId resourceIds level	= (Model.TimetableCoordinates.Coordinates observerId timeslotId, Model.Lesson.Lesson resourceIds level)++-- | Accessor.+getBookedCoordinates :: Booking observerId timeslotId resourceIds level -> Model.TimetableCoordinates.Coordinates observerId timeslotId+getBookedCoordinates	= fst++-- | Accessor.+getBookedLesson :: Booking observerId timeslotId resourceIds level -> Model.Lesson.Lesson resourceIds level+getBookedLesson	= snd++-- | Transform a /booking/, into a /generalised booking/.+toGeneralisedBooking :: Booking observerId timeslotId resourceIds level -> Model.GeneralisedBooking.GeneralisedBooking observerId timeslotId resourceIds level+toGeneralisedBooking	= Control.Arrow.second Just++-- | True if a /booking/ already exists in the /timetable/ which matches the specified /predicate/.+hasMatchingLessonAt+	:: (Data.Array.IArray.Ix timeslotId, Ord observerId)+	=> (Model.Lesson.Lesson resourceIds level -> Bool)		-- ^ Determines the suitability of any /lesson/ at the specified /coordinates/.+	-> Model.TimetableCoordinates.Coordinates observerId timeslotId	-- ^ The /coordinates/ at which to look for a /lesson/.+	-> Timetable observerId timeslotId resourceIds level+	-> Bool+hasMatchingLessonAt lessonPredicate coordinates	= Data.Maybe.maybe False {-there isn't a lesson, so there can't be a match-} lessonPredicate . getMaybeLesson coordinates++-- | True if the specified /booking/ already exists in the /timetable/.+isBookedWith :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Eq			resourceIds,+	Ord			observerId+ )+	=> Booking observerId timeslotId resourceIds level	-- ^ The /coordinates/ & /lesson/ to match.+	-> Timetable observerId timeslotId resourceIds level+	-> Bool+isBookedWith booking	= hasMatchingLessonAt (== getBookedLesson booking) (getBookedCoordinates booking)+
+ src-lib/WeekDaze/Model/TimetableAxis.hs view
@@ -0,0 +1,77 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Names the axes of the conceptually /3-D/ data-structure of the /timetable/.+-}++module WeekDaze.Model.TimetableAxis(+-- * Types+-- ** Data-types+	Axis(..),+-- * Constants+	tag,+	range,+-- * Functions+	getOthers,+	getPerpendicular+) where++import qualified	Control.DeepSeq+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "axis"++-- | Defines the three orthogonal axes of a /timetable/.+data Axis+	= ObserverId	-- ^ This axis spans the coordinates defined by the /observerId/, which is one of /student-body/, /location-id/, or /teacher-id/.+	| Day		-- ^ This axis spans the /day/s of the week.+	| TimeslotId	-- ^ This axis spans the identifier of a /time-slot/, within a /day/.+	deriving (Bounded, Enum, Eq, Read, Show)++instance HXT.XmlPickler Axis where+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++instance Control.DeepSeq.NFData Axis where+	rnf _	= ()++-- | The constant complete list of all values.+range :: [Axis]+range	= [minBound .. maxBound]++-- | Returns those axes other than that specified.+getOthers :: Axis -> [Axis]+getOthers ObserverId	= [Day, TimeslotId]+getOthers Day		= [ObserverId, TimeslotId]+getOthers TimeslotId	= [ObserverId, Day]++-- | Returns the axis perpendicular to the orthogonal pair specified.+getPerpendicular :: Axis -> Axis -> Axis+getPerpendicular ObserverId Day		= TimeslotId+getPerpendicular ObserverId TimeslotId	= Day+getPerpendicular Day ObserverId		= TimeslotId+getPerpendicular Day TimeslotId		= ObserverId+getPerpendicular TimeslotId ObserverId	= Day+getPerpendicular TimeslotId Day		= ObserverId+getPerpendicular x y			= error $ "WeekDaze.Model.TimetableAxis.getPerpendicular:\tspecified axes must be othogonal; " ++ show (x, y) ++ "."+
+ src-lib/WeekDaze/Model/TimetableAxisTraversal.hs view
@@ -0,0 +1,103 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a specific axis (& the sense in which that axis is traversed), in the three-dimensional coordinate-system used to describe a /timetable/.++-}++module WeekDaze.Model.TimetableAxisTraversal(+-- * Types+-- ** Type-synonyms+	Sense,+-- ** Data-types+	AxisTraversal(..),+-- * Constants+--	tag,+	senseTag,+-- * Functions+	maybeSenseToList,+	invertSense,+-- ** Predicates+	hasWildSense+) where++import			Control.Arrow((&&&))+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.Char+import qualified	Data.Maybe+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Model.TimetableAxis	as Model.TimetableAxis+import			WeekDaze.Enhanced.EnhancedBool()++-- | Used to qualify SQL & XML.+tag :: String+tag		= "timetableAxisTraversal"++-- | Used to qualify SQL & XML.+senseTag :: String+senseTag	= "sense"++-- | Defines the direction of travel along an axis; 'True' being interpreted as positive & 'False' negative.+type Sense	= Bool++-- | Defines an axis & the direction of travel along it.+data AxisTraversal	= MkAxisTraversal {+	getMaybeSense	:: Maybe Sense,			-- ^ Optionally defines the direction of travel along the axis.+	getAxis		:: Model.TimetableAxis.Axis	-- ^ Defines which of the axes to traverse.+} deriving Eq++instance Read AxisTraversal where+	readsPrec _ []	= []+	readsPrec _ s@(c : remainder)+		| Data.Char.isSpace c	= reads remainder	-- Consume.+		| otherwise		= case c of+			'+'	-> Control.Arrow.first (MkAxisTraversal $ Just True) `map` reads remainder+			'-'	-> Control.Arrow.first (MkAxisTraversal $ Just False) `map` reads remainder+			_	-> Control.Arrow.first (MkAxisTraversal Nothing) `map` reads s	-- Wild sense.++instance Show AxisTraversal where+	showsPrec _ axisTraversal	= showString (+		Data.Maybe.maybe "" (\sense -> if sense then "+" else "-") $ getMaybeSense axisTraversal+	 ) . shows (getAxis axisTraversal)++instance HXT.XmlPickler AxisTraversal where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry MkAxisTraversal,	-- Construct from a Pair.+		getMaybeSense &&& getAxis	-- Deconstruct to a Pair.+	 ) $ HXT.xpAttrImplied senseTag HXT.xpickle {-Maybe Sense-} `HXT.xpPair` HXT.xpickle {-TimetableAxis-}++instance Control.DeepSeq.NFData AxisTraversal where+	rnf	= Control.DeepSeq.rnf . (getMaybeSense &&& getAxis)++-- | Interpret a sense-specification.+maybeSenseToList :: Maybe Sense -> [Sense]+maybeSenseToList	= Data.Maybe.maybe [minBound .. maxBound] return {-to List-monad-}++-- | Construct a traversal which goes the other way along the same axis.+invertSense :: AxisTraversal -> AxisTraversal+invertSense (MkAxisTraversal (Just sense) axis)	= MkAxisTraversal (Just $ not sense) axis+invertSense x@(MkAxisTraversal Nothing _)	= x++-- | True if the sense is ill-defined.+hasWildSense :: AxisTraversal -> Bool+hasWildSense	= Data.Maybe.isNothing . getMaybeSense+
+ src-lib/WeekDaze/Model/TimetableAxisTriple.hs view
@@ -0,0 +1,163 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines an ordered triple of orthogonal /timetable/-axes.++	* Since these axes represent different concepts, the order in which they're traversed when defining the /lesson/ at each /time-slot/, is significant.+-}++module WeekDaze.Model.TimetableAxisTriple(+-- * Types+-- ** Type-synonyms+--	Triple,+-- ** Data-types+	Axes(+		deconstruct+	),+-- * Constants+	tag,+	permutations,+-- * Functions+	fromList,+	toList,+	invertSense,+	generatePermutationsOf,+-- ** Constructor+	mkAxes,+-- ** Predicates+--	areOrthogonal,+	hasWildSense+) where++import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Data.List+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Model.TimetableAxis		as Model.TimetableAxis+import qualified	WeekDaze.Model.TimetableAxisTraversal	as Model.TimetableAxisTraversal++-- | Used to qualify XML.+tag :: String+tag	= "traversalOrder"++{- |+	* Defines the order & sense, in which the axes of a /timetable/ are traversed.++	* Each traversal is a raster-scan over the coordinates of a /timetable/,+	but the order in which one nests the required iterations potentially affects both the efficiency & result.++	* The first axis specified changes least frequently during the raster-scan, & the last most frequently.++	* There are @ (3! * 2^3 = 48) @ permutations, since we distinguish between the /senses/ in which each axis can be traversed.+-}+type Triple	= (Model.TimetableAxisTraversal.AxisTraversal, Model.TimetableAxisTraversal.AxisTraversal, Model.TimetableAxisTraversal.AxisTraversal)++-- | Dummy data-type on which to hang instance-definitions.+newtype Axes	= MkAxes {+	deconstruct	:: Triple+} deriving Eq++instance Read Axes where+	readsPrec _	= map (Control.Arrow.first mkAxes) . reads++instance Show Axes where+	showsPrec _ (MkAxes triple)	= shows triple++instance ToolShed.SelfValidate.SelfValidator Axes where+	getErrors axes	= ToolShed.SelfValidate.extractErrors [(not $ areOrthogonal axes, "axes must be orthogonal; " ++ show axes)]++instance HXT.XmlPickler Axes where+	xpickle	= HXT.xpElem tag $ HXT.xpWrap (+		mkAxes,		-- Construct from a Triple.+		deconstruct	-- Deconstruct to a Triple.+	 ) $ HXT.xpTriple (+		HXT.xpElem "x" HXT.xpickle+	 ) (+		HXT.xpElem "y" HXT.xpickle+	 ) (+		HXT.xpElem "z" HXT.xpickle+	 )++instance Control.DeepSeq.NFData Axes where+	rnf	= Control.DeepSeq.rnf . deconstruct++-- | Smart constructor.+mkAxes :: Triple -> Axes+mkAxes triple+	| ToolShed.SelfValidate.isValid axes	= axes+	| otherwise				= error $ "WeekDaze.Model.TimetableAxisTriple.mkAxes:\t" ++ ToolShed.SelfValidate.getFirstError axes ++ "."+	where+		axes	= MkAxes triple++-- | True if the three specified axes are distinct.+areOrthogonal :: Axes -> Bool+areOrthogonal	= (== 3) . length . Data.List.nub . map Model.TimetableAxisTraversal.getAxis . toList++-- | Invert the sense of each axis, but not their order, thus reversing the raster.+invertSense :: Axes -> Axes+invertSense	= fromList . map Model.TimetableAxisTraversal.invertSense . toList++-- | Convert from a list of /axis-traversal/s.+fromList :: [Model.TimetableAxisTraversal.AxisTraversal] -> Axes+fromList [x, y, z]	= mkAxes (x, y, z)+fromList axisTraversals	= error $ "WeekDaze.Model.TimetableAxisTriple.mkAxes:\tprecisely three axes-traversals are required " ++ show axisTraversals ++ "."++-- | Convert into a list of /axis-traversal/s.+toList :: Axes -> [Model.TimetableAxisTraversal.AxisTraversal]+toList (MkAxes (x, y, z))	= [x, y, z]++-- | The constant list of all permutations of axis-order & sense of travel along each.+permutations :: [Axes]+permutations	= [+	mkAxes (+		Model.TimetableAxisTraversal.MkAxisTraversal (Just xSense) xAxis,+		Model.TimetableAxisTraversal.MkAxisTraversal (Just ySense) yAxis,+		Model.TimetableAxisTraversal.MkAxisTraversal (Just zSense) $ Model.TimetableAxis.getPerpendicular xAxis yAxis+	) |+		xSense	<- [minBound .. maxBound],+		xAxis	<- Model.TimetableAxis.range,+		ySense	<- [minBound .. maxBound],+		yAxis	<- Model.TimetableAxis.getOthers xAxis,+		zSense	<- [minBound .. maxBound]+ ] -- List-comprehension.++-- | The list of permutations of axis-order & sense of travel along each matching the supplied specification.+generatePermutationsOf :: Axes -> [Axes]+generatePermutationsOf axes@(MkAxes (x, y, z))+	| not $ hasWildSense axes	= [axes]	-- Not strictly necessary, since the main algorithm copes with this case.+	| otherwise			= [+		mkAxes (+			Model.TimetableAxisTraversal.MkAxisTraversal (Just xSense) $ Model.TimetableAxisTraversal.getAxis x,+			Model.TimetableAxisTraversal.MkAxisTraversal (Just ySense) $ Model.TimetableAxisTraversal.getAxis y,+			Model.TimetableAxisTraversal.MkAxisTraversal (Just zSense) $ Model.TimetableAxisTraversal.getAxis z+		) |+			xSense	<- Model.TimetableAxisTraversal.maybeSenseToList $ Model.TimetableAxisTraversal.getMaybeSense x,+			ySense	<- Model.TimetableAxisTraversal.maybeSenseToList $ Model.TimetableAxisTraversal.getMaybeSense y,+			zSense	<- Model.TimetableAxisTraversal.maybeSenseToList $ Model.TimetableAxisTraversal.getMaybeSense z+	] -- List-comprehension.++-- | True if the sense is ill-defined.+hasWildSense :: Axes -> Bool+hasWildSense	= any Model.TimetableAxisTraversal.hasWildSense . toList+
+ src-lib/WeekDaze/Model/TimetableCoordinates.hs view
@@ -0,0 +1,60 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the coordinates, used to access any time-slot in the conceptually /3-D/ generic /timetable/.++	* Each time-slot can contain a /lesson/-definition.+-}++module WeekDaze.Model.TimetableCoordinates(+-- * Types+-- ** Type-synonyms+	Coordinates,+	Vector,+-- * Functions+-- ** Accessors+	getObserverId,+	getTime+) where++import qualified	WeekDaze.Temporal.Time	as Temporal.Time++{- |+	* Each /time-slot/ in a /timetable/ is defined by three coordinates, though the two temporal coordinates (/day/ & /timeslot-id/) have been paired to form a pseudo /time/.++	* The third /coordinate/, which depends on the intended /observer/, separates the weekly /timetable/ for one observer, from those for all other /observers/ of the same type.++	* The whole structure can be visualised as a cuboid, with an optional /lesson/ defined at each Cartesian coordinate.+-}+type Coordinates observerId timeslotId	= (observerId, Temporal.Time.Time timeslotId)++-- | Accessor.+getObserverId :: Coordinates observerId timeslotId -> observerId+getObserverId	= fst++-- | Accessor.+getTime :: Coordinates observerId timeslotId -> Temporal.Time.Time timeslotId+getTime	= snd++-- | An ordered sequence of 'Coordinates'.+type Vector observerId timeslotId	= [Coordinates observerId timeslotId]
+ src-lib/WeekDaze/Model/TimetableForDay.hs view
@@ -0,0 +1,443 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Define the data-structure, required to hold a single day's bookings, for any /observer/-id.++	* It doesn't reference the parameters of the specific problem, or the means by which a solution is obtained.+-}++module WeekDaze.Model.TimetableForDay(+-- * Types+-- ** Type-synonyms+	TimetableForDay,+	Association,+	Booking,+	GeneralisedLessonRunlength,+	GeneralisedLessonRunlengthByTimeslotId,+--	GeneralisedLessonRunlengths,+	LessonRunlengths,+	RunlengthsByTimeslotIdByLesson,+-- * Constants+--	tag,+--	bookingTag,+-- * Functions+	measureRunlengthAt,+	boundRunlengthAt,+	countRunlengthAt,+	countUnallocatedTimeslots,+	bisectAt,+	extractAdjacentBookings,+	locateUnallocatedTimeslots,+	findGeneralisedLessonRunlengths,+	findGeneralisedLessonRunlengthsByTimeslotId,+--	findSeparatedEqualLessonsBy,+	findSeparatedEqualLessons,+	findSeparatedEqualSubjectLessons,+	findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLesson,+	measureFreePeriodCompliance,+	spanRunlengthAt,+-- ** Accessors+	getTimeslotId,+	getMaybeLesson,+--	getBookedTimeslotId,+	getBookedLesson,+-- ** Constructor+	mkFreeTimetableForDay,+-- ** Mutators+	defineTimeslot,+-- ** Predicates+	isSubjectBooked,+	isDefined,+-- ** Translation+	xpickle+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((//), (!))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Factory.Data.Interval+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.List.Runlength+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference+import qualified	WeekDaze.Temporal.Time			as Temporal.Time++-- | Used to qualify XML.+tag :: String+tag		= "timetableForDay"++-- | Used to qualify XML.+bookingTag :: String+bookingTag	= "booking"++{- |+	* The ordered sequence of time-slots within a single unspecified day.++	* The sequence of time-slots are contiguous;+		/double/ /lesson/s are representated by consecutive duplicate /lesson/-definitions,+		free-/period/s are represented by 'Nothing'.++	* Each time-slot has a specific unspecified start-time & probably a constant duration; but that depends on the school, so no such assumption is made here.+-}+type TimetableForDay timeslotId resourceIds level	= Data.Array.IArray.Array timeslotId (Model.Lesson.GeneralisedLesson resourceIds level)++-- | The association on which 'TimetableForDay' is based.+type Association timeslotId resourceIds level	= (timeslotId, Model.Lesson.GeneralisedLesson resourceIds level)++-- | Accessor.+getTimeslotId :: Association timeslotId resourceIds level -> timeslotId+getTimeslotId	= fst++-- | Accessor.+getMaybeLesson :: Association timeslotId resourceIds level -> Model.Lesson.GeneralisedLesson resourceIds level+getMaybeLesson	= snd++-- | True if the /time-slot/ has been booked.+isDefined :: Association timeslotId resourceIds level -> Bool+isDefined	= Data.Maybe.isJust . getMaybeLesson++-- | Defines a pickler to convert the specified /timetable/ to, or from, XML.+xpickle :: (+	Data.Array.IArray.Ix	timeslotId,+	HXT.XmlPickler		level,+	HXT.XmlPickler		resourceIds,+	HXT.XmlPickler		timeslotId,+	Show			level+ ) => HXT.PU (TimetableForDay timeslotId resourceIds level)+xpickle	= HXT.xpElem tag . HXT.xpWrap (+	uncurry Data.Array.IArray.array . (+		(minimum &&& maximum) . map fst &&& id+	),				-- Construct from an association-list; since all time-slots are recorded in the XML, even when no lesson is booked, the timeslotId-bounds can be derived.+	Data.Array.IArray.assocs	-- Deconstruct to an association-list.+ ) . HXT.xpList1 {-can't be null-} $ HXT.xpElem bookingTag HXT.xpickle {-Pair-}++-- | A /lesson/ qualified by the /time-slot/ at which it is booked.+type Booking timeslotId resourceIds level	= (timeslotId, Model.Lesson.Lesson resourceIds level)++-- | Accessor.+getBookedTimeslotId :: Booking timeslotId resourceIds level -> timeslotId+getBookedTimeslotId	= fst++-- | Accessor.+getBookedLesson :: Booking timeslotId resourceIds level -> Model.Lesson.Lesson resourceIds level+getBookedLesson	= snd++-- | Constructor. Create an unallocated /timetable/, for any single day.+mkFreeTimetableForDay :: (Data.Array.IArray.Ix timeslotId, Enum timeslotId) => Factory.Data.Interval.Interval timeslotId -> TimetableForDay timeslotId resourceIds level+mkFreeTimetableForDay timeslotIdBounds	= Data.Array.IArray.array timeslotIdBounds . zip (Factory.Data.Interval.toList timeslotIdBounds) $ repeat Nothing++{- |+	* Bisect the association-list extracted from the 'TimetableForDay', at the specified /timeslotId/, to form two lists, those before & those after the specified /time-slot/.++	* The list of earlier /time-slot/s is reversed, as though looking backwards from the specified /time-slot/.++	* CAVEAT: the association at the specified /timeslotId/ isn't returned in either half.+-}+bisectAt+	:: Data.Array.IArray.Ix timeslotId+	=> timeslotId+	-> TimetableForDay timeslotId resourceIds level+	-> ([Association timeslotId resourceIds level], [Association timeslotId resourceIds level])+bisectAt timeslotId	= (+	dropWhile (+		(>= timeslotId) . getTimeslotId	-- Extract earlier timeslots.+	) . reverse &&& dropWhile (+		(<= timeslotId) . getTimeslotId	-- Extract later timeslots.+	)+ ) . Data.Array.IArray.assocs++{- |+	* Get any /lesson/s immediately adjacent to the specified /time-slot/.++	* The relevance is that adjacent /lesson/s can typically be replicated, to form a longer duration /lesson/,+	but duplication of a non-adjacent one, would leave an awkward gap.+-}+extractAdjacentBookings+	:: Data.Array.IArray.Ix timeslotId+	=> timeslotId+	-> TimetableForDay timeslotId resourceIds level+	-> [Booking timeslotId resourceIds level]+extractAdjacentBookings timeslotId	= uncurry (++) . ToolShed.Data.Pair.mirror (+	take 1 {-either a null or a singleton list; cf. 'head'-} . map (Control.Arrow.second Data.Maybe.fromJust) . takeWhile isDefined+ ) . bisectAt timeslotId++{- |+	* Defines the (lower & upper) bounds, & measures the span-length, of adjacent /lesson/s, equal to that referenced.++	* CAVEAT: if an undefined /time-slot/ is referenced, then the run-length of undefined /time-slot/s will be measured.+-}+measureRunlengthAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ )+	=> timeslotId	-- ^ The identifier of the /time-slot/ at which to measure the run-length of equal /lesson/s.+	-> TimetableForDay timeslotId resourceIds level+	-> (Factory.Data.Interval.Interval timeslotId, Size.NTimeslots)+measureRunlengthAt timeslotId timetableForDay	= (+	(+		toEnum . (i -) *** toEnum . (i +)	-- Identify the minimum & maximum bounds of the runlength.+	) &&& succ {-include the specified timeslotId-} . uncurry (+)+ ) . ToolShed.Data.Pair.mirror (+	length . takeWhile ((== timetableForDay ! timeslotId) . getMaybeLesson)+ ) $ bisectAt timeslotId timetableForDay where+	i	= fromEnum timeslotId++-- | Defines the /timeslotId/-interval, delimiting the span of adjacent /lesson/s, equal to that referenced.+boundRunlengthAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ )+	=> timeslotId	-- ^ The identifier of the /time-slot/ at which to measure the run-length of equal /lesson/s.+	-> TimetableForDay timeslotId resourceIds level+	-> Factory.Data.Interval.Interval timeslotId+boundRunlengthAt timeslotId	= fst . measureRunlengthAt timeslotId++-- | Returns the list of /timeslotId/s where /lesson/s equal to that referenced, are booked.+spanRunlengthAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ )+	=> timeslotId	-- ^ The identifier of the /time-slot/ at which to measure the run-length of equal /lesson/s.+	-> TimetableForDay timeslotId resourceIds level+	-> [timeslotId]+spanRunlengthAt timeslotId	= uncurry enumFromTo . boundRunlengthAt timeslotId++-- | Measures the length of the span of adjacent /lesson/s, equal to that referenced.+countRunlengthAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ )+	=> timeslotId	-- ^ The identifier of the /time-slot/ at which to measure the run-length of equal /lesson/s.+	-> TimetableForDay timeslotId resourceIds level+	-> Size.NTimeslots+countRunlengthAt timeslotId	= snd . measureRunlengthAt timeslotId++-- | True if the specified /subject/ has already been booked at any /time-slot/ in today's /timetable/.+isSubjectBooked :: (+#if !MIN_VERSION_array(0,5,2)+	Data.Array.IArray.Ix	timeslotId,+#endif /* CAVEAT: constraint unnecessary from "Data.Array.IArray-0.5.1.1" */+	Eq			level+ ) => Data.Subject.Subject level -> TimetableForDay timeslotId resourceIds level -> Bool+isSubjectBooked subject	= Data.Foldable.any . Data.Maybe.maybe False {-no lesson booked-} $ (== subject) . Model.Lesson.getSubject++{- |+	* Identifies unallocated /time-slot/s.++	* CAVEAT: doesn't account for the /availability/ of the /resource/, or whether any /time-slot/s has been reserved for /meeting/s.+-}+locateUnallocatedTimeslots :: Data.Array.IArray.Ix timeslotId => TimetableForDay timeslotId resourceIds level -> [timeslotId]+locateUnallocatedTimeslots timetableForDay	= [+	unallocatedTimeslotId |+		(unallocatedTimeslotId, Nothing {-i.e. unallocated-})	<- Data.Array.IArray.assocs timetableForDay+ ] -- List-comprehension.++{- |+	* Counts the /time-slot/s which haven't been yet booked.++	* CAVEAT: doesn't account for the /availability/ of the /resource/, or whether any /time-slot/s has been reserved for /meeting/s.+-}+countUnallocatedTimeslots :: Data.Array.IArray.Ix timeslotId => TimetableForDay timeslotId resourceIds level -> Size.NTimeslots+countUnallocatedTimeslots	= length . locateUnallocatedTimeslots++-- | Define a single /lesson/ in the /timetable/.+defineTimeslot+	:: Data.Array.IArray.Ix timeslotId+	=> Association timeslotId resourceIds level+	-> TimetableForDay timeslotId resourceIds level+	-> TimetableForDay timeslotId resourceIds level+defineTimeslot booking	= (// [booking])++-- | A runlength-encoded list of generalised (i.e. potentially undefined) /lesson/.+type GeneralisedLessonRunlength resourceIds level	= ToolShed.Data.List.Runlength.Code (Model.Lesson.GeneralisedLesson resourceIds level)++-- | A runlength-encoded list of /time-slot/s.+type GeneralisedLessonRunlengths resourceIds level	= [GeneralisedLessonRunlength resourceIds level]++{- |+	* Measures run-lengths of consecutive equal generalised (i.e. potentially undefined) /lesson/s.++	* Includes consecutive unallocated /time-slot/s & trivial sequences of length one.++	* CAVEAT: the /coordinates/ of each runlength aren't explicit; see 'findGeneralisedLessonRunlengthsByTimeslotId'.+-}+findGeneralisedLessonRunlengths :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			resourceIds,+	Eq			level+ ) => TimetableForDay timeslotId resourceIds level -> GeneralisedLessonRunlengths resourceIds level+findGeneralisedLessonRunlengths	= ToolShed.Data.List.Runlength.encode . Data.Array.IArray.elems++-- | An association-list keyed by the starting /timeslotId/, of runlength-encoded generalised (i.e. potentially undefined) /lesson/s.+type GeneralisedLessonRunlengthByTimeslotId timeslotId resourceIds level	= [(timeslotId, GeneralisedLessonRunlength resourceIds level)]++-- | Calls 'findGeneralisedLessonRunlengths' & derives the /coordinates/ of the start of each runlength.+findGeneralisedLessonRunlengthsByTimeslotId :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ ) => TimetableForDay timeslotId resourceIds level -> GeneralisedLessonRunlengthByTimeslotId timeslotId resourceIds level+findGeneralisedLessonRunlengthsByTimeslotId timetableForDay	= init {-drop the initial value-} . scanr (+	\runlengthCode (timeslotId, _)	-> (`Temporal.Time.shift` timeslotId) . negate . ToolShed.Data.List.Runlength.getLength	{-derive the starting timeslotId-} &&& id $ runlengthCode+ ) (+	succ . snd {-max-} $ Data.Array.IArray.bounds timetableForDay,	-- The non-existent timeslotId immediately after the last for the day.+	undefined							-- The non-existent generalised lesson at the above time-slot.+ ) $ findGeneralisedLessonRunlengths timetableForDay++-- | A runlength-encoded list of /lesson/s.+type LessonRunlengths resourceIds level	= [ToolShed.Data.List.Runlength.Code (Model.Lesson.Lesson resourceIds level)]++{- |+	* Finds separated equal (according to the attribute returned by the specified accessor) /lesson/s; separated unallocated /time-slot/s don't qualify.++	* CAVEAT: discards the /coordinates/ at which each /lesson/ was booked.+-}+findSeparatedEqualLessonsBy :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			resourceIds,+	Eq			level,+	Ord			attribute+ )+	=> (Model.Lesson.Lesson resourceIds level -> attribute)	-- ^ Accessor.+	-> TimetableForDay timeslotId resourceIds level+	-> LessonRunlengths resourceIds level+findSeparatedEqualLessonsBy accessor	= filter (+	(/= 1) . ToolShed.Data.List.Runlength.getLength	-- Select non-unique sessions.+ ) . map (+	length &&& head	-- Construct a 'ToolShed.Data.List.Runlength.Code'.+ ) . Data.List.Extra.groupSortOn accessor {-separated sessions-} . Data.Maybe.mapMaybe head {-remove consecutive equal lessons, discounting undefined time-slots-} . Data.List.group {-consecutive equal generalised lessons-} . Data.Array.IArray.elems++{- |+	* Finds separated equal /lesson/s; separated unallocated /time-slot/s don't qualify.++	* CAVEAT: discards the /coordinates/ at which each /lesson/ was booked.+-}+findSeparatedEqualLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			resourceIds,+	Ord			level+ ) => TimetableForDay timeslotId resourceIds level -> LessonRunlengths resourceIds level+findSeparatedEqualLessons	= findSeparatedEqualLessonsBy id++{- |+	* Finds separated /lesson/s of equal /subject/.++	* CAVEAT: discards the /coordinates/ at which each /lesson/ was booked.+-}+findSeparatedEqualSubjectLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			resourceIds,+	Ord			level+ ) => TimetableForDay timeslotId resourceIds level -> LessonRunlengths resourceIds level+findSeparatedEqualSubjectLessons	= findSeparatedEqualLessonsBy Model.Lesson.getSubject++-- | A list associated by /lesson/, of lists associated by /timeslotId/.+type RunlengthsByTimeslotIdByLesson resourceIds level timeslotId	= [(Model.Lesson.Lesson resourceIds level, [(timeslotId {-start-}, Size.NTimeslots {-runlength-})])]++{- |+	* Finds runlengths of separated equal /lesson/s; separated unallocated /time-slot/s don't qualify.++	* Returns a list associated by the common /lesson/, of lists associated by starting /timeslotId/, of runlengths.+-}+findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			resourceIds,+	Ord			level+ ) => TimetableForDay timeslotId resourceIds level -> RunlengthsByTimeslotIdByLesson resourceIds level timeslotId+findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLesson timetableForDay	= map (+	\l@(+		(+			_,	-- startingTimeslotId.+			(+				_,	-- Run-length.+				lesson+			) -- Pair.+		) : _+	) -> (+		lesson,+		map (+			Control.Arrow.second fst {-runlength-}	-- Drop the common lesson, which has been factored-out.+		) l+	) -- Pair.+ ) . filter (+	(/= 1) . length	-- Select non-unique sessions.+ ) $ Data.List.Extra.groupSortOn (+	snd {-lesson-} . snd {-runlength-code-}	-- Separated equals lessons.+ ) [+	(startingTimeslotId, (length l, lesson)) |+		l@((startingTimeslotId, Just lesson) : _)	<- Data.List.groupBy (+			ToolShed.Data.List.equalityBy snd {-generalised lesson-}	-- Consecutive equal lessons.+		) $ Data.Array.IArray.assocs timetableForDay+ ] -- List-comprehension.++{- |+	Measure the ratio of those free (neither reserved for a /meeting/ nor booked with a /lesson/) /time-slot/s+	which comply with the specified preference,+	to the total number of free /time-slot/s.+-}+measureFreePeriodCompliance+	:: (Data.Array.IArray.Ix timeslotId, Fractional ratio)+	=> Temporal.FreePeriodPreference.FreePeriodPreference+	-> Data.Set.Set timeslotId	-- ^ The /timeslotId/s of meetings, for the groups of which this observer is a member.+	-> TimetableForDay timeslotId resourceIds level+	-> ratio+measureFreePeriodCompliance freePeriodPreference meetingTimeslotIds timetableForDay+	| nFreePeriods `elem` [+		0,+		Data.Array.IArray.rangeSize $ Data.Array.IArray.bounds timetableForDay+	]		= 1	-- CAVEAT: debatable.+	| otherwise	= fromIntegral nCompliantFreePeriods / fromIntegral nFreePeriods+	where+		nCompliantFreePeriods, nFreePeriods :: Size.NTimeslots+		(nCompliantFreePeriods, nFreePeriods)	= (+			countConformantFreePeriods freePeriodPreference &&& length . filter id+		 ) . map (+			uncurry (&&) . ((`Data.Set.notMember` meetingTimeslotIds) *** Data.Maybe.isNothing)	-- Check it's neither reserved for a meeting nor booked with a lesson.+		 ) $ Data.Array.IArray.assocs timetableForDay++		countConformantFreePeriods :: Temporal.FreePeriodPreference.FreePeriodPreference -> [Bool] -> Size.NTimeslots+		countConformantFreePeriods freePeriodPreference'	= case freePeriodPreference' of+			Temporal.FreePeriodPreference.Pre	-> length . takeWhile id+			Temporal.FreePeriodPreference.Post	-> countConformantFreePeriods Temporal.FreePeriodPreference.Pre . reverse+			Temporal.FreePeriodPreference.Terminal	-> uncurry (+) . (countConformantFreePeriods Temporal.FreePeriodPreference.Pre &&& countConformantFreePeriods Temporal.FreePeriodPreference.Post)+
+ src-lib/WeekDaze/Model/TimetableForWeek.hs view
@@ -0,0 +1,711 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+-- {-# OPTIONS_GHC -Wall -O1 #-}	-- CAVEAT: 'O2' once resulted in a SegV on calling the bound function 'toXHtmlLesson' with @ Temporal.TimeAxes.getByTimeslotId mergeDuplicateTimeslots = False @.+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Define the data-structure, required to hold a single week's bookings, for any /observer/-id.++	* It forms a complete /timetable/, when combined with similar data-structures, for all observers.+-}++module WeekDaze.Model.TimetableForWeek(+-- * Types+-- ** Type-synonyms+	TimetableForWeek,+--	Association,+	Booking,+	GenericTimetableToMarkup,+	GenericTimetableToMarkup',+	GeneralisedLessonRunlengthByTimeslotIdByDay,+	RunlengthsByTimeslotIdByLessonByDay,+-- * Constants+--	meetingsCSSIdentifier,+	observerViewTerminatorCSSIdentifier,+--	originCSSIdentifier,+--	unallocatedTimeslotCSSIdentifier,+	unavailableCSSIdentifier,+--	weekendCSSIdentifier,+--	workdayCSSIdentifier,+--	tag,+--	dayToTimetableAssociationTag,+-- * Functions+	calculateAverageAbsoluteDeviationOfFreeLessonsPerDay,+	calculateUtilisationRatio,+	locateUnallocatedAvailableTimes,+	findGeneralisedLessonRunlengthsByTimeslotIdByDay,+	findSeparatedEqualLessonsWithinAnyDay,+	findSeparatedEqualSubjectLessonsWithinAnyDay,+	findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDay,+--	countWorkload,+	countSubjectWorkload,+	countWorkloadByLesson,+	countUnallocatedAvailableTimeslots,+	extractLessons,+	extractTimes,+	extractDistinctLessons,+	extractMaybeLessonsAt,+	getFreePeriodCompliance,+-- ** Constructor+	mkFreeTimetableForWeek,+-- ** Accessors+--	getDay,+--	getTimetableForDay,+	getMaybeLesson,+	getBookedTime,+	getBookedLesson,+-- ** Mutators+	defineTimeslot,+	undefineTimeslots,+-- ** Predicates+	hasMatchingLessonAt,+	isBookedWith,+	areAllSpecifiedTimesBookable,+	isBookedOnAdjacentDay,+	isDefinedTimeslot,+	isRunlengthReducibleAt,+-- ** Translation+	toXHtml,+	xpickle+) where++import			Control.Arrow((&&&), (***))+import			Data.Array.IArray((!), (//))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Factory.Data.Interval+import qualified	Factory.Math.Statistics+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.Colour.HTMLColour			as Colour.HTMLColour+import qualified	WeekDaze.Colour.HTMLColourCode			as Colour.HTMLColourCode+import qualified	WeekDaze.Colour.RGB				as Colour.RGB+import qualified	WeekDaze.Data.Course				as Data.Course+import qualified	WeekDaze.Data.HumanResource			as Data.HumanResource+import qualified	WeekDaze.Data.Resource				as Data.Resource+import qualified	WeekDaze.Data.Subject				as Data.Subject+import qualified	WeekDaze.Model.GenerateLessonColourFrom		as Model.GenerateLessonColourFrom+import qualified	WeekDaze.Model.Lesson				as Model.Lesson+import qualified	WeekDaze.Model.Meeting				as Model.Meeting+import qualified	WeekDaze.Model.TimetableForDay			as Model.TimetableForDay+import qualified	WeekDaze.Size					as Size+import qualified	WeekDaze.Temporal.Availability			as Temporal.Availability+import qualified	WeekDaze.Temporal.Day				as Temporal.Day+import qualified	WeekDaze.Temporal.FreePeriodPreference		as Temporal.FreePeriodPreference+import qualified	WeekDaze.Temporal.Time				as Temporal.Time+import qualified	WeekDaze.Temporal.TimeAxes			as Temporal.TimeAxes+import qualified	WeekDaze.Temporal.TimeslotRequest		as Temporal.TimeslotRequest+import qualified	WeekDaze.Text.CSS				as Text.CSS+import			Text.XHtml.Strict((+++), (<<))++-- | Used to qualify output.+meetingsCSSIdentifier :: Text.CSS.CSSIdentifier+meetingsCSSIdentifier			= "meetings"++-- | Used to qualify output.+observerViewTerminatorCSSIdentifier :: Text.CSS.CSSIdentifier+observerViewTerminatorCSSIdentifier	= "observerViewTerminator"++-- | Used to qualify output.+originCSSIdentifier :: Text.CSS.CSSIdentifier+originCSSIdentifier			= "origin"++-- | Used to qualify output.+unallocatedTimeslotCSSIdentifier :: Text.CSS.CSSIdentifier+unallocatedTimeslotCSSIdentifier	= "unallocatedTimeslot"++-- | Used to qualify output.+unavailableCSSIdentifier :: Text.CSS.CSSIdentifier+unavailableCSSIdentifier		= "unavailable"++-- | Used to qualify output.+weekendCSSIdentifier :: Text.CSS.CSSIdentifier+weekendCSSIdentifier			= "weekend"++-- | Used to qualify output.+workdayCSSIdentifier :: Text.CSS.CSSIdentifier+workdayCSSIdentifier			= "workday"++-- | Used to qualify CSS & XML.+tag :: String+tag					= "timetableForWeek"++-- | Used to qualify XML.+dayToTimetableAssociationTag :: String+dayToTimetableAssociationTag		= "dayToTimetableAssociation"++-- | A timetable for observers with identical scheduling-requirements, for any week.+type TimetableForWeek timeslotId resourceIds level	= Data.Array.IArray.Array Temporal.Day.Day (Model.TimetableForDay.TimetableForDay timeslotId resourceIds level)++-- | The association on which 'TimetableForDay' is based.+type Association timeslotId resourceIds level	= (Temporal.Day.Day, Model.TimetableForDay.TimetableForDay timeslotId resourceIds level)++-- | Accessor.+getDay :: Association timeslotId resourceIds level -> Temporal.Day.Day+getDay	= fst++-- | Accessor.+getTimetableForDay :: Association timeslotId resourceIds level -> Model.TimetableForDay.TimetableForDay timeslotId resourceIds level+getTimetableForDay	= snd++-- | Get any /lesson/ booked at the specified /time/.+getMaybeLesson+	:: Data.Array.IArray.Ix timeslotId+	=> Temporal.Time.Time timeslotId+	-> TimetableForWeek timeslotId resourceIds level+	-> Model.Lesson.GeneralisedLesson resourceIds level+getMaybeLesson time	= (! Temporal.Time.getTimeslotId time) . (! Temporal.Time.getDay time)++-- | True if a /booking/ has been made at the specified /time/ in the /timetable/.+isDefinedTimeslot+	:: Data.Array.IArray.Ix timeslotId+	=> Temporal.Time.Time timeslotId+	-> TimetableForWeek timeslotId resourceIds level+	-> Bool+isDefinedTimeslot time	= Data.Maybe.isJust . getMaybeLesson time++-- | Extracts any /lesson/-definitions, from the specified /timeslot-Id/ on each /day/.+extractMaybeLessonsAt+	:: Data.Array.IArray.Ix timeslotId+	=> timeslotId+	-> TimetableForWeek timeslotId resourceIds level+	-> Data.Array.IArray.Array Temporal.Day.Day (Model.Lesson.GeneralisedLesson resourceIds level)+extractMaybeLessonsAt timeslotId	= Data.Array.IArray.amap (! timeslotId)++-- | Extracts the set of distinct /lesson/s from the specified /timetable/.+extractDistinctLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			resourceIds,+	Ord			level+ ) => TimetableForWeek timeslotId resourceIds level -> Data.Set.Set (Model.Lesson.Lesson resourceIds level)+extractDistinctLessons	= Data.Set.fromList . extractLessons++{- |+	Calculates the /average absolute deviation/ (<https://en.wikipedia.org/wiki/Absolute_deviation#Average_absolute_deviation>) in the number of free-/period/s,+	over the /day/s in the week on which the /resource/ is actually /available/.+-}+calculateAverageAbsoluteDeviationOfFreeLessonsPerDay :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Fractional		average+ )+	=> resource+	-> TimetableForWeek timeslotId resourceIds level+	-> average+calculateAverageAbsoluteDeviationOfFreeLessonsPerDay resource	= Factory.Math.Statistics.getAverageAbsoluteDeviation . map (+	Model.TimetableForDay.countUnallocatedTimeslots . getTimetableForDay	-- Which includes those time-slots allocated for meetings.+ ) . filter (+	(`Data.Resource.isAvailableOn` resource) . getDay+ ) . Data.Array.IArray.assocs++-- | Counts the number of /lesson/s booked.+countWorkload :: Data.Array.IArray.Ix timeslotId => TimetableForWeek timeslotId resourceIds level -> Size.NTimeslots+countWorkload	= length . extractLessons++-- | Returns the total number of /lesson/-definitions currently booked for the specified /subject/.+countSubjectWorkload+	:: (Data.Array.IArray.Ix timeslotId, Ord level)+	=> Data.Subject.Subject level+	-> TimetableForWeek timeslotId resourceIds level+	-> Size.NTimeslots+countSubjectWorkload subject	= length . filter ((== subject) . Model.Lesson.getSubject) . extractLessons	-- Neither 'foldr' nor 'foldl' were faster.++{- |+	* Returns the total number of each type of /lesson/ currently booked.++	* CAVEAT: if zero of the requested /lesson/ have been booked, then there won't be any matching key in the map.++	* CAVEAT: be careful with the interpretation of these results,+	unless it can be guaranteed that all /lesson/s for a given /subject/ are identical (i.e. they use the same /resourceIds/);+	otherwise the workload returned for a /subject/ could be split amongst different /lesson/s.+	Whilst this is typically the case for the /student-view/ of a /timetableForWeek/,+	it's may not be the case for other views, since the /student-class/ may vary.+-}+countWorkloadByLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			resourceIds+ ) => TimetableForWeek timeslotId resourceIds level -> Data.Map.Map (Model.Lesson.Lesson resourceIds level) Size.NTimeslots+countWorkloadByLesson	= foldr (+	flip (Data.Map.insertWith $ const succ) 1+ ) Data.Map.empty {-initial value-} . extractLessons++{- |+	* The number of /lesson/s booked for the specified /human-resource/, relative to the limit of their teaching-time.++	* This factors into the denominator, both the /availability/ of the /resource/,+	& the ratio of that working-time for which they're required to be in teaching rather than some other job-role.+-}+calculateUtilisationRatio :: (+	Data.Array.IArray.Ix			timeslotId,+	Data.HumanResource.HumanResource	humanResource,+	Fractional				teachingRatio+ )+	=> Size.NTimeslots+	-> humanResource+	-> TimetableForWeek timeslotId resourceIds level+	-> teachingRatio+calculateUtilisationRatio nTimeslotsPerDay humanResource timetableForWeek+	| denominator == 0	= if numerator == 0+		then 1	-- CAVEAT: actually indeterminate.+		else error "WeekDaze.Model.TimetableForWeek.calculateUtilisationRatio:\tattempt to divide by zero (time-slots per week of teaching)."+	| otherwise		= fromIntegral numerator / fromIntegral denominator+	where+		numerator	= countWorkload timetableForWeek+		denominator	= Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay humanResource++-- | Replace any /lesson/-definition at the specified /time-coordinate/.+defineTimeslot+	:: Data.Array.IArray.Ix timeslotId+	=> (Temporal.Time.Time timeslotId, Model.Lesson.GeneralisedLesson resourceIds level)+	-> TimetableForWeek timeslotId resourceIds level+	-> TimetableForWeek timeslotId resourceIds level+defineTimeslot (time, maybeLesson) timetableForWeek	= timetableForWeek // [+	(+		day,+		Model.TimetableForDay.defineTimeslot (Temporal.Time.getTimeslotId time, maybeLesson) $ timetableForWeek ! day+	) -- Pair.+ ] where+	day	= Temporal.Time.getDay time++-- | Undefines any /lesson/ booked at each of the specified /time-coordinate/s.+undefineTimeslots+	:: (Data.Array.IArray.Ix timeslotId, Data.Foldable.Foldable foldable)+	=> TimetableForWeek timeslotId resourceIds level+	-> foldable (Temporal.Time.Time timeslotId)+	-> TimetableForWeek timeslotId resourceIds level+undefineTimeslots	= Data.Foldable.foldr $ defineTimeslot . flip (,) Nothing++{- |+	Measure the ratio, for each /day/ on which the observer, for whom this weekly /timetable/ was intended, is /available/,+	of those free (neither reserved for a /meeting/ nor booked with a /lesson/) /time-slot/s which comply with the specified preference,+	to the total number of free /time-slot/s,+-}+getFreePeriodCompliance :: (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Fractional		ratio+ )+	=> Temporal.FreePeriodPreference.FreePeriodPreference	-- ^ This observer's preferred position, within any /day/, of free /time-slot/s.+	-> Temporal.Time.TimesByDay timeslotId			-- ^ The /meeting/-times for the /group/s of which this observer is a member.+	-> resource						-- ^ The observer for whom this weekly /timetable/ was intended.+	-> TimetableForWeek timeslotId resourceIds level+	-> [ratio]						-- ^ The portion of those free /time-slot/s in each /day/, which meet the observer's preference.+getFreePeriodCompliance freePeriodPreference meetingTimesByDay resource timetableForWeek	= map (+	uncurry (+		Model.TimetableForDay.measureFreePeriodCompliance freePeriodPreference+	) . (+		Data.Maybe.fromMaybe Data.Set.empty . (`Data.Map.lookup` meetingTimesByDay) &&& (timetableForWeek !)+	)+ ) . Data.Set.elems . Temporal.Availability.deconstruct $ Data.Resource.getAvailability resource++{- |+	* A basic specification required to convert a /timetable/ to XHTML.++	* The first three parameters supply auxiliary information required for styling.+-}+type GenericTimetableToMarkup minimumContrastRatio timetable+	= Temporal.TimeAxes.TimeAxes Bool				-- ^ Whether to merge duplicate /lesson/s, between adjacent /day/s & also between consecutive /time-slot/s.+	-> Temporal.TimeAxes.TimeAxes Bool				-- ^ Whether to depict axis-labels.+	-> Temporal.Day.Weekend						-- ^ Define the /day/s which constitute the weekend.+	-> Maybe (+		Model.GenerateLessonColourFrom.GenerateLessonColourFrom,+		minimumContrastRatio+	)								-- ^ Whether to generate the colour of a /lesson/ from one of its attributes, or to delegate colouring to a CSS-file.+	-> timetable							-- ^ The /timetable/ to represent; which can be from any view, or merely a slice dedicated to one /observerId/.+	-> Text.XHtml.Strict.Html++-- | Enhance 'GenericTimetableToMarkup', with parameters for styling.+type GenericTimetableToMarkup' locationId minimumContrastRatio teacherId timeslotId timetable+	= Model.Meeting.MeetingsByTime timeslotId locationId teacherId+	-> GenericTimetableToMarkup minimumContrastRatio timetable++-- | Render in /XHTML/, as a /table/, with /day/s varying horizontally & /timeslotId/s varying vertically.+toXHtml :: forall level locationId minimumContrastRatio resource resourceIds synchronisationId teacherId timeslotId. (+	Data.Array.IArray.Ix	timeslotId,+	Data.Resource.Resource	resource,+	Eq			level,+	Eq			resourceIds,+	Fractional		minimumContrastRatio,+	Ord			minimumContrastRatio,+#if !MIN_VERSION_containers(0,5,2)+	Ord			locationId,+	Ord			teacherId,+#endif+	Show			level,+	Show			resourceIds,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	resourceIds,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> (Model.Lesson.Lesson resourceIds level -> Data.Course.Course synchronisationId level timeslotId)	-- ^ Find the /course/ to which the specified /lesson/ belongs.+	-> resource												-- ^ The /resource/ by whom the /timetable/ was designed to be viewed.+	-> GenericTimetableToMarkup' locationId minimumContrastRatio teacherId timeslotId (TimetableForWeek timeslotId resourceIds level)+toXHtml findCourseFor resource meetingsByTime mergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom timetableForWeek = (+	Text.XHtml.Strict.table Text.XHtml.Strict.! [+		Text.XHtml.Strict.theclass tag,+		Text.XHtml.Strict.title "Timetable for Week"+	] <<+ ) . (+	if Temporal.TimeAxes.getByDay displayAxisLabels+		then (+			Text.XHtml.Strict.tr << (+				if Temporal.TimeAxes.getByTimeslotId displayAxisLabels+					then (+						(+							Text.XHtml.Strict.th Text.XHtml.Strict.! [Text.XHtml.Strict.theclass originCSSIdentifier]	-- Make this behave as a table-header element; for CSS width & height settings.+						) << Text.XHtml.Strict.noHtml :+					) -- Section.+					else id+			) (+				map (+					\day -> (+						Text.XHtml.Strict.th Text.XHtml.Strict.! if Data.Set.member day weekend+							then [+								Text.XHtml.Strict.theclass weekendCSSIdentifier,+								Text.XHtml.Strict.title weekendCSSIdentifier+							]+							else [+								Text.XHtml.Strict.theclass workdayCSSIdentifier,+								Text.XHtml.Strict.title "Work-day"+							]+					) << day+				) Temporal.Day.range+			) :+		) -- Section.+		else id+ ) . map (+	(Text.XHtml.Strict.tr <<) . (+		if Temporal.TimeAxes.getByDay mergeDuplicateTimeslots+			then map (+				uncurry (Text.XHtml.Strict.!) . (head &&& return {-to List-monad-} . Text.XHtml.Strict.colspan . length)+			) . Data.List.groupBy (ToolShed.Data.List.equalityBy show)	-- 'Text.XHtml.Strict.Html' doesn't implement Eq ?!+			else id+	)+ ) . Data.List.transpose . (+	if Temporal.TimeAxes.getByTimeslotId displayAxisLabels+		then (+			map (+				Text.XHtml.Strict.th <<+			) (+				Data.Array.IArray.indices $ timetableForWeek ! minBound {-arbitrarily-}+			) :+		) -- Section.+		else id+ ) . map (+	\(day, timetableForDay) -> let+		isAvailable :: Bool+		isAvailable	= Data.Resource.isAvailableOn day resource++		toXHtmlLesson :: Size.NTimeslots -> timeslotId -> Model.Lesson.GeneralisedLesson resourceIds level -> Text.XHtml.Strict.Html+		toXHtmlLesson rowspan timeslotId	= Data.Maybe.maybe (+			if isAvailable+				then Data.Maybe.maybe (+					Text.XHtml.Strict.td Text.XHtml.Strict.! [+						Text.XHtml.Strict.rowspan rowspan,+						Text.XHtml.Strict.theclass unallocatedTimeslotCSSIdentifier,+						Text.XHtml.Strict.title "Not booked for teaching, but possibly kept free for another activity."+					] << "Unallocated"+				) (+					(+						(+							Text.XHtml.Strict.td Text.XHtml.Strict.! [+								Text.XHtml.Strict.rowspan rowspan,+								Text.XHtml.Strict.theclass meetingsCSSIdentifier,+								Text.XHtml.Strict.title meetingsCSSIdentifier+							]+						) <<+					) . Data.List.intersperse Text.XHtml.Strict.hr . map Text.XHtml.Strict.toHtml . Data.Set.toList+				) $ Data.Map.lookup (Temporal.Time.mkTime day timeslotId) meetingsByTime+				else Text.XHtml.Strict.td Text.XHtml.Strict.! [+					Text.XHtml.Strict.rowspan rowspan,+					Text.XHtml.Strict.theclass unavailableCSSIdentifier,+					Text.XHtml.Strict.title "Not scheduled to be available today."+				] << "N/A"+		 ) $ \lesson -> Text.XHtml.Strict.td Text.XHtml.Strict.! (Text.XHtml.Strict.rowspan rowspan :) (+			Data.Maybe.maybe [+				Text.XHtml.Strict.theclass . Text.CSS.mkIdentifier . (+					(Data.Subject.topicTag ++ "_") ++	-- Avoid clash between arbitrary topic & other CSS-identifiers.+				) . Data.Subject.getTopic $ Model.Lesson.getSubject lesson+			] (+				\(dataSource, minimumContrastRatio)	-> (+					\s -> let+						htmlColourCode, complementaryHTMLColourCode :: Colour.HTMLColourCode.HTMLColourCode+						htmlColourCode			= Colour.HTMLColourCode.generateHTMLColourCodeFrom s+						complementaryHTMLColourCode	= Colour.HTMLColourCode.deriveComplementaryHTMLColourCode htmlColourCode+						(red, green, blue)		= Colour.RGB.toTriple . (+							Colour.RGB.toRGBUnitInterval	:: Colour.RGB.RGB Int -> Colour.RGB.RGB Rational+						 ) $ Colour.HTMLColour.htmlColourCodeToRGB htmlColourCode `Colour.RGB.absDifference` Colour.HTMLColour.htmlColourCodeToRGB complementaryHTMLColourCode+					in if Factory.Math.Statistics.getMean [red, green, blue] < minimumContrastRatio+						then []	-- Insufficient contrast.+						else [+							Text.XHtml.Strict.thestyle $ "color: " ++ htmlColourCode ++ "; background-color: " ++ complementaryHTMLColourCode+						]+				) $ case dataSource of+					Model.GenerateLessonColourFrom.Lesson		-> show lesson+					Model.GenerateLessonColourFrom.Subject		-> show $ Model.Lesson.getSubject lesson+					Model.GenerateLessonColourFrom.Topic		-> Data.Subject.getTopic $ Model.Lesson.getSubject lesson+					Model.GenerateLessonColourFrom.Level		-> show . Data.Subject.getLevel $ Model.Lesson.getSubject lesson+					Model.GenerateLessonColourFrom.ResourceIds	-> show $ Model.Lesson.getResourceIds lesson+			) maybeGenerateLessonColourFrom+		 ) << (+			Data.Maybe.maybe Text.XHtml.Strict.noHtml Text.XHtml.Strict.toHtml (+				Data.Course.getMaybeSynchronisationId $ findCourseFor lesson+			) +++ lesson+		 )+	in (+		if Temporal.TimeAxes.getByTimeslotId mergeDuplicateTimeslots+			then concatMap (+				\equalsByGeneralisedLesson -> let+					nDuplicates	= length equalsByGeneralisedLesson+				in uncurry (toXHtmlLesson nDuplicates {-partially apply-}) (+					head equalsByGeneralisedLesson+				) : replicate (pred nDuplicates) Text.XHtml.Strict.noHtml -- CAVEAT: bodge to prevent the column beneath rising.+			) . Data.List.groupBy (+				if isAvailable+					then ToolShed.Data.List.equalityBy (+						Control.Arrow.first {-timeslotId-} $ (+							Data.Set.map Model.Meeting.getGroupId `fmap`	-- Equality by the list of groups which is meeting.+						) . (+							`Data.Map.lookup` meetingsByTime+						) . Temporal.Time.mkTime day+					)+					else ToolShed.Data.List.equalityBy Model.TimetableForDay.getMaybeLesson	-- Which should be consistently undefined.+			)+			else map (uncurry $ toXHtmlLesson 1 {-partially apply-})+	) $ Data.Array.IArray.assocs timetableForDay+ ) $ Data.Array.IArray.assocs timetableForWeek++-- | Extracts the /lesson/s from the specified /timetable/, discarding the /booking-time/.+extractLessons :: Data.Array.IArray.Ix timeslotId => TimetableForWeek timeslotId resourceIds level -> [Model.Lesson.Lesson resourceIds level]+-- extractLessons	= Data.Foldable.concatMap (Data.Maybe.catMaybes . Data.Array.IArray.elems)	-- CAVEAT: too slow.+extractLessons timetableForWeek	= [+	lesson |+		timetableForDay	<- Data.Array.IArray.elems timetableForWeek,+		Just lesson	<- Data.Array.IArray.elems timetableForDay+ ] -- List-comprehension.++-- | Extract the list of all /time/s in the specified /timetable/, regardless of whether a /lesson/ has been booked there.+extractTimes :: Data.Array.IArray.Ix timeslotId => TimetableForWeek timeslotId resourceIds level -> [Temporal.Time.Time timeslotId]+extractTimes timetableForWeek	= [+	Temporal.Time.mkTime day timeslotId |+		(day, timetableForDay)	<- Data.Array.IArray.assocs timetableForWeek,+		timeslotId		<- Data.Array.IArray.indices timetableForDay	-- In practice, these are consistent throughout the week.+ ] -- List-comprehension.++{- |+	* Finds the /coordinate/s of all unallocated /time/s, when the specified /resource/ is /available/.++	* CAVEAT: doesn't account for /time/s reserved for /meeting/s.+-}+locateUnallocatedAvailableTimes+	:: (Data.Array.IArray.Ix timeslotId, Data.Resource.Resource resource)+	=> resource	-- ^ Used to determine /availability/.+	-> TimetableForWeek timeslotId resourceIds level+	-> [Temporal.Time.Time timeslotId]+locateUnallocatedAvailableTimes resource timetableForWeek	= [+	Temporal.Time.mkTime day unallocatedAvailableTimeslotId |+		(day, timetableForDay)		<- Data.Array.IArray.assocs timetableForWeek,+		Data.Resource.isAvailableOn day resource,+		unallocatedAvailableTimeslotId	<- Model.TimetableForDay.locateUnallocatedTimeslots timetableForDay+ ] -- List-comprehension.++{- |+	* Counts the total number of unallocated /time-slot/s, discounting those when the /observer/ is unavailable.++	* CAVEAT: this function takes no account of the possibility that when the /observer/ represents a /student-body/,+	some /time-slots/ may be allocated for unsupervised study,+	& the remainder must be multiplied by the number of members in the /student-body/.+-}+countUnallocatedAvailableTimeslots+	:: (Data.Array.IArray.Ix timeslotId, Data.Resource.Resource resource)+	=> resource+	-> TimetableForWeek timeslotId resourceIds level+	-> Size.NTimeslots+countUnallocatedAvailableTimeslots resource	= length . locateUnallocatedAvailableTimes resource++-- | Defines a pickler to convert the specified /timetable/ to, or from, XML.+xpickle :: (+	Data.Array.IArray.Ix	timeslotId,+	HXT.XmlPickler		level,+	HXT.XmlPickler		resourceIds,+	HXT.XmlPickler		timeslotId,+	Show			level+ ) => HXT.PU (TimetableForWeek timeslotId resourceIds level)+xpickle	= HXT.xpElem tag . HXT.xpWrap (+	Data.Array.IArray.array (minBound, maxBound),	-- Construct from an association-list.+	Data.Array.IArray.assocs				-- Deconstruct to an association-list.+ ) . HXT.xpList1 {-can't be null-} . HXT.xpElem dayToTimetableAssociationTag $ HXT.xpPair HXT.xpickle {-day-} Model.TimetableForDay.xpickle++-- | A /lesson/ qualified by the /time/ at which it is booked.+type Booking timeslotId resourceIds level	= (Temporal.Time.Time timeslotId, Model.Lesson.Lesson resourceIds level)++-- | Accessor.+getBookedTime :: Booking timeslotId resourceIds level -> Temporal.Time.Time timeslotId+getBookedTime	= fst++-- | Accessor.+getBookedLesson :: Booking timeslotId resourceIds level -> Model.Lesson.Lesson resourceIds level+getBookedLesson	= snd++-- | True if a /booking/ already exists in the /timetable/ which matches the specified /predicate/.+hasMatchingLessonAt+	:: Data.Array.IArray.Ix timeslotId+	=> (Model.Lesson.Lesson resourceIds level -> Bool)	-- ^ Determines the suitability of any /lesson/ at the specified /time/.+	-> Temporal.Time.Time timeslotId			-- ^ The /time/ at which to look for a /lesson/.+	-> TimetableForWeek timeslotId resourceIds level+	-> Bool+hasMatchingLessonAt lessonPredicate time	= Data.Maybe.maybe False {-there isn't a lesson, so there can't be a match-} lessonPredicate . getMaybeLesson time++-- | True if the specified /booking/ already exists in the /timetable/.+isBookedWith :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Eq			resourceIds+ )+	=> Booking timeslotId resourceIds level	-- ^ The /time/ & /lesson/ to match.+	-> TimetableForWeek timeslotId resourceIds level+	-> Bool+isBookedWith booking	= hasMatchingLessonAt (== getBookedLesson booking) (getBookedTime booking)++-- | Constructor. Create an unallocated /timetable/, for a whole week.+mkFreeTimetableForWeek :: (Data.Array.IArray.Ix timeslotId, Enum timeslotId) => Factory.Data.Interval.Interval timeslotId -> TimetableForWeek timeslotId resourceIds level+mkFreeTimetableForWeek	= Data.Array.IArray.array (minBound, maxBound) . zip [minBound .. maxBound] . repeat . Model.TimetableForDay.mkFreeTimetableForDay++-- | A runlength-encoded list of generalised (i.e. potentially undefined) /lesson/s, indexed by the /day/ & then /timeslotId/, at which each runlength begins.+type GeneralisedLessonRunlengthByTimeslotIdByDay timeslotId resourceIds level	= Data.Array.IArray.Array Temporal.Day.Day (Model.TimetableForDay.GeneralisedLessonRunlengthByTimeslotId timeslotId resourceIds level)++-- | Finds consecutive equal generalised (i.e. potentially undefined) /lesson/s, & the run-length of each sequence, indexed by /day/ & then /timeslotId/.+findGeneralisedLessonRunlengthsByTimeslotIdByDay :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			resourceIds,+	Eq			level+ ) => TimetableForWeek timeslotId resourceIds level -> GeneralisedLessonRunlengthByTimeslotIdByDay timeslotId resourceIds level+findGeneralisedLessonRunlengthsByTimeslotIdByDay	= Data.Array.IArray.amap Model.TimetableForDay.findGeneralisedLessonRunlengthsByTimeslotId++-- | Finds separated equal /lesson/s, within the /timetable/ for any single /day/.+findSeparatedEqualLessonsWithinAnyDay :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			resourceIds,+	Ord			level+ ) => TimetableForWeek timeslotId resourceIds level -> Model.TimetableForDay.LessonRunlengths resourceIds level+findSeparatedEqualLessonsWithinAnyDay	= Data.Foldable.concatMap Model.TimetableForDay.findSeparatedEqualLessons++-- | Finds separated /lesson/s of equal /subject/, within the /timetable/ for any single /day/.+findSeparatedEqualSubjectLessonsWithinAnyDay :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			resourceIds,+	Ord			level+ ) => TimetableForWeek timeslotId resourceIds level -> Model.TimetableForDay.LessonRunlengths resourceIds level+findSeparatedEqualSubjectLessonsWithinAnyDay	= Data.Foldable.concatMap Model.TimetableForDay.findSeparatedEqualSubjectLessons++-- | A runlength-encoded list of generalised (i.e. potentially undefined) /lesson/s, indexed by the /day/ & then /timeslotId/, at which each runlength begins.+type RunlengthsByTimeslotIdByLessonByDay resourceIds level timeslotId	= Data.Array.IArray.Array Temporal.Day.Day (Model.TimetableForDay.RunlengthsByTimeslotIdByLesson resourceIds level timeslotId)++{- |+	* Finds runlengths of separated equal /lesson/s, within the /timetable/ for any single /day/; separated unallocated /time-slot/s don't qualify.++	* Returns an array indexed by /day/, of lists associated by common /lesson/, of lists associated by starting /timeslotId/, of runlengths.+-}+findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDay :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			resourceIds,+	Ord			level+ ) => TimetableForWeek timeslotId resourceIds level -> RunlengthsByTimeslotIdByLessonByDay resourceIds level timeslotId+findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDay	= Data.Array.IArray.amap Model.TimetableForDay.findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLesson++{- |+	'True' if all the /time/s specified by a /course/, are currently unbooked,+	& the /resource/ is regularly /available/ on each requested /day/.+-}+areAllSpecifiedTimesBookable+	:: (Data.Resource.Resource resource, Data.Array.IArray.Ix timeslotId)+	=> resource+	-> TimetableForWeek timeslotId resourceIds level		-- ^ The /timetable/ whose bookings to inspect.+	-> Data.Course.Course synchronisationId level timeslotId	-- ^ The /course/ whose specified /time/s, to query.+	-> Bool+areAllSpecifiedTimesBookable resource timetableForWeek	= Data.Foldable.all (+	uncurry (&&) . (+		not . (`isDefinedTimeslot` timetableForWeek) &&& (`Data.Resource.isAvailableOn` resource) . Temporal.Time.getDay+	)+ ) . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest++-- | True if the specified /lesson/ is booked an an adjacent /day/.+isBookedOnAdjacentDay :: (+#if !MIN_VERSION_array(0,5,2)+	Data.Array.IArray.Ix	timeslotId,+#endif /* CAVEAT: constraint unnecessary from "Data.Array.IArray-0.5.1.1" */+	Eq			level,+	Eq			resourceIds+ )+	=> TimetableForWeek timeslotId resourceIds level	-- ^ The /timetable/ whose bookings to inspect.+	-> Model.Lesson.Lesson resourceIds level		-- ^ The /lesson/ to match.+	-> Temporal.Day.Day					-- ^ Today.+	-> Bool+isBookedOnAdjacentDay timetableForWeek lesson	= uncurry (||) . ToolShed.Data.Pair.mirror (+	Data.Foldable.elem (Just lesson) . (timetableForWeek !)+ ) . Temporal.Day.getAdjacentDays++{- |+	* True if the /course/ requires only a trivial /minimumConsecutiveLessons/,+	or the referenced /lesson/ is at either end of a runlength which exceeds /minimumConsecutiveLessons/.++	* If True, then /minimumConsecutiveLessons/ doesn't preclude the referenced /lesson/ from being unbooked; though there may be other reasons why it shouldn't.++	* CAVEAT: if @ minimumConsecutiveLessons==1 @, but a runlength of three or more have been booked, then unbooking the middle one will result in a split session.+-}+isRunlengthReducibleAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			resourceIds+ )+	=> TimetableForWeek timeslotId resourceIds level	-- ^ The /timetable/ whose bookings to inspect.+	-> Temporal.Time.Time timeslotId+	-> Data.Course.Course synchronisationId level timeslotId+	-> Bool+isRunlengthReducibleAt timetableForWeek time course+	| minimumConsecutiveLessons == 1	= True+	| otherwise				= uncurry (&&) . (+		uncurry (||) . ToolShed.Data.Pair.mirror (+			== timeslotId	-- Check that this timeslot terminates the runlength; rather than splits it.+		) *** (+			> minimumConsecutiveLessons	-- Check that the runlength is excessive.+		)+	) . Model.TimetableForDay.measureRunlengthAt timeslotId {-which returns a pair-} . (+		timetableForWeek !	-- Lookup the timetableForDay.+	) $ Temporal.Time.getDay time+	where+		timeslotId			= Temporal.Time.getTimeslotId time+		minimumConsecutiveLessons	= Data.Course.getMinimumConsecutiveLessons course+
+ src-lib/WeekDaze/Model/Traverse.hs view
@@ -0,0 +1,108 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Provides the sequence of coordinates, required to traverse the conceptually /3-D/-/timetable/, in the required order.++	* Defines the type of an unspecified function, which can be folded over these coordinates, to sequentially receive any /lesson/-definitions from the /timetable/.+-}++module WeekDaze.Model.Traverse(+-- * Functions+	generateRasterCoordinates+) where++import			Control.Arrow((&&&))+import qualified	Data.Array.IArray+import			Data.Array.IArray((!))+import qualified	Data.Maybe+import qualified	WeekDaze.Model.TimetableAxis		as Model.TimetableAxis+import qualified	WeekDaze.Model.TimetableAxisTraversal	as Model.TimetableAxisTraversal+import qualified	WeekDaze.Model.TimetableAxisTriple	as Model.TimetableAxisTriple+import qualified	WeekDaze.Model.TimetableCoordinates	as Model.TimetableCoordinates+import qualified	WeekDaze.Temporal.Day			as Temporal.Day+import qualified	WeekDaze.Temporal.Time			as Temporal.Time++{- |+	* Generate the 'Model.TimetableCoordinates.Vector' defining a raster-scan through the /time-slot/'s in a /timetable/.++	* The first axis specified, changes the least frequently during the raster-scan,+	& the last specified, changes the most frequently.+-}+generateRasterCoordinates :: forall observerId timeslotId.+	Model.TimetableAxisTriple.Axes	-- ^ Defines the order & sense, in which the axes of a /timetable/ are traversed.+	-> [observerId]				-- ^ Defines the keys into the outer /map/ of a /timetable/.+	-> [timeslotId]				-- ^ Defines the keys in the enclosed /array/.+	-> Model.TimetableCoordinates.Vector observerId timeslotId+generateRasterCoordinates timetableAxes observerIds timeslotIdRange+	| Model.TimetableAxisTriple.hasWildSense timetableAxes	= error $ "WeekDaze.Model.Traverse.generateRasterCoordinates:\twild sense-specification received; " ++ show timetableAxes+	| otherwise						= case (axisX, axisY, axisZ) of+		(Model.TimetableAxis.ObserverId, Model.TimetableAxis.Day, Model.TimetableAxis.TimeslotId)	-> [+			(observerId, Temporal.Time.mkTime day timeslotId) |+				observerId	<- observerIdsBySense ! senseX,+				day		<- dayRangeBySense ! senseY,+				timeslotId	<- timeslotIdRangeBySense ! senseZ+		 ] -- List-comprehension.+		(Model.TimetableAxis.ObserverId, Model.TimetableAxis.TimeslotId, Model.TimetableAxis.Day)	-> [+			(observerId, Temporal.Time.mkTime day timeslotId) |+				observerId	<- observerIdsBySense ! senseX,+				timeslotId	<- timeslotIdRangeBySense ! senseY,+				day		<- dayRangeBySense ! senseZ+		 ] -- List-comprehension.+		(Model.TimetableAxis.Day, Model.TimetableAxis.ObserverId, Model.TimetableAxis.TimeslotId)	-> [+			(observerId, Temporal.Time.mkTime day timeslotId) |+				day		<- dayRangeBySense ! senseX,+				observerId	<- observerIdsBySense ! senseY,+				timeslotId	<- timeslotIdRangeBySense ! senseZ+		 ] -- List-comprehension.+		(Model.TimetableAxis.Day, Model.TimetableAxis.TimeslotId, Model.TimetableAxis.ObserverId)	-> [+			(observerId, Temporal.Time.mkTime day timeslotId) |+				day		<- dayRangeBySense ! senseX,+				timeslotId	<- timeslotIdRangeBySense ! senseY,+				observerId	<- observerIdsBySense ! senseZ+		 ] -- List-comprehension.+		(Model.TimetableAxis.TimeslotId, Model.TimetableAxis.ObserverId, Model.TimetableAxis.Day)	-> [+			(observerId, Temporal.Time.mkTime day timeslotId) |+				timeslotId	<- timeslotIdRangeBySense ! senseX,+				observerId	<- observerIdsBySense ! senseY,+				day		<- dayRangeBySense ! senseZ+		 ] -- List-comprehension.+		(Model.TimetableAxis.TimeslotId, Model.TimetableAxis.Day, Model.TimetableAxis.ObserverId)	-> [+			(observerId, Temporal.Time.mkTime day timeslotId) |+				timeslotId	<- timeslotIdRangeBySense ! senseX,+				day		<- dayRangeBySense ! senseY,+				observerId	<- observerIdsBySense ! senseZ+		 ] -- List-comprehension.+		_	-> error $ "WeekDaze.Model.Traverse.generateRasterCoordinates:\tunsupported axis-order; " ++ show timetableAxes ++ "."+	where+		[(senseX, axisX), (senseY, axisY), (senseZ, axisZ)]	= map (Data.Maybe.fromJust . Model.TimetableAxisTraversal.getMaybeSense &&& Model.TimetableAxisTraversal.getAxis) $ Model.TimetableAxisTriple.toList timetableAxes++		observerIdsBySense :: Data.Array.IArray.Array Model.TimetableAxisTraversal.Sense [observerId]+		observerIdsBySense	= Data.Array.IArray.array (minBound, maxBound) $ zip [minBound .. maxBound] [reverse observerIds, observerIds]++		dayRangeBySense	:: Data.Array.IArray.Array Model.TimetableAxisTraversal.Sense [Temporal.Day.Day]+		dayRangeBySense		= Data.Array.IArray.array (minBound, maxBound) $ zip [minBound .. maxBound] [reverse Temporal.Day.range, Temporal.Day.range]++		timeslotIdRangeBySense :: Data.Array.IArray.Array Model.TimetableAxisTraversal.Sense [timeslotId]+		timeslotIdRangeBySense	= Data.Array.IArray.array (minBound, maxBound) $ zip [minBound .. maxBound] [reverse timeslotIdRange, timeslotIdRange]+
+ src-lib/WeekDaze/OutputConfiguration/FileFormat.hs view
@@ -0,0 +1,103 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the format of a file.+-}++module WeekDaze.OutputConfiguration.FileFormat(+-- * Types+-- ** Data-types+	FileFormat(+--		MkFileFormat,+		getFilePath,+		getFormat+	),+-- * Constants+	stdoutProxy,+--	tag,+--	filePathTag,+-- * Functions+-- ** Constructor+	mkFileFormat+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.OutputConfiguration.Format	as OutputConfiguration.Format++-- | A special file-name interpreted as a request for /stdout/.+stdoutProxy :: String+stdoutProxy	= "-"++-- | Used to qualify XML.+tag :: String+tag		= "fileFormat"++-- | Used to qualify XML.+filePathTag :: String+filePathTag	= "filePath"++-- | The format associated with a specified file-path.+data FileFormat minimumContrastRatio	= MkFileFormat {+	getFilePath	:: System.FilePath.FilePath,	-- ^ The special file-path 'stdoutProxy', will be interpreted as /stdout/.+	getFormat	:: OutputConfiguration.Format.Format minimumContrastRatio+} deriving (Eq, Show)++instance Show minimumContrastRatio => ToolShed.SelfValidate.SelfValidator (FileFormat minimumContrastRatio) where+	getErrors fileFormat	= ToolShed.SelfValidate.extractErrors [+		(+			not . System.FilePath.isValid $ getFilePath fileFormat,+			"invalid file-path; " ++ show fileFormat+		)+	 ]++instance Data.Default.Default (FileFormat minimumContrastRatio) where+	def	= MkFileFormat stdoutProxy Data.Default.def++-- | Smart constructor.+mkFileFormat+	:: Show minimumContrastRatio+	=> System.FilePath.FilePath					-- ^ A path to a file, into which the unprocessed configuration, formatted as XML, should be written.+	-> OutputConfiguration.Format.Format minimumContrastRatio	-- ^ The number of decimal digits with which to log the value of /lesson-criteria/ & /timetable-criteria/.+	-> FileFormat minimumContrastRatio+mkFileFormat filePath format+	| ToolShed.SelfValidate.isValid fileFormat	= fileFormat+	| otherwise					= error $ "WeekDaze.OutputConfiguration.FileFormat.mkFileFormat:\t" ++ ToolShed.SelfValidate.getFirstError fileFormat ++ "."+	where+		fileFormat	= MkFileFormat filePath format++instance (+	Fractional	minimumContrastRatio,+	HXT.XmlPickler	minimumContrastRatio,+	Ord		minimumContrastRatio,+	Show		minimumContrastRatio+ ) => HXT.XmlPickler (FileFormat minimumContrastRatio) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry mkFileFormat,		-- Construct from a Pair.+		getFilePath &&& getFormat	-- Deconstruct to a Pair.+	 ) $ HXT.xpTextAttr filePathTag `HXT.xpPair` HXT.xpickle {-Format-}++instance Control.DeepSeq.NFData	minimumContrastRatio => Control.DeepSeq.NFData (FileFormat minimumContrastRatio) where+	rnf	= Control.DeepSeq.rnf . (getFilePath &&& getFormat)
+ src-lib/WeekDaze/OutputConfiguration/Format.hs view
@@ -0,0 +1,82 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the possible output-formats available.+-}++module WeekDaze.OutputConfiguration.Format(+-- * Types+-- ** Data-types+	Format(..),+-- * Constants+--	xhtmlTag,+--	xmlTag,+-- * Functions+-- ** Accessors+	getMaybeStyle+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	WeekDaze.OutputConfiguration.Style	as OutputConfiguration.Style+import qualified	WeekDaze.OutputConfiguration.View	as OutputConfiguration.View++-- | Used to qualify XML.+xhtmlTag :: String+xhtmlTag	= "xhtml"++-- | Used to qualify XML.+xmlTag :: String+xmlTag		= "xml"++-- | Defines the alternative output-formats of the /timetable/.+data Format minimumContrastRatio+	= XHTML (OutputConfiguration.Style.Style minimumContrastRatio)+	| XML OutputConfiguration.View.View+	deriving (Eq, Show)++instance Data.Default.Default (Format minimumContrastRatio) where+	def	= XHTML Data.Default.def++instance (+	Fractional	minimumContrastRatio,+	HXT.XmlPickler	minimumContrastRatio,+	Ord		minimumContrastRatio+ ) => HXT.XmlPickler (Format minimumContrastRatio) where+	xpickle	= HXT.xpDefault Data.Default.def $ HXT.xpAlt (+		\format -> case format of+			XHTML _	-> 0+			XML _	-> 1+	 ) [+		HXT.xpElem xhtmlTag $ HXT.xpWrap (XHTML, \(XHTML style) -> style) HXT.xpickle {-Style-},+		HXT.xpElem xmlTag . HXT.xpWrap (XML, \(XML view) -> view) $ HXT.xpDefault Data.Default.def HXT.xpickle {-View-}+	 ]++instance Control.DeepSeq.NFData	minimumContrastRatio => Control.DeepSeq.NFData (Format minimumContrastRatio) where+	rnf (XHTML style)	= Control.DeepSeq.rnf style+	rnf (XML view)		= Control.DeepSeq.rnf view++-- | Accessor.+getMaybeStyle :: Format minimumContrastRatio -> Maybe (OutputConfiguration.Style.Style minimumContrastRatio)+getMaybeStyle (XHTML style)	= Just style+getMaybeStyle _			= Nothing+
+ src-lib/WeekDaze/OutputConfiguration/Options.hs view
@@ -0,0 +1,221 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines options related to program-output.+-}++module WeekDaze.OutputConfiguration.Options(+-- * Types+-- ** Type-synonyms+	NDecimalDigits,+-- ** Data-types+	Options(+--		MkOptions,+		getFileFormats,+		getMaybeOutputConfigFilePath,+		getNDecimalDigits,+		getStudentBodyMnemonicSeparator,+		getVerbosity+	),+-- * Constants+--	tag,+--	fileFormatsTag,+	nDecimalDigitsTag,+	outputConfigFilePathTag,+--	studentBodyMnemonicSeparatorTag,+-- * Functions+-- ** Constructor+	mkOptions+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.List.Extra+import qualified	Data.Maybe+import qualified	Distribution.Verbosity+import qualified	System.FilePath+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.OutputConfiguration.FileFormat	as OutputConfiguration.FileFormat++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	WeekDaze.Database.Selector		as Database.Selector+import qualified	WeekDaze.OutputConfiguration.Format	as OutputConfiguration.Format+import qualified	WeekDaze.OutputConfiguration.Verbosity	as OutputConfiguration.Verbosity++instance (Fractional minimumContrastRatio, Show minimumContrastRatio) => Database.Selector.Selector (Options minimumContrastRatio) where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= Database.Selector.tablePrefix ++ tag+	 in do+		optionsRows	<- Database.Selector.select connection [+			nDecimalDigitsTag,+			studentBodyMnemonicSeparatorTag,+			OutputConfiguration.Verbosity.tag+		 ] [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		let+			options'	= case optionsRows of+				[]		-> Data.Default.def+				[optionsRow]	-> case optionsRow of+					[nDecimalDigitsSql, mnemonicSeparatorSql, verbositySql]	-> (+						\options -> Data.Maybe.maybe options (+							\s -> options { getStudentBodyMnemonicSeparator = s }+						) $ Database.HDBC.fromSql mnemonicSeparatorSql+					 ) $ Data.Default.def {+						getNDecimalDigits	= either (+							error . showString "WeekDaze.OutputConfiguration.Options.fromDatabase:\tfailed to parse the value for " . shows nDecimalDigitsTag . showString " read from the database; " . show+						) id $ Database.HDBC.safeFromSql nDecimalDigitsSql,+						getVerbosity		= Database.HDBC.fromSql verbositySql+					}+					_							-> error $ "WeekDaze.OutputConfiguration.Options.fromDatabase:\tunexpected number of columns=" ++ show (length optionsRow) ++ " in row of table " ++ show tableName ++ "."+				_		-> error $ "WeekDaze.OutputConfiguration.Options.fromDatabase:\tunexpected number of rows=" ++ show (length optionsRows) ++ " selected from table " ++ show tableName ++ "."++		style	<- Database.Selector.fromDatabase connection projectIdSql++		return {-to IO-monad-} options' {+			getFileFormats	= [OutputConfiguration.FileFormat.mkFileFormat OutputConfiguration.FileFormat.stdoutProxy {-CAVEAT: hard-coded-} $ OutputConfiguration.Format.XHTML style]+		}+#else+import			WeekDaze.OutputConfiguration.Verbosity()+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag				= "outputOptions"++-- | Used to qualify XML.+fileFormatsTag :: String+fileFormatsTag			= "fileFormats"++-- | Used to qualify SQL & XML.+nDecimalDigitsTag :: String+nDecimalDigitsTag		= "nDecimalDigits"++-- | Used to qualify XML.+outputConfigFilePathTag :: String+outputConfigFilePathTag		= "outputConfigFilePath"++-- | Used to qualify SQL & XML.+studentBodyMnemonicSeparatorTag :: String+studentBodyMnemonicSeparatorTag	= "studentBodyMnemonicSeparator"++-- | A number of decimals digits.+type NDecimalDigits		= Int++-- | Defines the set of output-options.+data Options minimumContrastRatio = MkOptions {+	getFileFormats			:: [OutputConfiguration.FileFormat.FileFormat minimumContrastRatio],	-- ^ Defines the formats of the required output-files.+	getMaybeOutputConfigFilePath	:: Maybe System.FilePath.FilePath,					-- ^ Optional path to a file, into which the unprocessed configuration, formatted as XML, should be written (obliterating any existing file-contents).+	getNDecimalDigits		:: NDecimalDigits,							-- ^ The precision to which fractional auxiliary data is displayed.+	getStudentBodyMnemonicSeparator	:: Aggregate.StudentClass.MnemonicSeparator,				-- ^ The separator used when merging the mnemonics of /student-bodies/.+	getVerbosity			:: Distribution.Verbosity.Verbosity					-- ^ Set the threshold for ancillary information-output.+} deriving (Eq, Show)++instance Show minimumContrastRatio => ToolShed.SelfValidate.SelfValidator (Options minimumContrastRatio) where+	getErrors MkOptions {+		getFileFormats			= fileFormats,+		getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath,+		getNDecimalDigits		= nDecimalDigits+	} = ToolShed.SelfValidate.extractErrors [+		let+--			incompatibleFileFormats :: [[OutputConfiguration.FileFormat.FileFormat minimumContrastRatio]]+			incompatibleFileFormats	= filter ((/= 1) . length) $ Data.List.Extra.groupSortOn OutputConfiguration.FileFormat.getFilePath fileFormats+		in (+			not $ null incompatibleFileFormats,+			"duplicate file-paths; " ++ show incompatibleFileFormats+		), (+			Data.Maybe.maybe False (not . System.FilePath.isValid {-i.e. non-null on POSIX-}) maybeOutputConfigFilePath,+			"invalid path to output config-file; " ++ show (Data.Maybe.fromJust maybeOutputConfigFilePath)+		), (+			nDecimalDigits < 1,+			show nDecimalDigitsTag ++ "=" ++ show nDecimalDigits ++ ", must exceed zero"+		),+		let+			maxNDecimalDigits	= floor $ fromIntegral (+				floatDigits (+					undefined :: Double	-- CAVEAT: the actual type could be merely 'Float', but that's currently unknown.+				)+			 ) * (logBase 10 2 :: Double)+		in (+			nDecimalDigits > maxNDecimalDigits,+			nDecimalDigitsTag ++ "=" ++ show nDecimalDigits ++ ", shouldn't exceed " ++ show maxNDecimalDigits+		)+	 ]++instance Data.Default.Default (Options minimumContrastRatio) where+	def = MkOptions {+		getFileFormats			= [Data.Default.def],+		getMaybeOutputConfigFilePath	= Nothing,+		getNDecimalDigits		= 3,+		getStudentBodyMnemonicSeparator	= " / ",+		getVerbosity			= Data.Default.def+	}++instance Control.DeepSeq.NFData minimumContrastRatio => Control.DeepSeq.NFData (Options minimumContrastRatio) where+	rnf (MkOptions x0 x1 x2 x3 x4)	= Control.DeepSeq.rnf (x0, x1, x2, x3, x4)++-- | Smart constructor.+mkOptions+	:: Show minimumContrastRatio+	=> [OutputConfiguration.FileFormat.FileFormat minimumContrastRatio]	-- ^ The formats in which to file the results.+	-> Maybe System.FilePath.FilePath					-- ^ An optional path to a file, into which the unprocessed configuration, formatted as XML, should be written.+	-> NDecimalDigits							-- ^ The number of decimal digits with which to log the value of /lesson-criteria/ & /timetable-criteria/.+	-> Aggregate.StudentClass.MnemonicSeparator				-- ^ The separator to use when /student-bodies/ with identical profiles have been merged automatically during runtime.+	-> Distribution.Verbosity.Verbosity					-- ^ The amount of auxiliary data to log.+	-> Options minimumContrastRatio+mkOptions fileFormats maybeOutputConfigFilePath nDecimalDigits studentBodyMnemonicSeparator verbosity+	| ToolShed.SelfValidate.isValid options	= options+	| otherwise				= error $ "WeekDaze.OutputConfiguration.Options.mkOptions:\t" ++ ToolShed.SelfValidate.getFirstError options ++ "."+	where+		options	= MkOptions fileFormats maybeOutputConfigFilePath nDecimalDigits studentBodyMnemonicSeparator verbosity++instance (+	Fractional	minimumContrastRatio,+	HXT.XmlPickler	minimumContrastRatio,+	Ord		minimumContrastRatio,+	Show		minimumContrastRatio+ ) => HXT.XmlPickler (Options minimumContrastRatio) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e)	-> mkOptions a b c d e,	-- Construct from a tuple.+		\MkOptions {+			getFileFormats			= fileFormats,+			getMaybeOutputConfigFilePath	= maybeOutputConfigFilePath,+			getNDecimalDigits		= nDecimalDigits,+			getStudentBodyMnemonicSeparator	= studentBodyMnemonicSeparator,+			getVerbosity			= verbosity+		} -> (fileFormats, maybeOutputConfigFilePath, nDecimalDigits, studentBodyMnemonicSeparator, verbosity)	-- Deconstruct into a tuple.+	 ) $ HXT.xp5Tuple (+		HXT.xpDefault (getFileFormats defaultOptions) . HXT.xpElem fileFormatsTag $ HXT.xpList1 {-can't be null-} HXT.xpickle {-FileFormat-}+	 ) (+		HXT.xpOption $ HXT.xpTextAttr outputConfigFilePathTag {-can't be null-}+	 ) (+		getNDecimalDigits defaultOptions `HXT.xpDefault` HXT.xpAttr nDecimalDigitsTag HXT.xpInt+	 ) (+		getStudentBodyMnemonicSeparator defaultOptions `HXT.xpDefault` HXT.xpAttr studentBodyMnemonicSeparatorTag HXT.xpText0 {-can be null-}+	 ) (+		getVerbosity defaultOptions `HXT.xpDefault` HXT.xpickle+	 ) where+		defaultOptions	= Data.Default.def+
+ src-lib/WeekDaze/OutputConfiguration/Style.hs view
@@ -0,0 +1,344 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the style of the output.+-}++module WeekDaze.OutputConfiguration.Style(+-- * Types+-- ** Type-synonyms+	DisplayRuntimeInformation,+	DisplaySupplementaryInformation,+--	GenerateLessonColour,+-- ** Data-types+	Style(+--		MkStyle,+		getDisplayViews,+		getMaybeCSSURL,+		getMergeDuplicateTimeslots,+		getDisplayAxisLabels,+		getDisplayRuntimeInformation,+		getDisplaySupplementaryInformation,+		getWeekend,+		getMaybeGenerateLessonColour+	),+-- * Constants+--	tag,+--	byDayTag,+--	byTimeslotTag,+--	cssURLTag,+--	displayAxisLabelsTag,+	displayViewsTag,+	displayRuntimeInformationTag,+--	displaySupplementaryInformationTag,+--	mergeDuplicateTimeslotsTag,+--	perspectiveTag,+	weekendTag,+--	minimumContrastRatioTag,+--	minimumContrastRatioDefault,+-- * Functions+-- ** Constructor+	mkStyle+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Model.GenerateLessonColourFrom	as Model.GenerateLessonColourFrom+import qualified	WeekDaze.OutputConfiguration.View	as OutputConfiguration.View+import qualified	WeekDaze.Temporal.Day			as Temporal.Day+import qualified	WeekDaze.Temporal.TimeAxes		as Temporal.TimeAxes+import			WeekDaze.Enhanced.EnhancedBool()++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	WeekDaze.Database.Selector		as Database.Selector++instance Fractional minimumContrastRatio => Database.Selector.Selector (Style minimumContrastRatio) where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= showString Database.Selector.tablePrefix tag+	 in do+		styleRows	<- Database.Selector.select connection [+--			displayViews,+			cssURLTag,+			showString mergeDuplicateTimeslotsTag byDayTag,+			showString mergeDuplicateTimeslotsTag byTimeslotTag,+			showString displayAxisLabelsTag byDayTag,+			showString displayAxisLabelsTag byTimeslotTag,+			displayRuntimeInformationTag,+			displaySupplementaryInformationTag,+			weekendTag,+			Model.GenerateLessonColourFrom.tag,+			minimumContrastRatioTag+		 ] [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-monad-} $ case styleRows of+			[]		-> Data.Default.def+			[styleRow]	-> case styleRow of+				[+--					displayViewsSql,+					cssURLSql,+					mergeDuplicateTimeslotsByDaySql,+					mergeDuplicateTimeslotsByTimeslotSql,+					displayAxisLabelsByDaySql,+					displayAxisLabelsByTimeslotSql,+					displayRuntimeInformationSql,+					displaySupplementaryInformationSql,+					weekendSql,+					generateLessonColourFromSql,+					minimumContrastRatioSql+				 ] -> Data.Default.def {+--					getDisplayViews,+					getMaybeCSSURL				= Database.HDBC.fromSql cssURLSql,+					getMergeDuplicateTimeslots		= either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows (mergeDuplicateTimeslotsTag ++ byDayTag) . showString " read from the database; " . show+					) id (+						Database.HDBC.safeFromSql mergeDuplicateTimeslotsByDaySql+					) `Temporal.TimeAxes.mkTimeAxes` either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows (mergeDuplicateTimeslotsTag ++ byTimeslotTag) . showString " read from the database; " . show+					) id (+						Database.HDBC.safeFromSql mergeDuplicateTimeslotsByTimeslotSql+					),+					getDisplayAxisLabels			= either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows (displayAxisLabelsTag ++ byDayTag) . showString " read from the database; " . show+					) id (+						Database.HDBC.safeFromSql displayAxisLabelsByDaySql+					) `Temporal.TimeAxes.mkTimeAxes` either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows (displayAxisLabelsTag ++ byTimeslotTag) . showString " read from the database; " . show+					) id (+						Database.HDBC.safeFromSql displayAxisLabelsByTimeslotSql+					),+					getDisplayRuntimeInformation		= either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows displayRuntimeInformationTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql displayRuntimeInformationSql,+					getDisplaySupplementaryInformation	= either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows displaySupplementaryInformationTag . showString " read from the database; " . show+					) id $ Database.HDBC.safeFromSql displaySupplementaryInformationSql,+					getWeekend				= Database.HDBC.fromSql weekendSql,+					getMaybeGenerateLessonColour		= flip (,) (+						Data.Maybe.maybe minimumContrastRatioDefault realToFrac (+							either (+								error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows minimumContrastRatioTag . showString " read from the database; " . show+							) id (+								Database.HDBC.safeFromSql minimumContrastRatioSql :: Data.Convertible.ConvertResult (Maybe Double)+							)+						)+					) `fmap` either (+						error . showString "WeekDaze.OutputConfiguration.Style.fromDatabase:\tfailed to parse the value for " . shows Model.GenerateLessonColourFrom.tag . showString " read from the database; " . show+					) id (+						Database.HDBC.safeFromSql generateLessonColourFromSql+					)+				}+				_	-> error $ "WeekDaze.OutputConfiguration.Style.fromDatabase:\tunexpected number of columns=" ++ show (length styleRow) ++ " in row of table " ++ show tableName ++ "."+			_		-> error $ "WeekDaze.OutputConfiguration.Style.fromDatabase:\tunexpected number of rows=" ++ show (length styleRows) ++ " selected from table " ++ show tableName ++ "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag					= "style"++-- | Used to qualify SQL.+byDayTag :: String+byDayTag				= "ByDay"++-- | Used to qualify SQL.+byTimeslotTag :: String+byTimeslotTag				= "ByTimeslot"++-- | Used to qualify XML.+displayViewsTag :: String+displayViewsTag				= "displayViews"++-- | Used to qualify SQL & XML.+cssURLTag :: String+cssURLTag				= "cssURL"++-- | Used to qualify SQL & XML.+mergeDuplicateTimeslotsTag :: String+mergeDuplicateTimeslotsTag		= "mergeDuplicateTimeslots"++-- | Used to qualify SQL & XML.+displayAxisLabelsTag :: String+displayAxisLabelsTag			= "displayAxisLabels"++-- | Used to qualify SQL & XML.+displayRuntimeInformationTag :: String+displayRuntimeInformationTag		= "displayRuntimeInformation"++-- | Used to qualify SQL & XML.+displaySupplementaryInformationTag :: String+displaySupplementaryInformationTag	= "displaySupplementaryInformation"++-- | Used to qualify XML.+perspectiveTag :: String+perspectiveTag				= "perspective"++-- | Used to qualify SQL & XML.+weekendTag :: String+weekendTag				= "weekend"++-- | Used to qualify SQL & XML.+minimumContrastRatioTag :: String+minimumContrastRatioTag			= "minimumContrastRatio"++-- | Default value.+minimumContrastRatioDefault :: Fractional minimumContrastRatio => minimumContrastRatio+minimumContrastRatioDefault		= recip 16++-- | Whether to apply a concept to each of the two Cartesian axes of a timetable.+type TimeAxes				= Temporal.TimeAxes.TimeAxes Bool++-- | Whether to display the runtime-log in the output markup.+type DisplayRuntimeInformation		= Bool++-- | Whether to display the runtime-log in the output markup.+type DisplaySupplementaryInformation	= Bool++-- | The attribute from which to generate the colour of a /lesson/ & the minimum acceptable contrast-ratio wrt to its complementary background colour.+type GenerateLessonColour minimumContrastRatio	= (Model.GenerateLessonColourFrom.GenerateLessonColourFrom, minimumContrastRatio)	-- Pair.++-- | Defines the style in which the timetable is rendered.+data Style minimumContrastRatio	= MkStyle {+	getDisplayViews				:: Data.Set.Set OutputConfiguration.View.View,		-- ^ The /view/s from which to display the /timetable/.+	getMaybeCSSURL				:: Maybe String,					-- ^ Optional URL to a Cascading Style-Sheet.+	getMergeDuplicateTimeslots		:: TimeAxes,						-- ^ Options to merge duplicate /lesson/s between adjacent /day/s, & between consecutive /time-slot/s respectively, in the presentation of the solution.+	getDisplayAxisLabels			:: TimeAxes,						-- ^ Options to display /day/ & /timeslot-id/ axis-labels respectively, in the presentation of the solution.+	getDisplayRuntimeInformation		:: DisplayRuntimeInformation,				-- ^ Option to display both warnings & the runtime-log, in the presentation of the solution.+	getDisplaySupplementaryInformation	:: DisplaySupplementaryInformation,			-- ^ Option to augment the output with supplementary information.+	getWeekend				:: Temporal.Day.Weekend,				-- ^ The set of /day/s generally considered to constitute the weekend rather than work-days.+	getMaybeGenerateLessonColour		:: Maybe (GenerateLessonColour minimumContrastRatio)	-- ^ Whether to generate the colour of a /lesson/ from one of its attributes or to delegate colouring to the CSS-file specified via 'getMaybeCSSURL'.+} deriving (Eq, Show)++instance (+	Num	minimumContrastRatio,+	Ord	minimumContrastRatio+ ) => ToolShed.SelfValidate.SelfValidator (Style minimumContrastRatio) where+	getErrors MkStyle {+		getDisplayViews			= displayViews,+		getMaybeGenerateLessonColour	= maybeGenerateLessonColour+	} = ToolShed.SelfValidate.extractErrors [+		(+			Data.Set.null displayViews,+			"at least one view of the results must be specified; " ++ show displayViewsTag+		), (+			Data.Maybe.maybe False (+				(+					\minimumContrastRatio -> any ($ minimumContrastRatio) [(< 0), (> 1)]+				) . snd+			) maybeGenerateLessonColour,+			show minimumContrastRatioTag ++ "' must be within the closed unit-interval '[0,1]'"+		)+	 ]++instance Data.Default.Default (Style minimumContrastRatio) where+	def = MkStyle {+		getDisplayViews				= Data.Set.fromList OutputConfiguration.View.range,+		getMaybeCSSURL				= Nothing,+		getMergeDuplicateTimeslots		= Temporal.TimeAxes.mkTimeAxes True True,+		getDisplayAxisLabels			= Temporal.TimeAxes.mkTimeAxes True True,+		getDisplayRuntimeInformation		= True,+		getDisplaySupplementaryInformation	= True,+		getWeekend				= Data.Set.fromList [minBound, maxBound],+		getMaybeGenerateLessonColour		= Nothing+	}++instance Control.DeepSeq.NFData minimumContrastRatio => Control.DeepSeq.NFData (Style minimumContrastRatio) where+	rnf (MkStyle x0 x1 x2 x3 x4 x5 x6 x7)	= Control.DeepSeq.rnf (x0, x1, x2, x3, x4, x5, x6, x7)++-- | Smart constructor.+mkStyle :: (+	Num	minimumContrastRatio,+	Ord	minimumContrastRatio+ )+	=> Data.Set.Set OutputConfiguration.View.View	-- ^ The /view/s from which to display the /timetable/, when rendering as xhtml.+	-> Maybe String					-- ^ The optional URL to a CSS-file.+	-> TimeAxes+	-> TimeAxes+	-> DisplayRuntimeInformation+	-> DisplaySupplementaryInformation+	-> Temporal.Day.Weekend				-- ^ Those /day/s of the weekend, which may be visually distingished by CSS.+	-> Maybe (Model.GenerateLessonColourFrom.GenerateLessonColourFrom, minimumContrastRatio)+	-> Style minimumContrastRatio+mkStyle displayViews maybeCSSURL mergeDuplicateTimeslots displayAxisLabels displayRuntimeInformation displaySupplementaryInformation weekend maybeGenerateLessonColour+	| ToolShed.SelfValidate.isValid style	= style+	| otherwise				= error $ "WeekDaze.OutputConfiguration.Style.mkStyle:\t" ++ ToolShed.SelfValidate.getFirstError style ++ "."+	where+		style = MkStyle {+			getDisplayViews				= displayViews,+			getMaybeCSSURL				= maybeCSSURL,+			getMergeDuplicateTimeslots		= mergeDuplicateTimeslots,+			getDisplayAxisLabels			= displayAxisLabels,+			getDisplayRuntimeInformation		= displayRuntimeInformation,+			getDisplaySupplementaryInformation	= displaySupplementaryInformation,+			getWeekend				= weekend,+			getMaybeGenerateLessonColour		= maybeGenerateLessonColour+		}++instance (+	Fractional	minimumContrastRatio,+	HXT.XmlPickler	minimumContrastRatio,+	Ord		minimumContrastRatio+ ) => HXT.XmlPickler (Style minimumContrastRatio) where+	xpickle	= HXT.xpDefault defaultStyle . HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g, h)	-> mkStyle a b c d e f g h,	-- Construct from a tuple.+		\MkStyle {+			getDisplayViews				= displayViews,+			getMaybeCSSURL				= maybeCSSURL,+			getMergeDuplicateTimeslots		= mergeDuplicateTimeslots,+			getDisplayAxisLabels			= displayAxisLabels,+			getDisplayRuntimeInformation		= displayRuntimeInformation,+			getDisplaySupplementaryInformation	= displaySupplementaryInformation,+			getWeekend				= weekend,+			getMaybeGenerateLessonColour		= maybeGenerateLessonColour+		} -> (displayViews, maybeCSSURL, mergeDuplicateTimeslots, displayAxisLabels, displayRuntimeInformation, displaySupplementaryInformation, weekend, maybeGenerateLessonColour) -- Deconstruct into a tuple.+	 ) $ HXT.xp8Tuple (+		HXT.xpDefault (getDisplayViews Data.Default.def) . HXT.xpElem displayViewsTag . HXT.xpWrap (+			Data.Set.fromList,+			Data.Set.toList+		) . HXT.xpList1 {-can't be null-} $ HXT.xpElem perspectiveTag HXT.xpickle {-View-}+	 ) (+		HXT.xpOption $ HXT.xpTextAttr cssURLTag {-can't be null-}+	 ) (+		getMergeDuplicateTimeslots defaultStyle `HXT.xpDefault` HXT.xpElem mergeDuplicateTimeslotsTag HXT.xpickle {-TimeAxes-}+	 ) (+		getDisplayAxisLabels defaultStyle `HXT.xpDefault` HXT.xpElem displayAxisLabelsTag HXT.xpickle {-TimeAxes-}+	 ) (+		getDisplayRuntimeInformation defaultStyle `HXT.xpDefault` HXT.xpAttr displayRuntimeInformationTag HXT.xpickle {-Bool-}+	 ) (+		getDisplaySupplementaryInformation defaultStyle `HXT.xpDefault` HXT.xpAttr displaySupplementaryInformationTag HXT.xpickle {-Bool-}+	 ) (+		HXT.xpDefault (getWeekend defaultStyle) . HXT.xpElem weekendTag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) $ HXT.xpList {-can be null-} HXT.xpickle {-Day-}+	 ) (+		HXT.xpOption . HXT.xpElem "generateLessonColour" $ HXT.xpickle {-GenerateLessonColourFrom-} `HXT.xpPair` HXT.xpDefault minimumContrastRatioDefault (+			HXT.xpAttr minimumContrastRatioTag HXT.xpickle+		) -- GenerateLessonColour.+	 ) where+		defaultStyle	= Data.Default.def+
+ src-lib/WeekDaze/OutputConfiguration/Verbosity.hs view
@@ -0,0 +1,63 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Instance-definitions for 'Distribution.Verbosity.Verbosity'.+-}++module WeekDaze.OutputConfiguration.Verbosity(+-- * Constants+	tag,+	range+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Distribution.Verbosity+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue Distribution.Verbosity.Verbosity {-multi-parameter type-class-} where+	safeConvert	= fmap read . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify SQL & XML.+tag :: String+tag	= "verbosity"++instance Data.Default.Default Distribution.Verbosity.Verbosity where+	def	= Distribution.Verbosity.normal++instance HXT.XmlPickler Distribution.Verbosity.Verbosity where+--	xpickle	= HXT.xpPrim+	xpickle	= HXT.xpWrap (read, show) . HXT.xpAttr tag . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range	-- CAVEAT: whether it'll be used as an XML-attribute or an XML-element isn't currently known.++instance Control.DeepSeq.NFData Distribution.Verbosity.Verbosity where+	rnf _	= ()++-- | The constant complete range of values.+range :: [Distribution.Verbosity.Verbosity]+range	= [minBound .. maxBound]
+ src-lib/WeekDaze/OutputConfiguration/View.hs view
@@ -0,0 +1,62 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Enumerates the various perspectives from which a /timetable/ can be viewed.+-}++module WeekDaze.OutputConfiguration.View(+-- * Types+-- ** Data-types+	View(..),+-- * Constants+	tag,+	range+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++-- | Used to qualify XML.+tag :: String+tag	= "view"++-- | The perspective from which a timetable is intended to be viewed.+data View+	= LocationView+	| StudentView+	| TeacherView+	deriving (Bounded, Enum, Eq, Ord, Read, Show)++instance Data.Default.Default View where+	def	= StudentView++instance HXT.XmlPickler View where+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++instance Control.DeepSeq.NFData View where+	rnf _	= ()++-- | The constant complete range of values.+range :: [View]+range	= [minBound .. maxBound]+
+ src-lib/WeekDaze/ProblemConfiguration/ProblemAnalysis.hs view
@@ -0,0 +1,607 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Loosely connected utilities, which rely only on the 'ProblemConfiguration.ProblemParameters.ProblemParameters',+	rather than on the dynamically changing state of the /timetable/.++	* As a result, some of these functions can effectively be cached, after the problem has been defined.+-}++module WeekDaze.ProblemConfiguration.ProblemAnalysis(+-- * Types+-- ** Type-synonyms+--	CoursesByTeacherIdBySubjectByStudentBody,+--	DistinctTimeslotRunlengthsByCourse,+--	MeetingResourcesByTime,+--	LessonsByStudentBody,+--	LessonsByStudentBodyByDay,+--	StudentBodiesBySynchronisationId,+-- ** Data-types+	ProblemAnalysis(+--		MkProblemAnalysis,+		getCoursesByTeacherIdBySynchronisationId,+		getCoursesRequestingSeparatedLessonsWithinAnyDay,+		getDistinctRunlengthsOfSpecifiedTimesByCourse,+--		getDistinctSubjects,+		getFreeLocationViewTimetable,+		getFreeStudentViewTimetable,+		getFreeTeacherViewTimetable,+		getMeetingResourcesByTime,+		getMeetingsByTime,+		getNAvailableDaysPerStudentTimetable,+		getNAvailableDaysPerTeacherTimetable,+		getNStudents,+		getNTeachers,+--		getNTeacherInternalAvailabilityGaps,+--		getSpecifiedTimes,+		getNTimeslotsPerDay,+		getRequiredLessonCombinationsByStudentBody,+		getRequiredLessonCombinationsByStudentBodyAvailableByDay,+		getStudentBodiesBySynchronisationId,+		getSubjectsWithAnIdealTimeslotRequest,+		getSuitableCoursesByTeacherIdBySubjectByStudentBody,+		getTimeslotIdRange,+		getTotalLessonsPerWeekByFacilityName+	),+-- * Functions+	countStudentPlaces,+--	findCoursesFor,+	findCourseFor,+	findCourseForLocationViewLesson,+	findCourseForTeacherViewLesson,+	findDistinctSynchronisationIds,+--	findMeetingsByTime,+--	findMeetingResourcesByTime,+--	findCoursesRequestingSeparatedLessonsWithinAnyDay,+--	findSubjectsWithAnIdealTimeslotRequest,+--	findDistinctRunlengthsOfSpecifiedTimesByCourse,+--	findStudentBodiesBySynchronisationId,+--	findSuitableCoursesByTeacherIdBySubjectByStudentBody,+--	findSuitableLocations,+	lookupCourseFor,+--	generateRequiredLessonCombinationsByStudentBody,+--	generateRequiredLessonCombinationsByStudentBodyAvailableByDay,+-- ** Constructor+	mkProblemAnalysis,+-- ** Predicates+	areAnyResourcesBookedForGroupMeeting,+	areAvailableResources,+	doAllCoursesSatifyingAnotherKnowledgeRequirementSpecifyThisTime,+	isFree,+	isValidTimeslotId+) where++import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Factory.Data.Interval+import qualified	WeekDaze.Aggregate.GroupCatalogue			as Aggregate.GroupCatalogue+import qualified	WeekDaze.Aggregate.LocationCatalogue			as Aggregate.LocationCatalogue+import qualified	WeekDaze.Aggregate.StudentBody				as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentBodyRegister			as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Aggregate.StudentClass				as Aggregate.StudentClass+import qualified	WeekDaze.Aggregate.TeacherRegister			as Aggregate.TeacherRegister+import qualified	WeekDaze.Data.Course					as Data.Course+import qualified	WeekDaze.Data.Group					as Data.Group+import qualified	WeekDaze.Data.HumanResource				as Data.HumanResource+import qualified	WeekDaze.Data.Location					as Data.Location+import qualified	WeekDaze.Data.Resource					as Data.Resource+import qualified	WeekDaze.Data.Student					as Data.Student+import qualified	WeekDaze.Data.Subject					as Data.Subject+import qualified	WeekDaze.Data.Teacher					as Data.Teacher+import qualified	WeekDaze.LocationView.Lesson				as LocationView.Lesson+import qualified	WeekDaze.LocationView.Timetable				as LocationView.Timetable+import qualified	WeekDaze.Model.Lesson					as Model.Lesson+import qualified	WeekDaze.Model.Meeting					as Model.Meeting+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters		as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Size						as Size+import qualified	WeekDaze.StudentView.Lesson				as StudentView.Lesson+import qualified	WeekDaze.StudentView.LessonResourceIds			as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.StudentView.TimetableCoordinates		as StudentView.TimetableCoordinates+import qualified	WeekDaze.TeacherView.Lesson				as TeacherView.Lesson+import qualified	WeekDaze.TeacherView.Timetable				as TeacherView.Timetable+import qualified	WeekDaze.Temporal.Availability				as Temporal.Availability+import qualified	WeekDaze.Temporal.Day					as Temporal.Day+import qualified	WeekDaze.Temporal.Time					as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest			as Temporal.TimeslotRequest++{- |+	* A map by /student-body/, of maps by /subject/, of maps by /teacherId/, of /course/s.++	* CAVEAT: it is assumed that no /teacher/ can offer more than one suitable /course/.+-}+type CoursesByTeacherIdBySubjectByStudentBody synchronisationId level teacherId timeslotId	= Data.Map.Map Aggregate.StudentBody.StudentBody (Data.Map.Map (Data.Subject.Subject level) (Data.Map.Map teacherId (Data.Course.Course synchronisationId level timeslotId)))++-- | Sets of distinct /time-slot/ run-lengths, for each /course/.+type DistinctTimeslotRunlengthsByCourse synchronisationId level timeslotId	= Data.Map.Map (Data.Course.Course synchronisationId level timeslotId) (Data.Set.Set Size.NTimeslots)++-- | A map by /time/, of sets of /resource/s.+type MeetingResourcesByTime timeslotId locationId teacherId	= Data.Map.Map (Temporal.Time.Time timeslotId) (Data.Set.Set locationId, Data.Set.Set Aggregate.StudentBody.StudentBody, Data.Set.Set teacherId)++-- | A map by /student-body/, of /lesson/s; as returned by 'generateRequiredLessonCombinationsByStudentBody'.+type LessonsByStudentBody locationId teacherId level	= Data.Map.Map Aggregate.StudentBody.StudentBody [StudentView.Lesson.Lesson locationId teacherId level]++-- | A map by /day/, of maps by /student-body/, of /lesson/s; as returned by 'generateRequiredLessonCombinationsByStudentBodyAvailableByDay'.+type LessonsByStudentBodyByDay locationId teacherId level	= Data.Map.Map Temporal.Day.Day (LessonsByStudentBody locationId teacherId level)++-- | A map by /synchronisationId/, of /student-bodies/ who require a /subject/ from one of the corresponding /course/s.+type StudentBodiesBySynchronisationId synchronisationId	= Data.Map.Map synchronisationId (Data.Set.Set Aggregate.StudentBody.StudentBody)++-- | The results of the analysis of 'ProblemConfiguration.ProblemParameters.ProblemParameters'.+data ProblemAnalysis level locationId synchronisationId teacherId timeslotId	= MkProblemAnalysis {+	getCoursesByTeacherIdBySynchronisationId		:: Aggregate.TeacherRegister.CoursesByTeacherIdBySynchronisationId synchronisationId teacherId level timeslotId,	-- ^ Index /course/s by the /teacherId/ who offers them, & by their /synchronisationId/.+	getCoursesRequestingSeparatedLessonsWithinAnyDay	:: Data.Set.Set (Data.Course.Course synchronisationId level timeslotId),						-- ^ Identifies /course/s which specify /time/s, separated within a single /day/.+	getDistinctRunlengthsOfSpecifiedTimesByCourse		:: DistinctTimeslotRunlengthsByCourse synchronisationId level timeslotId,						-- ^ The distinct runlengths of consecutive specified /time/s, per /course/.+	getDistinctSubjects					:: Data.Subject.Knowledge level,											-- ^ The distinct /subject/s amongst the /service/s offered by /teacher/s.+	getFreeLocationViewTimetable				:: LocationView.Timetable.Timetable locationId timeslotId teacherId level,						-- ^ An unallocated /timetable/ indexed by /location/s.+	getFreeStudentViewTimetable				:: StudentView.Timetable.Timetable timeslotId locationId teacherId level,						-- ^ An unallocated /timetable/ indexed by /student-bodies/.+	getFreeTeacherViewTimetable				:: TeacherView.Timetable.Timetable teacherId timeslotId locationId level,						-- ^ An unallocated /timetable/ indexed by /teacher/s.+	getMeetingResourcesByTime				:: MeetingResourcesByTime timeslotId locationId teacherId,								-- ^ A map by /time/, of the /resource/s used by the /meeting/s of /group/s. CAVEAT: /time/s at which zero /meeting/s are booked, don't exist in the map.+	getMeetingsByTime					:: Model.Meeting.MeetingsByTime timeslotId locationId teacherId,							-- ^ A map by /time/, of the /meeting/s of /group/s with at least one member.+	getNAvailableDaysPerStudentTimetable			:: Size.NDays,														-- ^ The number of /day/s in a /student-timetable/, each multiplied by the size of the /student-body/ for which it's applicable.+	getNAvailableDaysPerTeacherTimetable			:: Size.NDays,														-- ^ The number of /day/s in a /teacher-timetable/.+	getNStudents						:: Size.NStudents,													-- ^ Counts the number of /student/s on the register.+	getNTeachers						:: Size.NTeachers,													-- ^ Counts the number of /teacher/s (excluding purely administrative staff) on the register.+	getNTeacherInternalAvailabilityGaps			:: Size.NDays,														-- ^ Counts the non-terminal (/available/ <-> un/available/)-day boundaries, over all /teacher/s.+	getNTimeslotsPerDay					:: Size.NTimeslots,													-- ^ The number of /time-slot/s in any /day/.+	getRequiredLessonCombinationsByStudentBodyAvailableByDay:: LessonsByStudentBodyByDay locationId teacherId level,								-- ^ The map by /day/, of maps by /student-body/, of combinations of possible /lesson/s.+	getRequiredLessonCombinationsByStudentBody		:: LessonsByStudentBody locationId teacherId level,									-- ^ The map by /student-body/, of combinations of possible /lesson/s.+	getSpecifiedTimes					:: Temporal.Time.TimeSet timeslotId,											-- ^ The set of all specified /time/s, for any /course/, offered by any /teacher/.+	getStudentBodiesBySynchronisationId			:: StudentBodiesBySynchronisationId synchronisationId,									-- ^ A map by /synchronisationId/, of /student-bodies/ who require a /subject/ from one of the corresponding /course/s.+	getSubjectsWithAnIdealTimeslotRequest			:: Data.Set.Set (Data.Subject.Subject level),										-- ^ The /subject/s, of the subset of all /course/s, which have an /ideal timeslot-request/.+	getSuitableCoursesByTeacherIdBySubjectByStudentBody	:: CoursesByTeacherIdBySubjectByStudentBody synchronisationId level teacherId timeslotId,				-- ^ Catalogues all the /course/s, which match each of the /knowledge-requirement/s, of each /student-body/.+	getTimeslotIdRange					:: [timeslotId],													-- ^ The range of /time-slot/s in any /day/.+	getTotalLessonsPerWeekByFacilityName			:: Data.Map.Map Data.Location.FacilityName Size.NTimeslots								-- ^ The total /lesson/s per week, required by all those /course/s needing a specified /facility/. CAVEAT: only the subset of /facilities/ offered, which are also required, are indexed.+}++-- | Constructor.+mkProblemAnalysis :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			locationId,+	Show			teacherId+ ) => ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> ProblemAnalysis level locationId synchronisationId teacherId timeslotId+mkProblemAnalysis problemParameters	= problemAnalysis where+	timeslotIdBounds	= ProblemConfiguration.ProblemParameters.getTimeslotIdBounds problemParameters+	teacherRegister		= ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters+	studentBodies		= Aggregate.StudentBodyRegister.getStudentBodies $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters++	problemAnalysis	= MkProblemAnalysis {+		getCoursesByTeacherIdBySynchronisationId			= Aggregate.TeacherRegister.findCoursesByTeacherIdBySynchronisationId teacherRegister,+		getCoursesRequestingSeparatedLessonsWithinAnyDay		= findCoursesRequestingSeparatedLessonsWithinAnyDay problemParameters,+		getDistinctRunlengthsOfSpecifiedTimesByCourse			= findDistinctRunlengthsOfSpecifiedTimesByCourse problemParameters,+		getDistinctSubjects						= Aggregate.TeacherRegister.extractDistinctSubjects teacherRegister,+		getFreeLocationViewTimetable					= Model.Timetable.mkFreeTimetable (Aggregate.LocationCatalogue.getLocationIds $ ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters) timeslotIdBounds,+		getFreeStudentViewTimetable					= Model.Timetable.mkFreeTimetable studentBodies timeslotIdBounds,+		getFreeTeacherViewTimetable					= Model.Timetable.mkFreeTimetable (Aggregate.TeacherRegister.getTeacherIds teacherRegister) timeslotIdBounds,+		getMeetingResourcesByTime					= findMeetingResourcesByTime problemParameters,+		getMeetingsByTime						= findMeetingsByTime problemParameters,+		getNAvailableDaysPerStudentTimetable				= Aggregate.StudentBodyRegister.countAvailableStudentDays $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters,+		getNAvailableDaysPerTeacherTimetable				= Aggregate.TeacherRegister.countAvailableTeacherDays $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters,+		getNStudents							= Aggregate.StudentClass.getSize studentBodies,+		getNTeachers							= Data.Map.size $ Data.Map.filter Data.Teacher.offersService teacherRegister,+		getNTeacherInternalAvailabilityGaps				= Data.Map.foldr ((+) . Temporal.Availability.countInternalAvailabilityGaps . Data.Resource.getAvailability) 0 teacherRegister,+		getNTimeslotsPerDay						= ProblemConfiguration.ProblemParameters.calculateNTimeslotsPerDay timeslotIdBounds,+		getRequiredLessonCombinationsByStudentBodyAvailableByDay	= generateRequiredLessonCombinationsByStudentBodyAvailableByDay problemParameters problemAnalysis {-recurse-},+		getRequiredLessonCombinationsByStudentBody			= generateRequiredLessonCombinationsByStudentBody problemParameters,+		getSpecifiedTimes						= Aggregate.TeacherRegister.findSpecifiedTimes teacherRegister,+		getStudentBodiesBySynchronisationId				= findStudentBodiesBySynchronisationId problemParameters problemAnalysis {-recurse-},+		getSubjectsWithAnIdealTimeslotRequest				= findSubjectsWithAnIdealTimeslotRequest problemParameters,+		getSuitableCoursesByTeacherIdBySubjectByStudentBody		= findSuitableCoursesByTeacherIdBySubjectByStudentBody problemParameters,+		getTimeslotIdRange						= Factory.Data.Interval.toList timeslotIdBounds,+		getTotalLessonsPerWeekByFacilityName				= Aggregate.TeacherRegister.countLessonsPerWeekByFacilityName teacherRegister+	}++{- |+	* Catalogue by /time/, the /meeting/s of /group/s which have at least one member.++	* CAVEAT: the map doesn't necessarily contain a key for each possible /time/.+-}+findMeetingsByTime :: (+	Ord		locationId,+	Ord		teacherId,+	Ord		timeslotId,+	RealFrac	teachingRatio,+	Show		locationId,+	Show		teacherId+ ) => ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Model.Meeting.MeetingsByTime timeslotId locationId teacherId+findMeetingsByTime problemParameters	= Data.Set.foldr (+	\groupId m	-> let+		(meetingTimes, maybeLocationId)	= Data.Group.getMeetingTimes &&& Data.Group.getMaybeLocationId $ ProblemConfiguration.ProblemParameters.getGroupCatalogue problemParameters ! groupId++		getResourceIdSet :: Aggregate.GroupCatalogue.ResourceIdsByGroupId resourceId -> Data.Set.Set resourceId+		getResourceIdSet	= Data.Maybe.fromMaybe Data.Set.empty . Data.Map.lookup groupId+	in Data.Set.foldr (+		(+			$ (+				Data.Set.singleton . uncurry (+					Model.Meeting.mkMeeting groupId maybeLocationId+				) . (+					getResourceIdSet {-studentBody-set-} *** getResourceIdSet {-teacherId-set-}+				) $ ProblemConfiguration.ProblemParameters.findHumanResourceIdsByGroupId problemParameters+			) -- Section.+		) . Data.Map.insertWith Data.Set.union+	) m meetingTimes+ ) Data.Map.empty $ ProblemConfiguration.ProblemParameters.extractDistinctGroupMembership problemParameters++{- |+	* Catalogues by /time/, the /resource/s used for /meeting/s of /group/s.++	* CAVEAT: the map doesn't necessarily contain a key for each possible /time/.+-}+findMeetingResourcesByTime :: (+	Ord		locationId,+	Ord		teacherId,+	Ord		timeslotId,+	RealFrac	teachingRatio,+	Show		locationId,+	Show		teacherId+ ) => ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> MeetingResourcesByTime timeslotId locationId teacherId+findMeetingResourcesByTime problemParameters	= Data.Map.map (+	Data.Set.foldr (+		\meeting (l, s, t) -> (+			Data.Maybe.maybe l (`Data.Set.insert` l) $ Model.Meeting.getMaybeLocationId meeting,+			s `Data.Set.union` Model.Meeting.getStudentClass meeting,+			t `Data.Set.union` Model.Meeting.getTeacherIds meeting+		) -- Triple+	) (+		Data.Set.empty,+		Data.Set.empty,+		Data.Set.empty+{-+	) . Data.Set.filter (+		Data.Group.getMandatesAttendance . (ProblemConfiguration.ProblemParameters.getGroupCatalogue problemParameters !) . Model.Meeting.getGroupId+-}+	)+ ) $ findMeetingsByTime problemParameters++-- | True if any of the required /resource/s, are already required at the specified /time/, for a /meeting/ of a /group/.+areAnyResourcesBookedForGroupMeeting :: (+	Ord	locationId,+	Ord	teacherId,+	Ord	timeslotId+ )+	=> ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Temporal.Time.Time timeslotId+	-> Aggregate.StudentBody.StudentBody+	-> locationId+	-> teacherId+	-> Bool+areAnyResourcesBookedForGroupMeeting problemAnalysis time studentBody locationId teacherId	= Data.Maybe.maybe False (+	\(locationIdSet, studentBodySet, teacherIdSet)	-> or [+		Data.Set.member locationId locationIdSet,+		Data.Set.member studentBody studentBodySet,	-- CAVEAT: performance-hotspot.+		Data.Set.member teacherId teacherIdSet+	]+ ) . Data.Map.lookup time $ getMeetingResourcesByTime problemAnalysis++-- | Catalogues by /teacherId/, all the /course/s which match each of the /knowledge-requirement/s, of each /student-body/.+findSuitableCoursesByTeacherIdBySubjectByStudentBody+	:: Ord level+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> CoursesByTeacherIdBySubjectByStudentBody synchronisationId level teacherId timeslotId+findSuitableCoursesByTeacherIdBySubjectByStudentBody problemParameters	= Data.Map.mapWithKey (+	\studentBody studentProfile	-> Data.Map.fromList . map (+		\subject -> (+			subject,+			Aggregate.TeacherRegister.findSuitableCourseByTeacherId (Aggregate.StudentBody.getSize studentBody) subject . Data.Map.filter (+				Data.Resource.isAvailable . (,) studentProfile	-- Check that they're simultaneously available.+			) $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters+		) -- Pair.+	) . Data.Set.toList $ Data.Student.deriveAmalgamatedKnowledgeRequirement studentProfile+ ) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters++{- |+	* Checks for the proposed /booking/, whether all suitable /course/s, for any one of the /student-body/'s other knowledge-requirements, specify the proposed /time/.++	* CAVEAT: doesn't check whether the specified /subject/ can only be satisfied by a /synchronised course/,+	& if so, whether any /student-body/ who requires a different /course/ from the same synchronised set,+	has any other /knowledge-requirement/ which can only be satisfied by a /course/ which specifies the proposed /time/.+	This tricky scenario is dealt with in the /lesson-criterion/ 'minimiseBookingAtAnotherCoursesSpecifiedTime' where the specific /course/ is known.+-}+doAllCoursesSatifyingAnotherKnowledgeRequirementSpecifyThisTime+	:: (Ord level, Ord timeslotId)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> Data.Subject.Subject level					-- ^ The /subject/ of the proposed /lesson/.+	-> StudentView.TimetableCoordinates.Coordinates timeslotId	-- ^ The /student-body/ & /time/, of the proposed /booking/.+	-> Bool+doAllCoursesSatifyingAnotherKnowledgeRequirementSpecifyThisTime problemParameters problemAnalysis subject (studentBody, time)	= Data.Set.member time (+	getSpecifiedTimes problemAnalysis+ ) {-required for efficiency-} && (+	Data.Foldable.any (+		Data.Foldable.all (+			Data.Course.isASpecifiedTime time+		) . (+			getSuitableCoursesByTeacherIdBySubjectByStudentBody problemAnalysis ! studentBody !+		) -- Check whether all possible courses matching this other subject-requirement, specify the same booking-time.+	) . Data.Set.filter (+		/= subject	-- Find the other subjects required by this student-body.+	) . Data.Student.deriveAmalgamatedKnowledgeRequirement $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters ! studentBody+ )++{- |+	* If the specified /teacher/ has a suitable personal /location/, then that is prefered.++	* Otherwise, returns a list of /locationId/s, of sufficient /capacity/, & offering the /facilities/ required by the /course/ corresponding to the specified /subject/.++	* CAVEAT: the list of /locationId/s returned isn't ordered by suitability.+-}+findSuitableLocations :: (+	Eq	level,+	Ord	locationId,+	Ord	teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Size.NStudents		-- ^ Required /capacity/.+	-> Data.Subject.Subject level	-- ^ The /subject/ to be taught.+	-> teacherId			-- ^ The /teacher/ who will be taking the /class/.+	-> [locationId]+findSuitableLocations ProblemConfiguration.ProblemParameters.MkProblemParameters {+	ProblemConfiguration.ProblemParameters.getLocationCatalogue	= locationCatalogue,+	ProblemConfiguration.ProblemParameters.getTeacherRegister	= teacherRegister+} requiredCapacity subject teacherId+	| Just ownLocationId	<- maybeOwnLocationId+	, Data.Location.isSuitable requiredCapacity requiredFacilityNames $ locationCatalogue ! ownLocationId	= [ownLocationId]	-- Confirm suitability of teacher's own location.+	| otherwise		= filter (+		`Data.Set.notMember` Aggregate.TeacherRegister.extractDistinctOwnLocationIds teacherRegister	-- Prevent squatting on another teacher's own location.+	) . Aggregate.LocationCatalogue.getLocationIds $ Aggregate.LocationCatalogue.findSuitableLocations requiredCapacity requiredFacilityNames locationCatalogue+	where+		(maybeOwnLocationId, requiredFacilityNames)	= Data.Teacher.getMaybeOwnLocationId . (teacherRegister !) &&& Data.Course.getRequiredFacilityNames . (Aggregate.TeacherRegister.findSuitableCourseByTeacherId requiredCapacity subject teacherRegister !) $ teacherId++{- |+	* Gets the combinations of possible /lesson/s, required by each /student-body/.++	* CAVEAT: though several /booking/s of a /lesson/ are typically required to satisfy the requirements of a single /course/,+	only one instance for each viable combination of locationId & teacherId, is returned.+-}+generateRequiredLessonCombinationsByStudentBody :: (+	Ord	level,+	Ord	locationId,+	Ord	teacherId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> LessonsByStudentBody locationId teacherId level+generateRequiredLessonCombinationsByStudentBody problemParameters	= Data.Map.mapWithKey (+	\studentBody studentProfile -> let+		requiredCapacity	= Aggregate.StudentBody.getSize studentBody+	in [+		Model.Lesson.MkLesson {+			Model.Lesson.getResourceIds	= StudentView.LessonResourceIds.MkLessonResourceIds locationId teacherId,+			Model.Lesson.getSubject		= subject+		} |+			subject				<- Data.Set.toList $ Data.Student.deriveAmalgamatedKnowledgeRequirement studentProfile,+			(teacherId, teacherProfile)	<- Data.Map.toList . Data.Map.filter (Data.Teacher.offersSuitableCourse requiredCapacity subject) $ ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters,+			locationId			<- findSuitableLocations problemParameters requiredCapacity subject teacherId,+			Data.Resource.isAvailable (+				studentProfile,+				teacherProfile,+				ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters ! locationId+			) -- Confirm mutual availability at some unspecified time.+	] -- A list-comprehension, which composes lessons from combinations of subjects, teacherIds & locationIds.+ ) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters++{- |+	* Calls 'generateRequiredLessonCombinationsByStudentBody' to get the combinations of possible /lesson/s, required by each /student-body/.++	* The list of /lesson/s for each /student-body/, is replicated & filtered for compatibility with each specific /day/.++	* /Day/s on which there're zero available /student-bodies/, & /student-bodies/ for which there're zero /lesson/s, are included to facilitate lookup.+-}+generateRequiredLessonCombinationsByStudentBodyAvailableByDay :: (+	Ord	level,+	Ord	locationId,+	Ord	synchronisationId,+	Ord	teacherId,+	Ord	timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> LessonsByStudentBodyByDay locationId teacherId level+generateRequiredLessonCombinationsByStudentBodyAvailableByDay problemParameters problemAnalysis	= Data.Map.fromList $ map (+	\day -> (+		day,+		Data.Map.mapWithKey (+			\studentBody -> filter (+				uncurry (&&) . (+					areAvailableResources problemParameters day studentBody &&& Data.Maybe.maybe False {-no course found for lesson-} (+						uncurry (&&) . (+							Data.Maybe.maybe True {-not a synchronised course-} (+								\synchronisationId -> Data.Foldable.all (+									uncurry (||) . (+										not . Data.Student.requiresAnySubjectBy (+											`Data.Set.member` Data.Set.map Data.Course.getSubject (+												Aggregate.TeacherRegister.findDistinctCoursesBySynchronisationId (getCoursesByTeacherIdBySynchronisationId problemAnalysis) ! synchronisationId+											)+										) &&& Data.Resource.isAvailableOn day+									) -- Check that all students who require this synchronised course are available.+								) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+							) . Data.Course.getMaybeSynchronisationId &&& uncurry (||) . (+								not . Data.Course.hasRigidlySpecifiedDays &&& Data.Course.isASpecifiedDay day+							) -- Ensure that the course can be booked today.+						) {-course-}+					) . lookupCourseFor problemParameters+				) {-lesson-}+			) -- Filter the list of lessons for this student-body.+		) $ generateRequiredLessonCombinationsByStudentBody problemParameters+	) -- Pair.+ ) Temporal.Day.range++-- | True if the specified /student-body/, & the /location/ & /teacher/ referenced in the proposed /lesson/, are regularly available on the specified /day/.+areAvailableResources+	:: (Ord locationId, Ord teacherId)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Temporal.Day.Day					-- ^ The /day/ on which we want to book a /lesson/.+	-> Aggregate.StudentBody.StudentBody+	-> StudentView.Lesson.Lesson locationId teacherId level	-- ^ The rendezvous we want to book.+	-> Bool+areAvailableResources problemParameters day studentBody studentLesson	= Data.Resource.isAvailableOn day (+	ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters ! StudentView.LessonResourceIds.getTeacherId resourceIds,+	ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters ! studentBody,+	ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters ! StudentView.LessonResourceIds.getLocationId resourceIds+ ) where+	resourceIds	= Model.Lesson.getResourceIds studentLesson++-- | True if the specified /human-resource/ is /available/ & not booked for a /meeting/ at the specified /time/.+isFree :: (+	Data.HumanResource.HumanResource	humanResource,+	Data.Resource.Resource			humanResource,+	Ord					timeslotId+ )+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Temporal.Time.Time timeslotId+	-> humanResource+	-> Bool+isFree problemParameters time	= uncurry (&&) . (+	Data.Resource.isAvailableOn (+		Temporal.Time.getDay time+	) &&& Data.Set.notMember time . Aggregate.GroupCatalogue.getMeetingTimes (+		ProblemConfiguration.ProblemParameters.getGroupCatalogue problemParameters+	) . Data.HumanResource.getGroupMembership+ )++-- | Get the number of /student/-places, when accounting for the capacity-limits imposed by both the /course/ & /location/; but not for any /student/s already booked.+countStudentPlaces+	:: Ord locationId+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Data.Course.Course synchronisationId level timeslotId	-- ^ The /course/ one wishes to query.+	-> locationId							-- ^ A specific /location/ in which the /course/ may be held.+	-> Size.NStudents+countStudentPlaces problemParameters course	= Data.Course.countStudentPlaces course . (ProblemConfiguration.ProblemParameters.getLocationCatalogue problemParameters !)++-- | Lookup the /course/ corresponding to the specified /lesson/.+lookupCourseFor+	:: (Eq level, Ord teacherId)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Lesson.Lesson locationId teacherId level+	-> Maybe (Data.Course.Course synchronisationId level timeslotId)	-- ^ The /course/ of which the /lesson/ may be a part.+lookupCourseFor problemParameters	= uncurry Data.Teacher.lookupCourseIn . (+	Model.Lesson.getSubject &&& (ProblemConfiguration.ProblemParameters.getTeacherRegister problemParameters !) . StudentView.LessonResourceIds.getTeacherId . Model.Lesson.getResourceIds+ )++{- |+	* Find the unique /course/ corresponding to the specified /studentViewLesson/.++	* CAVEAT: the specified /lesson/ is assumed to exist in the /timetable/, & therefore must have a corresponding /course/.+-}+findCourseFor+	:: (Eq level, Ord teacherId)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> StudentView.Lesson.Lesson locationId teacherId level		-- ^ The /studentViewLesson/ extracted from a /studentViewTimetable/.+	-> Data.Course.Course synchronisationId level timeslotId	-- ^ The /course/ of which the /lesson/ was a part.+findCourseFor problemParameters	= Data.Maybe.fromJust . lookupCourseFor problemParameters++-- | Find the unique /course/ corresponding to the specified /locationViewLesson/.+findCourseForLocationViewLesson+	:: (Eq level, Ord teacherId)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> locationId+	-> LocationView.Lesson.Lesson teacherId level+	-> Data.Course.Course synchronisationId level timeslotId+findCourseForLocationViewLesson problemParameters locationId	= findCourseFor	problemParameters . LocationView.Lesson.toStudentView locationId++-- | Find the unique /course/ corresponding to the specified /teacherViewLesson/.+findCourseForTeacherViewLesson+	:: (Eq level, Ord teacherId)+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> teacherId+	-> TeacherView.Lesson.Lesson locationId level+	-> Data.Course.Course synchronisationId level timeslotId+findCourseForTeacherViewLesson problemParameters teacherId	= findCourseFor	problemParameters . TeacherView.Lesson.toStudentView teacherId++-- | Find the set of distinct run-lengths of consecutive specified /time/s, occuring within any single /day/, for each distinct /course/.+findDistinctRunlengthsOfSpecifiedTimesByCourse :: (+	Enum	timeslotId,+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> DistinctTimeslotRunlengthsByCourse synchronisationId level timeslotId+findDistinctRunlengthsOfSpecifiedTimesByCourse	= Data.Map.fromList . map (+	id &&& Temporal.TimeslotRequest.findDistinctRunlengthsOfSpecifiedTimes . Data.Course.getTimeslotRequest+ ) . Data.Set.toList . Aggregate.TeacherRegister.extractDistinctCourses . ProblemConfiguration.ProblemParameters.getTeacherRegister++{- |+	Some /course/s may specify /time/s separated within a single /day/,+	which must be discovered to avoid erroneously downgrading those /timetable/s correctly booking /lesson/s in these /course/s.+-}+findCoursesRequestingSeparatedLessonsWithinAnyDay :: (+	Enum	timeslotId,+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Data.Set.Set (Data.Course.Course synchronisationId level timeslotId)+findCoursesRequestingSeparatedLessonsWithinAnyDay	= Data.Map.foldr (+	Data.Set.union . Data.Set.filter Data.Course.requestsSeparatedTimelotsWithinAnyDay . Data.Teacher.getService+ ) Data.Set.empty . ProblemConfiguration.ProblemParameters.getTeacherRegister++-- | Find the /subject/s offered by those /course/s which have an /ideal timeslot-request/.+findSubjectsWithAnIdealTimeslotRequest :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ ) => ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Data.Set.Set (Data.Subject.Subject level) {-coincidentally similar to Data.Subject.Knowledge-}+findSubjectsWithAnIdealTimeslotRequest	= Data.Set.map Data.Course.getSubject . Data.Set.filter (+	Temporal.TimeslotRequest.isIdeally . Data.Course.getTimeslotRequest+ ) . Aggregate.TeacherRegister.extractDistinctCourses . ProblemConfiguration.ProblemParameters.getTeacherRegister++{- |+	* Returns a map by /synchronisationId/, of /student-bodies/ who require a /subject/ from one of the corresponding /course/s.++	* If zero /student-bodies/ require any of the /subject/s offered with a specific /synchronisationId/, then an empty set exists in the returned map, rather than no entry at all.+-}+findStudentBodiesBySynchronisationId+	:: Ord level+	=> ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> StudentBodiesBySynchronisationId synchronisationId+findStudentBodiesBySynchronisationId problemParameters	= Data.Map.map (+	\synchronisedCoursesByTeacherId -> Data.Map.keysSet $ Data.Map.filter (+		Data.Foldable.any (+			`Data.Set.member` Data.Set.fromList (map Data.Course.getSubject $ Data.Map.elems synchronisedCoursesByTeacherId)+		) . Data.Student.deriveAmalgamatedKnowledgeRequirement+	) $ ProblemConfiguration.ProblemParameters.getStudentBodyRegister problemParameters+ ) . getCoursesByTeacherIdBySynchronisationId++-- | True if the specified /timeslotId/ falls within the range defined for a /day/.+isValidTimeslotId+	:: Eq timeslotId+	=> ProblemAnalysis level locationId synchronisationId teacherId timeslotId+	-> timeslotId+	-> Bool+isValidTimeslotId problemAnalysis	= (`elem` getTimeslotIdRange problemAnalysis)++-- | Returns the list of distinct /synchronisationId/s, specified amongst all /course/s.+findDistinctSynchronisationIds :: ProblemAnalysis level locationId synchronisationId teacherId timeslotId -> [synchronisationId]+findDistinctSynchronisationIds	= Data.Map.keys . getCoursesByTeacherIdBySynchronisationId+
+ src-lib/WeekDaze/ProblemConfiguration/ProblemParameters.hs view
@@ -0,0 +1,1695 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Encapsulates the data which defines the problem, rather than the solution-mechanism, or its presentation.+-}++module WeekDaze.ProblemConfiguration.ProblemParameters(+-- * Types+-- ** Data-types+	ProblemParameters(..),+-- * Constants+--	tag,+	timeslotIdBoundsTag,+--	groupTag,+--	locationTag,+--	studentBodyToProfileAssociationTag,+--	teacherTag,+--	minTag,+--	maxTag,+--	defaultGroupCatalogue,+-- * Functions+	calculateNTimeslotsPerDay,+--	calculateStudentWorkloadBounds,+	extractDistinctGroupMembership,+	findExcessTotalWorkloadByStudentBody,+	findHumanResourceIdsByGroupId,+--	findHumanResourcesOverloadedWithMeetings,+--	findSynchronousSeparateMandatoryMeetingsByTimeByHumanResourceId,+--	findSynchronousMeetingsByTimeByHumanResourceId,+	findSynchronousMeetingsByTimeByStudentBodyMnemonic,+	findSynchronousMeetingsByTimeByTeacherId,+--	findUnavailableDaysByGroupIdByHumanResourceId,+--	countNTimeslotsPerWeekForMeetings,+	reduceStudentBodyRegister,+	removeRedundantCourses,+	removePointlessGroups,+	removeUnsubscribedGroups,+	mergeConstraintsOnSynchronisedCourses,+	disableAnyValidationInappropriateForTemporaryStudentBodyMerger,+-- ** Predicates+	hasAnyFreePeriodPreference,+	hasVariousMinimumConsecutiveLessons+) where++import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import			Data.Set((\\))+import qualified	Control.Arrow+import qualified	Control.DeepSeq+import qualified	Control.Monad.Writer+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.List.Extra+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Ord+import qualified	Data.Set+import qualified	Factory.Data.Interval+import qualified	Text.XML.HXT.Arrow.Pickle					as HXT+import qualified	ToolShed.Data.Foldable+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.Pair+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Aggregate.GroupCatalogue				as Aggregate.GroupCatalogue+import qualified	WeekDaze.Aggregate.LocationCatalogue				as Aggregate.LocationCatalogue+import qualified	WeekDaze.Aggregate.StudentBody					as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentBodyRegister				as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Aggregate.StudentClass					as Aggregate.StudentClass+import qualified	WeekDaze.Aggregate.TeacherRegister				as Aggregate.TeacherRegister+import qualified	WeekDaze.Configuration						as Configuration+import qualified	WeekDaze.Data.Course						as Data.Course+import qualified	WeekDaze.Data.Group						as Data.Group+import qualified	WeekDaze.Data.HumanResource					as Data.HumanResource+import qualified	WeekDaze.Data.Location						as Data.Location+import qualified	WeekDaze.Data.Requirements					as Data.Requirements+import qualified	WeekDaze.Data.Resource						as Data.Resource+import qualified	WeekDaze.Data.Student						as Data.Student+import qualified	WeekDaze.Data.Subject						as Data.Subject+import qualified	WeekDaze.Data.Teacher						as Data.Teacher+import qualified	WeekDaze.ProblemConfiguration.ProblemValidationSwitches		as ProblemConfiguration.ProblemValidationSwitches+import qualified	WeekDaze.ProblemConfiguration.TimetableValidationSwitches	as ProblemConfiguration.TimetableValidationSwitches+import qualified	WeekDaze.ProblemConfiguration.ValidationSwitch			as ProblemConfiguration.ValidationSwitch+import qualified	WeekDaze.Size							as Size+import qualified	WeekDaze.Temporal.Availability					as Temporal.Availability+import qualified	WeekDaze.Temporal.Day						as Temporal.Day+import qualified	WeekDaze.Temporal.FreePeriodPreference				as Temporal.FreePeriodPreference+import qualified	WeekDaze.Temporal.Time						as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest				as Temporal.TimeslotRequest+import qualified	WeekDaze.Temporal.Workload					as Temporal.Workload+import			WeekDaze.Temporal.Workload((<+>))++#ifdef USE_HDBC+#ifdef QUERY_DB_CONCURRENTLY+import qualified	Control.Concurrent+#endif+import qualified	Control.Monad+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	Data.Typeable+import qualified	WeekDaze.Database.Selector					as Database.Selector++instance (+#ifdef QUERY_DB_CONCURRENTLY+	Control.DeepSeq.NFData			campus,+	Control.DeepSeq.NFData			level,+	Control.DeepSeq.NFData			locationId,+	Control.DeepSeq.NFData			stream,+	Control.DeepSeq.NFData			synchronisationId,+	Control.DeepSeq.NFData			teacherId,+	Control.DeepSeq.NFData			teachingRatio,+	Control.DeepSeq.NFData			timeslotId,+#endif+	Data.Convertible.Convertible		Database.HDBC.SqlValue campus,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue level,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue locationId,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue stream,			-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue synchronisationId,	-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue teacherId,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue teachingRatio,		-- Flexible context.+	Data.Convertible.Convertible		Database.HDBC.SqlValue timeslotId,		-- Flexible context.+	Data.Default.Default			campus,+	Data.Default.Default			stream,+	Data.Typeable.Typeable			teachingRatio,+	Ord					level,+	Ord					locationId,+	Ord					synchronisationId,+	Ord					teacherId,+	Ord					timeslotId,+	RealFrac				teachingRatio,+	Show					campus,+	Show					level,+	Show					locationId,+	Show					synchronisationId,+	Show					timeslotId+ ) => Database.Selector.Selector (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId) where+	fromDatabase connection	projectIdSql	= let+		timeslotIdBoundsTableName :: Database.Selector.TableName+		timeslotIdBoundsTableName	= Database.Selector.tablePrefix ++ timeslotIdBoundsTag+	 in do+		(problemValidationSwitches, timetableValidationSwitches)+#ifdef QUERY_DB_CONCURRENTLY+			<- Database.Selector.fromDatabaseConcurrently connection projectIdSql+#else+			<- Database.Selector.fromDatabase connection projectIdSql+#endif+		timeslotIdBoundsRows	<- map (+			map $ Data.Maybe.fromMaybe (+				error $ "WeekDaze.ProblemConfiguration.ProblemParameters.fromDatabase:\tnull " ++ show minTag ++ " or " ++ show maxTag ++ "."+			) . either (+				error . showString "WeekDaze.ProblemConfiguration.ProblemParameters.fromDatabase:\tfailed to parse the value for a timeslotId read from the database; " . show+			) id . Database.HDBC.safeFromSql+		 ) `fmap` Database.Selector.select connection [minTag, maxTag] [timeslotIdBoundsTableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++#ifdef QUERY_DB_CONCURRENTLY+		l	<- Control.Concurrent.newEmptyMVar+		t	<- Control.Concurrent.newEmptyMVar+		s	<- Control.Concurrent.newEmptyMVar+		g	<- Control.Concurrent.newEmptyMVar++		Database.Selector.queryConcurrently Aggregate.LocationCatalogue.fromDatabase connection projectIdSql l+		Database.Selector.queryConcurrently Aggregate.TeacherRegister.fromDatabase connection projectIdSql t+		Database.Selector.queryConcurrently Aggregate.StudentBodyRegister.fromDatabase connection projectIdSql s+		Database.Selector.queryConcurrently Aggregate.GroupCatalogue.fromDatabase connection projectIdSql g++		locationCatalogue	<- Control.Concurrent.takeMVar l+		teacherRegister		<- Control.Concurrent.takeMVar t+		studentBodyRegister	<- Control.Concurrent.takeMVar s+		groupCatalogue		<- Control.Concurrent.takeMVar g+#else+		locationCatalogue	<- Aggregate.LocationCatalogue.fromDatabase connection projectIdSql+		teacherRegister		<- Aggregate.TeacherRegister.fromDatabase connection projectIdSql+		studentBodyRegister	<- Aggregate.StudentBodyRegister.fromDatabase connection projectIdSql+		groupCatalogue		<- Aggregate.GroupCatalogue.fromDatabase connection projectIdSql+#endif+		Control.Monad.when (null timeslotIdBoundsRows) . error . showString "WeekDaze.ProblemConfiguration.ProblemParameters.fromDatabase:\tzero rows were selected from table " . shows timeslotIdBoundsTableName . showString " where " . showString Database.Selector.projectIdColumnName . showChar '=' $ Database.HDBC.fromSql projectIdSql++		let timeslotIdBoundsRow	= head timeslotIdBoundsRows	-- There can't be more than one if the database is correctly constrained.++		case timeslotIdBoundsRow of+			[minTimeslotId, maxTimeslotId]	-> return {-to IO-Monad-} MkProblemParameters {+				getProblemValidationSwitches	= problemValidationSwitches,+				getTimetableValidationSwitches	= timetableValidationSwitches,+				getTimeslotIdBounds		= (minTimeslotId, maxTimeslotId),+				getLocationCatalogue		= locationCatalogue,+				getTeacherRegister		= teacherRegister,+				getStudentBodyRegister		= studentBodyRegister,+				getGroupCatalogue		= groupCatalogue+			}+			_				-> error . showString "WeekDaze.ProblemConfiguration.ProblemParameters.fromDatabase:\tunexpected number of columns=" . shows (length timeslotIdBoundsRow) . showString " in row of table " $ shows timeslotIdBoundsTableName "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag					= "problemParameters"++-- | Used to qualify XML.+timeslotIdBoundsTag :: String+timeslotIdBoundsTag			= "timeslotIdBounds"++-- | Used to qualify XML.+groupTag :: String+groupTag				= "group"++-- | Used to qualify XML.+locationTag :: String+locationTag				= "location"++-- | Used to qualify XML.+studentBodyToProfileAssociationTag :: String+studentBodyToProfileAssociationTag	= "studentBodyToProfileAssociation"++-- | Used to qualify XML.+teacherTag :: String+teacherTag				= "teacher"++-- | Used to qualify SQL & XML.+minTag :: String+minTag					= "min"++-- | Used to qualify SQL & XML.+maxTag :: String+maxTag					= "max"++-- | Default value for a 'getGroupCatalogue'.+defaultGroupCatalogue :: Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId+defaultGroupCatalogue	= Data.Map.empty++-- | Encapsulates the data which defines the problem.+data ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId	= MkProblemParameters {+	getProblemValidationSwitches	:: ProblemConfiguration.ProblemValidationSwitches.ProblemValidationSwitches,						-- ^ Defines toggle-switches governing validity-checks.+	getTimetableValidationSwitches	:: ProblemConfiguration.TimetableValidationSwitches.TimetableValidationSwitches,					-- ^ Defines toggle-switches governing validity-checks.+	getTimeslotIdBounds		:: Factory.Data.Interval.Interval timeslotId,										-- ^ The closed bounds, defining the /timeslot-id/s, in any /day/.+	getLocationCatalogue		:: Aggregate.LocationCatalogue.LocationCatalogue locationId campus,							-- ^ Defines the profiles of available /location/s, indexed by /location-id/.+	getTeacherRegister		:: Aggregate.TeacherRegister.TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio,	-- ^ Defines the profiles of /teacher/s, indexed by /teacher-id/.+	getStudentBodyRegister		:: Aggregate.StudentBodyRegister.StudentBodyRegister level stream teachingRatio,					-- ^ Defines the common profile of /student/s, indexed by the mnemonic of the /student-body/ of which they're all members.+	getGroupCatalogue		:: Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId							-- ^ Defines the /group/s of which any /student/ or /teacher/ may be a member.+} deriving (Eq, Show)++instance (+	Data.Default.Default	campus,+	Data.Default.Default	stream,+	Eq			campus,+	Eq			stream,+	HXT.XmlPickler		campus,+	HXT.XmlPickler		level,+	HXT.XmlPickler		locationId,+	HXT.XmlPickler		stream,+	HXT.XmlPickler		synchronisationId,+	HXT.XmlPickler		teacherId,+	HXT.XmlPickler		teachingRatio,+	HXT.XmlPickler		timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			synchronisationId,+	Ord			teacherId,+	Ord			timeslotId,+	Real			teachingRatio,+	Show			campus,+	Show			level,+	Show			synchronisationId,+	Show			timeslotId+ ) => HXT.XmlPickler (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, g)	-> MkProblemParameters a b c d e f g,	-- Construct from a tuple.+		\MkProblemParameters {+			getProblemValidationSwitches	= problemValidationSwitches,+			getTimetableValidationSwitches	= timetableValidationSwitches,+			getTimeslotIdBounds		= timeslotIdBounds,+			getLocationCatalogue		= locationCatalogue,+			getTeacherRegister		= teacherRegister,+			getStudentBodyRegister		= studentBodyRegister,+			getGroupCatalogue		= groupCatalogue+		} -> (+			problemValidationSwitches,+			timetableValidationSwitches,+			timeslotIdBounds,+			locationCatalogue,+			teacherRegister,+			studentBodyRegister,+			groupCatalogue+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp7Tuple (+		HXT.xpDefault Data.Default.def HXT.xpickle {-ProblemValidationSwitches-}+	 ) (+		HXT.xpDefault Data.Default.def HXT.xpickle {-TimetableValidationSwitches-}+	 ) (+		HXT.xpElem timeslotIdBoundsTag $ HXT.xpElem minTag HXT.xpickle `HXT.xpPair` HXT.xpElem maxTag HXT.xpickle+	 ) (+		HXT.xpElem Aggregate.LocationCatalogue.tag . HXT.xpWrap (+			Data.Map.fromList,	-- Construct from an association-list.+			Data.Map.toList		-- Deconstruct to an association-list.+		) . HXT.xpList1 {-can't be null-} $ HXT.xpElem locationTag HXT.xpickle {-Pair-}+	 ) (+		HXT.xpElem Aggregate.TeacherRegister.tag . HXT.xpWrap (+			Data.Map.fromList,	-- Construct from an association-list.+			Data.Map.toList		-- Deconstruct to an association-list.+		) . HXT.xpList1 {-can't be null-} $ HXT.xpElem teacherTag HXT.xpickle {-Pair-}+	 ) (+		HXT.xpElem Aggregate.StudentBodyRegister.tag . HXT.xpWrap (+			Data.Map.fromList,	-- Construct from an association-list.+			Data.Map.toList		-- Deconstruct to an association-list.+		) . HXT.xpList1 {-can't be null-} $ HXT.xpElem studentBodyToProfileAssociationTag HXT.xpickle {-Pair-}+	 ) (+		HXT.xpDefault defaultGroupCatalogue . HXT.xpElem Aggregate.GroupCatalogue.tag $ HXT.xpMap groupTag Data.Group.groupIdTag HXT.xpText {-can't be null-} HXT.xpickle {-Profile-}+	 )++instance (+	Control.DeepSeq.NFData	campus,+	Control.DeepSeq.NFData	level,+	Control.DeepSeq.NFData	locationId,+	Control.DeepSeq.NFData	stream,+	Control.DeepSeq.NFData	synchronisationId,+	Control.DeepSeq.NFData	teacherId,+	Control.DeepSeq.NFData	teachingRatio,+	Control.DeepSeq.NFData	timeslotId+ ) => Control.DeepSeq.NFData (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId) where+	rnf (MkProblemParameters x0 x1 x2 x3 x4 x5 x6)	= Control.DeepSeq.rnf (x0, x1, x2, x3, x4, x5, x6)++{- |+	* Get the length of the list defined by the specified bounds.++	* CAVEAT: this implementation accounts for the potential fence-post error when called for a closed interval of 'Integral' timeslots,+	but will result in an equivalent error if (bizarrely) called for an interval of 'Fractional' quantities.+	Regrettably, it can't be restricted to 'Integral', because it may legitimately be required to work with 'Char'.+-}+calculateNTimeslotsPerDay :: Enum timeslotId => Factory.Data.Interval.Interval timeslotId -> Size.NTimeslots+calculateNTimeslotsPerDay	= succ . uncurry (flip (-)) . (fromEnum *** fromEnum)++{- |+	* Total the workload of the core & optional /subject-requirements/, for the specified /student-profile/.++	* Since each /course/ may be offered by more than one /teacher/, the actual workload can only be constrained within bounds.++	* CAVEAT: assumes that all requested /subject/s, exist amongst the /course/s offered by /teacher/s.+-}+calculateStudentWorkloadBounds :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	timeslotId+ )+	=> Aggregate.TeacherRegister.TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio+	-> Data.Student.Profile level stream teachingRatio+	-> Data.Requirements.Requirements Temporal.Workload.Bounds+calculateStudentWorkloadBounds teacherRegister	= ToolShed.Data.Pair.mirror (+	Data.Foldable.foldr (+		\subject -> ((Aggregate.TeacherRegister.calculateWorkloadBoundsBySubject teacherRegister ! subject) <+>)+	) Temporal.Workload.unloaded+ ) . Data.Student.getKnowledgeRequirements++-- | Finds /student-bodies/, who've requested more /subject/s (both core & optional), than can be taught by the /course/s on offer, in the time allocated to tuition.+findExcessTotalWorkloadByStudentBody :: (+	Enum		timeslotId,+	Ord		level,+	Ord		synchronisationId,+	Ord		timeslotId,+	RealFrac	teachingRatio+ ) => ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Data.Map.Map Aggregate.StudentBody.StudentBody Size.NTimeslots+findExcessTotalWorkloadByStudentBody problemParameters	= Data.Map.filter (> 0) $ Data.Map.map (+	uncurry (-) . (+		(+			Temporal.Workload.getMinimum {-select the shortest courses offered-} . uncurry (<+>)	-- Add the workloads associated with core & optional subject-requirements.+		) . calculateStudentWorkloadBounds (+			getTeacherRegister problemParameters+		) &&& Data.HumanResource.getNTimeslotsPerWeekOfTeaching (+			calculateNTimeslotsPerDay $ getTimeslotIdBounds problemParameters+		)+	)+ ) $ getStudentBodyRegister problemParameters++-- | Finds the set of /group/s, of which a /human-resource/ claims membership.+extractDistinctGroupMembership :: RealFrac teachingRatio => ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Data.Group.Membership+extractDistinctGroupMembership	= uncurry Data.Set.union . (Data.HumanResource.extractDistinctGroupMembership . getStudentBodyRegister &&& Data.HumanResource.extractDistinctGroupMembership . getTeacherRegister)++{- |+	* For each /human-resource/, identifies /time/s at which they're required to attend more than one meeting, in separate /location/s,+	for any of the /group/s of which they're a member.++	* Also returns the offending /group-id/s & /location-id/s.+-}+findSynchronousSeparateMandatoryMeetingsByTimeByHumanResourceId :: (+	Data.HumanResource.HumanResource	humanResource,+	Ord					locationId,+	Ord					timeslotId+ )+	=> Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId+	-> Data.Resource.ResourceMap humanResourceId humanResource+	-> Data.Map.Map humanResourceId (Data.Map.Map (Temporal.Time.Time timeslotId) [(Data.Group.Id, locationId)])+findSynchronousSeparateMandatoryMeetingsByTimeByHumanResourceId groupCatalogue	= Data.Map.filter (+	not . Data.Map.null	-- Leave only those human-resources with a scheduling-conflict.+ ) . Data.Map.map (+	Data.Map.filter (+		(> 1) . length . Data.List.Extra.groupSortOn snd {-locationId-}	-- More than one location specified for this human-resource & time.+	) . Data.Map.map (+		Data.Map.toList . Data.Map.map (+			Data.Maybe.fromJust . fst {-locationId-}	-- Reduce to 'Map groupId locationId'.+		) . Data.Map.filter (+			uncurry (&&) . Control.Arrow.first {-Maybe locationId-} Data.Maybe.isJust	-- Ensure there's both a defined location & that attendance is mandated.+		) . Data.Map.map (+			Data.Group.getMaybeLocationId &&& Data.Group.getMandatesAttendance	-- Construct 'Map groupId (maybe locationId, mandatesAttendance)'.+		) . Data.Map.fromList {-Construct 'Map groupId groupProfile'-}+	) . Data.Foldable.foldr (+		\groupId m	-> let+			groupProfile	= groupCatalogue ! groupId+		in Data.Foldable.foldr (+			Data.Map.insertWith (++) `flip` [(groupId, groupProfile)]+		) m $ Data.Group.getMeetingTimes groupProfile+	) Data.Map.empty . Data.HumanResource.getGroupMembership+ )++{- |+	* For each /human-resource/, identifies /time/s at which they have attend more than one meeting.+	for any of the /group/s of which they're a member.++	* Returns the offending /group-id/s.+-}+findSynchronousMeetingsByTimeByHumanResourceId :: (+	Data.HumanResource.HumanResource	humanResource,+	Ord					timeslotId+ )+	=> Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId+	-> Data.Resource.ResourceMap humanResourceId humanResource+	-> Data.Map.Map humanResourceId (Data.Map.Map (Temporal.Time.Time timeslotId) [Data.Group.Id])+findSynchronousMeetingsByTimeByHumanResourceId groupCatalogue	= Data.Map.filter (+	not . Data.Map.null	-- Leave only those human-resources with a scheduling-conflict.+ ) . Data.Map.map (+	Data.Map.filter (+		(> 1) . length	-- Select human-resources with more than one meeting @ this time.+	) . Data.Foldable.foldr (+		\groupId m	-> Data.Foldable.foldr (+			Data.Map.insertWith (++) `flip` [groupId]+		) m . Data.Group.getMeetingTimes $ groupCatalogue ! groupId+	) Data.Map.empty . Data.HumanResource.getGroupMembership+ )++{- |+	* For each /student-body/, identifies /time/s at which they have attend more than one meeting.+	for any of the /group/s of which they're a member.++	* Returns the offending /group-id/s.+-}+findSynchronousMeetingsByTimeByStudentBodyMnemonic :: (+	Ord		timeslotId,+	RealFrac	teachingRatio+ )+	=> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Data.Map.Map Aggregate.StudentBody.StudentBody (Data.Map.Map (Temporal.Time.Time timeslotId) [Data.Group.Id])+findSynchronousMeetingsByTimeByStudentBodyMnemonic	= uncurry findSynchronousMeetingsByTimeByHumanResourceId . (getGroupCatalogue &&& getStudentBodyRegister)++{- |+	* For each /teacherId/, identifies /time/s at which they have attend more than one meeting.+	for any of the /group/s of which they're a member.++	* Returns the offending /group-id/s.+-}+findSynchronousMeetingsByTimeByTeacherId :: (+	Ord		timeslotId,+	RealFrac	teachingRatio+ )+	=> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Data.Map.Map teacherId (Data.Map.Map (Temporal.Time.Time timeslotId) [Data.Group.Id])+findSynchronousMeetingsByTimeByTeacherId	= uncurry findSynchronousMeetingsByTimeByHumanResourceId . (getGroupCatalogue &&& getTeacherRegister)++-- | Identifies those /human-resource/s commited to more /meeting/s than their non-teaching time can accommodate.+findHumanResourcesOverloadedWithMeetings :: (+	Data.Resource.Resource			humanResource,+	Data.HumanResource.HumanResource	humanResource+ )+	=> Size.NTimeslots+	-> Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId+	-> Data.Resource.ResourceMap humanResourceId humanResource+	-> Data.Map.Map humanResourceId (Size.NTimeslots, Size.NTimeslots)+findHumanResourcesOverloadedWithMeetings nTimeslotsPerDay groupCatalogue	= Data.Map.filter (+	uncurry (>)+ ) . Data.Map.map (+	countNTimeslotsPerWeekForMeetings groupCatalogue &&& Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching nTimeslotsPerDay+ )++{- |+	* Identifies for each /human-resource/, any /day/s on which they're unavailable for the meetings of the mandatory-attendance /group/s, of which they're members.++	* CAVEAT: only /human-resource/s unable to attend a meeting, appear in the results.+-}+findUnavailableDaysByGroupIdByHumanResourceId :: (+#if !MIN_VERSION_containers(0,5,2)+	Ord					timeslotId,	-- Not required after "Data.Set-7.8.1".+#endif+	Data.Resource.Resource			humanResource,+	Data.HumanResource.HumanResource	humanResource+ )+	=> Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId+	-> Data.Resource.ResourceMap humanResourceId humanResource+	-> Data.Map.Map humanResourceId (Data.Map.Map Data.Group.Id (Data.Set.Set Temporal.Day.Day))+findUnavailableDaysByGroupIdByHumanResourceId groupCatalogue	= Data.Map.filter (+	not . Data.Map.null	-- Purge humanResourceIds, who can attend all meetings of their mandatory-attendance groups.+ ) . Data.Map.map (+	\humanResource -> Data.Map.filter (+		not . Data.Set.null	-- Purge those groupIds, where the human-resource is fully available for all mandatory meetings.+	) . Data.Map.map (+		Data.Set.filter (+			not . (`Data.Resource.isAvailableOn` humanResource)+		) . Data.Set.map Temporal.Time.getDay . Data.Group.getMeetingTimes+	) . Data.Map.filter Data.Group.getMandatesAttendance . Data.Map.fromList . map (+		id &&& (groupCatalogue !)	-- Find the group-association.+	) . Data.Set.toList $ Data.HumanResource.getGroupMembership humanResource+ )++-- | Finds the members (/student-bodies/, /teacher/s) of each /group/.+findHumanResourceIdsByGroupId :: (Ord teacherId, RealFrac teachingRatio)+	=> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> (Aggregate.GroupCatalogue.ResourceIdsByGroupId Aggregate.StudentBody.StudentBody, Aggregate.GroupCatalogue.ResourceIdsByGroupId teacherId)+findHumanResourceIdsByGroupId	= findHumanResourceIdsByGroupId' . getStudentBodyRegister &&& findHumanResourceIdsByGroupId' . getTeacherRegister where+	findHumanResourceIdsByGroupId' :: (Data.HumanResource.HumanResource humanResource, Ord humanResourceId) => Data.Resource.ResourceMap humanResourceId humanResource -> Aggregate.GroupCatalogue.ResourceIdsByGroupId humanResourceId+	findHumanResourceIdsByGroupId'	= Data.Map.foldrWithKey (+		\humanResourceId humanResource m	-> Data.Foldable.foldr (+			($ Data.Set.singleton humanResourceId) . Data.Map.insertWith Data.Set.union+		) m $ Data.HumanResource.getGroupMembership humanResource+	 ) Data.Map.empty++{- |+	* The number of /time-slot/s per week, which this /human-resource/ regularly requires, for the meetings of all /groups/ of which they're a member.++	* CAVEAT: days on which the /resource/ is unavailable, aren't counted on the assumption that this is because attendance for that group isn't mandatory.+-}+countNTimeslotsPerWeekForMeetings :: (+	Data.Resource.Resource			humanResource,+	Data.HumanResource.HumanResource	humanResource+ )+	=> Aggregate.GroupCatalogue.GroupCatalogue timeslotId locationId+	-> humanResource+	-> Size.NTimeslots+countNTimeslotsPerWeekForMeetings groupCatalogue humanResource	= Data.Foldable.foldr (+	(+) . Data.Set.size . Data.Set.filter (+		(`Data.Resource.isAvailableOn` humanResource) . Temporal.Time.getDay+	) . Data.Group.getMeetingTimes . (+		groupCatalogue !+	)+ ) 0 $ Data.HumanResource.getGroupMembership humanResource++instance (+	Enum		timeslotId,+	Ord		level,+	Ord		locationId,+	Ord		stream,+	Ord		synchronisationId,+	Ord		teacherId,+	Ord		timeslotId,+	RealFrac	teachingRatio,+	Show		level,+	Show		locationId,+	Show		stream,+	Show		synchronisationId,+	Show		teacherId,+	Show		teachingRatio,+	Show		timeslotId+ ) => ToolShed.SelfValidate.SelfValidator (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId) where+	getErrors problemParameters@MkProblemParameters {+		getProblemValidationSwitches	= problemValidationSwitches,+		getTimeslotIdBounds		= timeslotIdBounds,+		getLocationCatalogue		= locationCatalogue,+		getGroupCatalogue		= groupCatalogue,+		getTeacherRegister		= teacherRegister,+		getStudentBodyRegister		= studentBodyRegister+	} = ToolShed.SelfValidate.extractErrors [++-- Check 'getTimeslotIdBounds'.+		(+			ProblemConfiguration.ProblemValidationSwitches.getCheckTimeslotIdBounds problemValidationSwitches && nTimeslotsPerDay < 1,+			show timeslotIdBoundsTag ++ " are too narrow; " ++ show timeslotIdBounds+		),++-- Check that resource-maps have been defined.+		(+			ProblemConfiguration.ProblemValidationSwitches.getCheckNullLocationCatalogue problemValidationSwitches && Data.Map.null locationCatalogue,+			show ProblemConfiguration.ProblemValidationSwitches.checkNullLocationCatalogueTag ++ ": zero locations have been defined"+		), (+			ProblemConfiguration.ProblemValidationSwitches.getCheckNullTeacherRegister problemValidationSwitches && Data.Map.null teacherRegister,+			show ProblemConfiguration.ProblemValidationSwitches.checkNullTeacherRegisterTag ++ ": zero teachers have been defined"+		), (+			ProblemConfiguration.ProblemValidationSwitches.getCheckNullStudentBodyRegister problemValidationSwitches && Data.Map.null studentBodyRegister,+			show ProblemConfiguration.ProblemValidationSwitches.checkNullStudentBodyRegisterTag ++ ": zero student-bodies have been defined"+		), (+			ProblemConfiguration.ProblemValidationSwitches.getCheckNullGroupId problemValidationSwitches && Data.Map.member "" groupCatalogue,+			show ProblemConfiguration.ProblemValidationSwitches.checkNullGroupIdTag ++ ": null identifier in " ++ show Aggregate.GroupCatalogue.tag+		),++-- Check course-definitions.+		let+--			isValid :: timeslotId -> Bool+			isValid	= (`Factory.Data.Interval.elem'` timeslotIdBounds)++			coursesWithIllDefinedTimeslotRequests	= Data.Set.filter (+				\course -> case Data.Course.getTimeslotRequest course of+					Temporal.TimeslotRequest.Ideally idealTimeslotId	-> not $ isValid idealTimeslotId+					Temporal.TimeslotRequest.Specifically specifiedTimes	-> Data.Foldable.any (not . isValid . Temporal.Time.getTimeslotId) specifiedTimes+			 ) $ Aggregate.TeacherRegister.extractDistinctCourses teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckTimeslotRequests problemValidationSwitches && not (Data.Set.null coursesWithIllDefinedTimeslotRequests),+			show ProblemConfiguration.ProblemValidationSwitches.checkTimeslotRequestsTag ++ ": the timeslot-request for a course, specifies times outside permissible bounds " ++ show timeslotIdBounds ++ "; " ++ show (Data.Set.toList coursesWithIllDefinedTimeslotRequests)+		),+		let+			coursesWithExcessiveMinimumConsecutiveDays	= Data.Set.filter (+				(> nTimeslotsPerDay) . Data.Course.getMinimumConsecutiveLessons+			 ) $ Aggregate.TeacherRegister.extractDistinctCourses teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckMinimumConsecutiveLessons problemValidationSwitches && not (Data.Set.null coursesWithExcessiveMinimumConsecutiveDays),+			show ProblemConfiguration.ProblemValidationSwitches.checkMinimumConsecutiveLessonsTag ++ ": the minimum consecutive lessons for a course, can't exceed the number of time-slots per day " ++ show nTimeslotsPerDay ++ "; " ++ show (Data.Set.toList coursesWithExcessiveMinimumConsecutiveDays)+		),+		let+			excessiveLessonsPerWeekByTeacherId	= Data.Map.filter (+				not . null+			 ) $ Data.Map.map (+				\teacherProfile -> filter (+					> Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay teacherProfile+				) . map Data.Course.getRequiredLessonsPerWeek . Data.Set.toList $ Data.Teacher.getService teacherProfile+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckRequiredLessonsPerWeek problemValidationSwitches && not (Data.Map.null excessiveLessonsPerWeekByTeacherId),+			show ProblemConfiguration.ProblemValidationSwitches.checkRequiredLessonsPerWeekTag ++ ": some teachers offer courses which individually require more lessons per week than they teach; " ++ show (Data.Map.toList excessiveLessonsPerWeekByTeacherId)	-- This could be checked in module "Data.Teacher", but the teacherId isn't available there.+		),+		let+			teachersOfferingMultipleCoursesPerSynchronisationId	= Data.Map.filter (not . null) $ Data.Map.map (+				map head . filter (+					(/= 1) . length	-- Select those teachers referencing a synchronisationId from different courses.+				) . ToolShed.Data.Foldable.gather . Data.Maybe.mapMaybe Data.Course.getMaybeSynchronisationId . Data.Set.toList . Data.Teacher.getService+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForMultipleCoursesPerTeacherPerSynchronisationId problemValidationSwitches && not (Data.Map.null teachersOfferingMultipleCoursesPerSynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForMultipleCoursesPerTeacherPerSynchronisationIdTag ++ ": some teachers offer multiple courses with the same synchronisationId; " ++ show (Data.Map.toList teachersOfferingMultipleCoursesPerSynchronisationId)+		),+		let+			singletonTeachersBySynchronisationId	= Data.Map.map head . Data.Map.filter ((== 1) . length) $ Data.Map.map Data.Map.keys coursesByTeacherIdBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSingletonSynchronisedCourses problemValidationSwitches && not (Data.Map.null singletonTeachersBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSingletonSynchronisedCoursesTag ++ ": some synchronisationIds, are only referenced by the relevant courses of a single teacher; " ++ show (Data.Map.toList singletonTeachersBySynchronisationId)+		),+		let+			differentLessonsPerWeekByTeacherIdBySynchronisationId	= Data.Map.filter (+				(> 1) . Data.Set.size . Data.Set.fromList . Data.Map.elems	-- Select those synchronised courses which required more than one distinct number of lessons per week.+			 ) $ Data.Map.map (+				Data.Map.map Data.Course.getRequiredLessonsPerWeek+			 ) coursesByTeacherIdBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek problemValidationSwitches && not (Data.Map.null differentLessonsPerWeekByTeacherIdBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithDifferentLessonsPerWeekTag ++ ": some synchronised courses, require different numbers of lessons per week; " ++ show (Data.Map.toList $ Data.Map.map Data.Map.toList differentLessonsPerWeekByTeacherIdBySynchronisationId)+		),+		let+			differentIdealTimeslotIdsBySynchronisationId	= Data.Map.filter (+				(> 1) . Data.Set.size	-- Select those synchronised courses which specify more than one distinct ideal timeslotId.+			 ) $ Data.Map.map (+				Data.Set.map Data.Maybe.fromJust . Data.Set.filter Data.Maybe.isJust . Data.Set.map (+					Temporal.TimeslotRequest.getMaybeIdealTimeslotId . Data.Course.getTimeslotRequest+				)+			 ) distinctCoursesBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithDifferentIdealTimeslots problemValidationSwitches && not (Data.Map.null differentIdealTimeslotIdsBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithDifferentIdealTimeslotsTag ++ ": the members of some sets of synchronised courses, have different ideal timeslot-identifiers; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList differentIdealTimeslotIdsBySynchronisationId)+		),+		let+			excessSpecifiedTimesBySynchronisationId	= Data.Map.filter (+				uncurry (<)	-- Select those synchronised courses which specify too many booking-times.+			 ) $ Data.Map.map (+				(+					minimum {-requiredLessonsPerWeek-} *** Data.Set.size . Data.Set.unions {-number of distinct specified times-}+				) . unzip . Data.Set.toList . Data.Set.map (+					Data.Course.getRequiredLessonsPerWeek &&& Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest+				) {-typically reduces the set to a singleton-}+			 ) distinctCoursesBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithExcessSpecifiedTimes problemValidationSwitches && not (Data.Map.null excessSpecifiedTimesBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithExcessSpecifiedTimesTag ++ ": some synchronised courses require fewer lessons per week, than they have specified booking-times; " ++ show (Data.Map.toList excessSpecifiedTimesBySynchronisationId)+		),+		let+			availableVsRequiredLessonsBySynchronisationId	= Data.Map.filter (+				uncurry (<)+			 ) . Data.Map.map (+				Control.Arrow.first $ (* nTimeslotsPerDay) . Temporal.Availability.countDaysPerWeekAvailable+			 ) . Data.Map.unionWith (+				\(availability, requiredLessons)	-> Temporal.Availability.findIntersection availability *** max requiredLessons {-they should all be the same-}+			 ) (+				Data.Map.mapWithKey (+					\synchronisationId -> (,) (+						Data.Resource.getAvailability $ Data.Map.filter (+							Data.Student.requiresAnySubjectBy (+								`Data.Set.member` Data.Set.map Data.Course.getSubject (+									distinctCoursesBySynchronisationId ! synchronisationId+								)+							)+						) studentBodyRegister+					) . Data.Set.findMax {-they should all be the same-} . Data.Set.map Data.Course.getRequiredLessonsPerWeek+				) distinctCoursesBySynchronisationId+			 ) $ Data.Map.map (+				Data.Resource.getAvailability . map (+					teacherRegister !+				) . Data.Map.keys {-teacherIds-} &&& Data.Foldable.maximum {-they should all be the same-} . Data.Map.map Data.Course.getRequiredLessonsPerWeek+			 ) coursesByTeacherIdBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithExcessLessonsPerWeek problemValidationSwitches && not (Data.Map.null availableVsRequiredLessonsBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithExcessLessonsPerWeekTag ++ ": the number of time-slots when the interested student-bodies & required teachers, are simultaneously available, is fewer than the required lessons of some synchronised courses; " ++ show (Data.Map.toList availableVsRequiredLessonsBySynchronisationId)+		),+		let+			unavailableSpecifiedDaysByTeacherIdBySynchronisationId	= Data.Map.filter (+				not . Data.Map.null	-- Select the synchronisationId of courses taught by one or more unavailable teachers.+			 ) $ Data.Map.map (+				Data.Map.filter (+					not . Data.Set.null	-- Select teachers who're unavailable on one or more days.+				) . Data.Map.mapWithKey (+					\teacherId -> Data.Set.filter (+						not . (+							`Data.Resource.isAvailableOn` (teacherRegister ! teacherId)+						)+					) . Data.Set.map Temporal.Time.getDay . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest+				)+			 ) coursesByTeacherIdBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays problemValidationSwitches && not (Data.Map.null unavailableSpecifiedDaysByTeacherIdBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag ++ ": some synchronised courses, specify booking-times on days when not all the required teachers are available; " ++ show (+				Data.Map.toList $ Data.Map.map (+					Data.Map.toList . Data.Map.map Data.Set.toList+				) unavailableSpecifiedDaysByTeacherIdBySynchronisationId+			)+		),+		let+			unavailableStudentBodiesBySpecifiedDaysBySynchronisationId	= Data.Map.filter (+				not . Data.Map.null	-- Select the synchronisationId of courses required on one or more unavailable days.+			 ) $ Data.Map.mapWithKey (+				\synchronisationId -> Data.Map.filter (+					not . null	-- Select the days on which one or more student-bodies are unavailable.+				) . Data.Map.fromList . map (+					\day -> (+						day,+						Data.Map.keys $ Data.Map.filter (+							uncurry (&&) . (+								not . Data.Resource.isAvailableOn day &&& Data.Student.requiresAnySubjectBy (+									`Data.Set.member` Data.Set.map Data.Course.getSubject (+										distinctCoursesBySynchronisationId ! synchronisationId+									)+								)+							)+						) studentBodyRegister+					)+				) . Data.Set.toList . Data.Set.unions . map (+					Data.Set.map Temporal.Time.getDay . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest+				) . Data.Set.toList+			 ) distinctCoursesBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays problemValidationSwitches && not (Data.Map.null unavailableStudentBodiesBySpecifiedDaysBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag ++ ": some synchronised courses, are requested by student-bodies who're unavailable on days when booking-times have been specified; " ++ show (+				Data.Map.toList $ Data.Map.map (+					Data.Map.toList . Data.Map.map (map Aggregate.StudentBody.getMnemonic)+				) unavailableStudentBodiesBySpecifiedDaysBySynchronisationId+			)+		),+		let+			excessTimeslotRequestsBySynchronisationId	= Data.Map.filter (+				uncurry (&&) . (not . null *** not . null)	-- Select synchronisationIds whose courses define both ideal timeslots & specify times.+			 ) $ Data.Map.map (+				(+					ToolShed.Data.List.nub' . Data.Maybe.catMaybes *** Data.Set.toList . Data.Set.unions+				) . unzip . Data.Set.toList . Data.Set.map (+					(+						Temporal.TimeslotRequest.getMaybeIdealTimeslotId &&& Temporal.TimeslotRequest.getSpecifiedTimes+					) . Data.Course.getTimeslotRequest+				)+			 ) distinctCoursesBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithExcessTimeslotRequests problemValidationSwitches && not (Data.Map.null excessTimeslotRequestsBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithExcessTimeslotRequestsTag ++ ": some synchronised courses, define both ideal timeslot-Ids & specify booking-times; " ++ show (Data.Map.toList excessTimeslotRequestsBySynchronisationId)+		),+		let+			subjectsByStudentBodyBySynchronisationId	= Data.Map.filter (+				not . Data.Map.null	-- Select synchronisationIds, where there's an issue with some student-bodies.+			 ) $ Data.Map.mapWithKey (+				\synchronisationId -> Data.Map.filter (+					(> 1) . Data.Set.size	-- Select student-bodies requiring more than one subject from this set of synchronised courses.+				) . Data.Map.map (+					Data.Set.filter (+						\subject -> not $ Data.Foldable.any (+							Data.Foldable.any (+								uncurry (&&) . (+									(/= Just synchronisationId) . Data.Course.getMaybeSynchronisationId &&& (== subject) . Data.Course.getSubject+								)+							) . Data.Teacher.getService+						) teacherRegister	-- Check for any teachers offering this subject outside of this set of synchronised courses.+					)+				) . Data.Map.unionsWith Data.Set.union . map (+					\synchronisedCourse -> Data.Map.filter (+						not . Data.Set.null	-- Select student-bodies requiring this course's subject; there shouldn't be more than one.+					) $ Data.Map.map (+						Data.Set.filter (== Data.Course.getSubject synchronisedCourse) . Data.Student.deriveAmalgamatedKnowledgeRequirement+					) studentBodyRegister+				) . Data.Set.toList+			 ) distinctCoursesBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForStudentsRequiringMultipleSynchronisedSubjects problemValidationSwitches && not (Data.Map.null subjectsByStudentBodyBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForStudentsRequiringMultipleSynchronisedSubjectsTag ++ ": some student-bodies require multiple subjects only offered within one set of synchronised courses; " ++ show (+				Data.Map.toList $ Data.Map.map (+					map (Aggregate.StudentBody.getMnemonic *** Data.Set.toList) . Data.Map.toList+				) subjectsByStudentBodyBySynchronisationId+			)+		),+		let+			duplicateSubjectsByTeacherIdBySynchronisationId	= Data.Map.filter (+				not . Data.Set.null	-- Select synchronisedCourseIds with one or more alternatives.+			 ) $ Data.Map.map (+				Data.Set.filter (+					not . Data.Map.null	-- Select those members of this synchronised course, for which there're one or more alternative teachers.+				) . Data.Set.map (+					\synchronisedCourse -> Data.Map.map Data.Set.findMin {-a teacher can't offer same subject more than once-} . Data.Map.filter (+						not . Data.Set.null	-- Select teachers offering courses in the same subject as the current synchronised one.+					) $ Data.Map.map (+						Data.Set.filter (+							== Data.Course.getSubject synchronisedCourse+						) . Data.Set.map Data.Course.getSubject . Data.Set.filter (+							/= synchronisedCourse	-- Except self. TODO should teachers be permitted to offer similar subjects with the same synchronisationId ?+						) . Data.Teacher.getService+					) teacherRegister+				) -- Map over one set of synchronised courses.+			 ) distinctCoursesBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForAlternativesToSynchronisedCourses problemValidationSwitches && not (Data.Map.null duplicateSubjectsByTeacherIdBySynchronisationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForAlternativesToSynchronisedCoursesTag ++ ": courses are offered with the same subject as synchronised ones, potentially inhibiting migration of students; " ++ show (+				Data.Map.toList $ Data.Map.map (Data.Foldable.concatMap Data.Map.toList) duplicateSubjectsByTeacherIdBySynchronisationId+			)+		),+		let+			synchronisationIdsWithoutSuitableLocations	= Data.Map.keys $ Data.Map.filter (+				null . ToolShed.Data.List.permutationsBy (+-- CAVEAT: we haven't confirmed that there's some common availability with the interested student-bodies & this specific permutation of teachers & suitable locations.+					\l r	-> let+						lookupResources	= (teacherRegister !) *** (locationCatalogue !)+					in snd {-locationId-} l /= snd {-locationId-} r {-allocate different locations to each teacher-} && Data.Resource.isAvailable (+						lookupResources l,+						lookupResources r+					) {-ensure common availability with each remaining list-}+				) {-permute teacherIds into locationIds-} . map (+					uncurry zip . Control.Arrow.first {-teacherId-} repeat	-- Construct '[(teacherId, locationId)]'.+				) . Data.Map.toList . Data.Map.mapWithKey (+					\teacherId course	-> Data.Map.keys $ Data.Map.filter (+						uncurry (&&) . (+							(+								Data.Course.getRequiredFacilityNames course `Data.Set.isSubsetOf`	-- Check that this location offers the required facilities.+							) . Data.Location.getFacilityNames &&& Data.Resource.isAvailable . (,,) (+								teacherRegister ! teacherId+							) (+								Data.Map.filter (+									Data.Foldable.elem (Data.Course.getSubject course) . Data.Student.deriveAmalgamatedKnowledgeRequirement+								) studentBodyRegister+							) -- Select locations which have some common availability with this teacher, & all interested students.+						)+					) locationCatalogue+				 )+			 ) coursesByTeacherIdBySynchronisationId+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithoutSuitableLocations problemValidationSwitches && not (null synchronisationIdsWithoutSuitableLocations),+			show ProblemConfiguration.ProblemValidationSwitches.checkForSynchronisedCoursesWithoutSuitableLocationsTag ++ ": no permutation of those locations offering the required facilities, is simultaneously available to the teachers of a synchronised course & to all interested students; " ++ show synchronisationIdsWithoutSuitableLocations+		),++		let+			duplicateStudentIds :: [(Data.Student.Id, [Aggregate.StudentBody.Mnemonic])]+			duplicateStudentIds	= map (+				(+					\studentId -> (+						studentId,+						map Aggregate.StudentBody.getMnemonic . Data.Set.toList . Data.Set.filter (+							(studentId `Data.Set.member`) . Aggregate.StudentBody.getStudentIds+						) $ Data.Map.keysSet studentBodyRegister+					) -- Pair.+				) . head+			 ) . filter (+				(/= 1) . length	-- Search for duplicates.+			 ) . ToolShed.Data.Foldable.gather . concatMap (+				Data.Set.toList . Aggregate.StudentBody.getStudentIds+			 ) $ Aggregate.StudentBodyRegister.getStudentBodies studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForDuplicateStudentIds problemValidationSwitches && not (null duplicateStudentIds),+			show ProblemConfiguration.ProblemValidationSwitches.checkForDuplicateStudentIdsTag ++ ": some student-identifiers exist in more than one student-body; " ++ show duplicateStudentIds+		),++-- Check the relative size of resources.+		let+			daysOnWhichStudentBodiesExceedTeachers :: Data.Map.Map Temporal.Day.Day String+			daysOnWhichStudentBodiesExceedTeachers	= Data.Map.map (+				\(nStudentBodies, nTeachers)	-> showString "number of student-bodies=" . shows nStudentBodies . showString " > number of teachers=" $ shows nTeachers ""+			 ) . Data.Map.filter (+				uncurry (>)+			 ) . Data.Map.fromList $ map (+				id &&& (+					Data.Map.size . (+						`Data.Resource.extractAvailableResources` studentBodyRegister+					) &&& Data.Map.size . (+						`Data.Resource.extractAvailableResources` teacherRegister+					)+				)+			 ) Temporal.Day.range+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodiesExceedTeachers problemValidationSwitches && not (Data.Map.null daysOnWhichStudentBodiesExceedTeachers),+			show ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodiesExceedTeachersTag ++ ": on some days, the number of student-bodies exceeds the number of available teachers; " ++ show (Data.Map.toList daysOnWhichStudentBodiesExceedTeachers)+		),+		let+			availableLocationCapacitiesByStudentBody	= Data.Map.filterWithKey (+				\studentBody -> Data.Foldable.all (Aggregate.StudentBody.getSize studentBody >)+			 ) $ Data.Map.map (+				\studentProfile -> Data.Map.map Data.Location.getCapacity $ Data.Map.filter (+					Data.Resource.isAvailable . (,) studentProfile+				) locationCatalogue+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsCapacityOfAllLocations problemValidationSwitches && not (Data.Map.null availableLocationCapacitiesByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodySizeExceedsCapacityOfAllLocationsTag ++ ": some student-bodies can't be accommodated by the largest available location; " ++ show (+				map (+					(+						Aggregate.StudentBody.getMnemonic &&& Aggregate.StudentBody.getSize+					) *** take 1 {-there may be zero available locations-} . Data.List.sortBy (+						flip $ Data.Ord.comparing snd {-capacity-}	-- Largest first.+					) . Data.Map.toList+				) $ Data.Map.toList availableLocationCapacitiesByStudentBody+			)+		),+		let+			daysOnWhichStudentBodySizeExceedsCapacity :: Data.Map.Map Temporal.Day.Day String+			daysOnWhichStudentBodySizeExceedsCapacity	= Data.Map.map (+				(+					\(studentBodySize, capacity)	-> showString "student-body of size=" . shows studentBodySize . showChar ' ' $ if capacity == 0+						then "for which zero available locations exist"+						else showString "> capacity=" $ shows capacity ""+				) . head+			 ) . Data.Map.filter (+				not . null+			 ) . Data.Map.fromList $ map (+				\day -> (+					day,+					dropWhile (+						uncurry (<=)+					) $ zip (+						sortByDecreasingSize . map Aggregate.StudentBody.getSize . Aggregate.StudentBodyRegister.getStudentBodies $ Data.Resource.extractAvailableResources day studentBodyRegister+					) (+						(++ repeat 0) . sortByDecreasingSize . Data.Map.elems . Data.Map.map Data.Location.getCapacity $ Data.Resource.extractAvailableResources day locationCatalogue+					)+				) -- Pair.+			 ) Temporal.Day.range where+				sortByDecreasingSize :: [Size.NStudents] -> [Size.NStudents]+				sortByDecreasingSize	= Data.List.sortBy $ flip compare+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsLocationCapacity problemValidationSwitches && not (Data.Map.null daysOnWhichStudentBodySizeExceedsCapacity),+			show ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodySizeExceedsLocationCapacityTag ++ ": on some days, a match between the sizes of student-bodies & the available locations, reveals inadequate capacity; " ++ show (Data.Map.toList daysOnWhichStudentBodySizeExceedsCapacity)+		),+		let+			timeslotsCapacity, timeslotsRequired :: Size.NTimeslots+			timeslotsCapacity	= (+				* nTimeslotsPerDay+			 ) . Data.Foldable.sum $ Data.Map.map (+				Temporal.Availability.countDaysPerWeekAvailable . Temporal.Availability.findIntersections . (+					: [+						Temporal.Availability.findUnions $ Data.Map.map Data.Resource.getAvailability studentBodyRegister,+						Temporal.Availability.findUnions $ Data.Map.map Data.Resource.getAvailability teacherRegister+					]+				) . Data.Resource.getAvailability	-- Select those days on which this location, @ least one student-body, & @ least one teacher, are simultaneously available.+			 ) locationCatalogue++			timeslotsRequired	= Data.Foldable.sum $ Data.Map.map (+				sum . map Data.Course.getRequiredLessonsPerWeek . Data.Set.toList . Data.Teacher.getService+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckLocationsAvailabilityToSupportCourses problemValidationSwitches && timeslotsRequired > timeslotsCapacity,+			show ProblemConfiguration.ProblemValidationSwitches.checkLocationsAvailabilityToSupportCoursesTag ++ ": the " ++ show timeslotsRequired ++ " time-slots required to teach all the courses offered, exceeds the " ++ show timeslotsCapacity ++ " time-slots available in the configured locations"+		),+		let+			subjectsByStudentBody	= Data.Map.filter (+				not . Data.Set.null	-- Select those student-bodies, which require any subjects for which there are zero suitable locations.+			 ) $ Data.Map.mapWithKey (+				\studentBody studentProfile	-> Data.Set.filter (+					\subject -> not $ Data.Foldable.any (+						\teacherProfile -> Data.Foldable.any (+							uncurry (&&) . (+								Data.Course.isSuitable (Aggregate.StudentBody.getSize studentBody) subject &&& (+									\requiredFacilityNames -> Data.Foldable.any (+										\locationProfile -> all ($ locationProfile) [+											(>= Aggregate.StudentBody.getSize studentBody) . Data.Location.getCapacity,	-- Check that the location has adequate capacity.+											Data.Resource.isAvailable . (,,) studentProfile teacherProfile,			-- Check that all resources are simultaneously available.+											Data.Set.isSubsetOf requiredFacilityNames . Data.Location.getFacilityNames	-- Check that this location has adequate facilities.+										]+									) locationCatalogue+								) . Data.Course.getRequiredFacilityNames+							)+						) $ Data.Teacher.getService teacherProfile	-- Select the relevant portion of this teacher's service, which should be either zero or one course.+					) teacherRegister+				) $ Data.Student.deriveAmalgamatedKnowledgeRequirement studentProfile+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckSuitableLocationsForKnowledgeRequirements problemValidationSwitches && not (Data.Map.null subjectsByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkSuitableLocationsForKnowledgeRequirementsTag ++ ": some student-bodies require subjects for which there's no suitable location; " ++ show (+				map (+					Aggregate.StudentBody.getMnemonic *** Data.Set.toList+				) $ Data.Map.toList subjectsByStudentBody+			)+		),++-- Check cross-references; must validate the existence of all requested subjects, before calling 'calculateStudentWorkloadBounds'.+		let+			nonExistentSubjectsByStudentBody	= Data.Map.filter (+				not . Data.Set.null+			 ) $ Data.Map.map (+				Data.Set.filter (+					`Data.Set.notMember` Aggregate.TeacherRegister.extractDistinctSubjects teacherRegister+				) . Data.Student.deriveAmalgamatedKnowledgeRequirement+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckSubjectExistence problemValidationSwitches && not (Data.Map.null nonExistentSubjectsByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkSubjectExistenceTag ++ ": not all subjects required by student-bodies, are offered; " ++ show (+				map (+					Control.Arrow.first Aggregate.StudentBody.getMnemonic+				) . Data.Map.toList $ Data.Map.map Data.Set.toList nonExistentSubjectsByStudentBody+			)+		),+		let+			nonExistentMeetingLocationIdsByGroupId	= Data.Map.filter (`Data.Map.notMember` locationCatalogue) $ Data.Map.mapMaybe Data.Group.getMaybeLocationId groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentMeetingLocationIds problemValidationSwitches && not (Data.Map.null nonExistentMeetingLocationIdsByGroupId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForNonExistentMeetingLocationIdsTag ++ ": not all locations required for meetings, exist; " ++ show (Data.Map.toList nonExistentMeetingLocationIdsByGroupId)+		),+		let+			nonExistentOwnLocationIdsByTeacherId	= Data.Map.filter (`Data.Map.notMember` locationCatalogue) $ Data.Map.mapMaybe Data.Teacher.getMaybeOwnLocationId teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentOwnLocationIds problemValidationSwitches && not (Data.Map.null nonExistentOwnLocationIdsByTeacherId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForNonExistentOwnLocationIdsTag ++ ": not all personal locations claimed by teachers, exist; " ++ show (Data.Map.toList nonExistentOwnLocationIdsByTeacherId)+		), -- CAVEAT: teachers may legitimately share a personal classroom, provided they either have mutually exclusive working-weeks, or interleave their classes.+		let+			unsupportedCoursesByTeacherId	= Data.Map.filter (not . Data.Set.null) $ Data.Map.map (+				\teacherProfile -> Data.Set.filter (+					\course -> not . Data.Foldable.any (+						(Data.Course.getRequiredFacilityNames course `Data.Set.isSubsetOf`) . Data.Location.getFacilityNames	-- Check that @ least one location offers the required facilities.+					) $ Data.Map.filter (+						Data.Resource.isAvailable . (,) teacherProfile	-- Check that this location & the teacher are simultaneously available.+					) locationCatalogue+				) $ Data.Teacher.getService teacherProfile+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentFacilities problemValidationSwitches && not (Data.Map.null unsupportedCoursesByTeacherId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForNonExistentFacilitiesTag ++ ": there are zero available locations, which offer all the facilities required, for @ least one of the courses offered; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList unsupportedCoursesByTeacherId)+		),+		let+			nonExistentGroupIds :: Data.Group.Membership+			nonExistentGroupIds	= extractDistinctGroupMembership problemParameters \\ Data.Map.keysSet groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentGroupIds problemValidationSwitches && not (Data.Set.null nonExistentGroupIds),+			show ProblemConfiguration.ProblemValidationSwitches.checkForNonExistentGroupIdsTag ++ ": not all groups of which some student-bodies & teachers are members, exist; " ++ show (Data.Set.toList nonExistentGroupIds)+		),+		let+			groupIdsByLocationId	= Data.Map.filterWithKey (+				\groupId locationId	-> uncurry (+) (+					(+						Data.Maybe.maybe 0 Aggregate.StudentClass.getSize . Data.Map.lookup groupId *** Data.Maybe.maybe 0 Data.Set.size . Data.Map.lookup groupId+					) $ findHumanResourceIdsByGroupId problemParameters+				) > Data.Location.getCapacity (locationCatalogue ! locationId)+			 ) $ Data.Map.mapMaybe Data.Group.getMaybeLocationId groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckCapacityOfLocationsForMeetings problemValidationSwitches && not (Data.Map.null groupIdsByLocationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkCapacityOfLocationsForMeetingsTag ++ ": some groups hold meetings in locations with inadequate capacity; " ++ show (Data.Map.toList groupIdsByLocationId)+		),+		let+			groupIdsByLocationIdByTime	= Data.Map.filter (+				Data.Foldable.any $ (> 1) . length+			 ) $ Data.Map.foldrWithKey (+				\groupId groupProfile m	-> Data.Maybe.maybe m (+					\locationId -> Data.Foldable.foldr (+						Data.Map.insertWith (+							Data.Map.unionWith (++)+						) `flip` Data.Map.singleton locationId [groupId]+					) m $ Data.Group.getMeetingTimes groupProfile+				) $ Data.Group.getMaybeLocationId groupProfile+			 ) Data.Map.empty groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckDuplicateMeetingLocationIds problemValidationSwitches && not (Data.Map.null groupIdsByLocationIdByTime),+			show ProblemConfiguration.ProblemValidationSwitches.checkDuplicateMeetingLocationIdsTag ++ ": several groups require the same location simultaneously; " ++ show (Data.Map.toList $ Data.Map.map Data.Map.toList groupIdsByLocationIdByTime)+		),+		let+			invalidMeetingTimesByGroupId	= Data.Map.filter (+				Data.Foldable.any (+					\time -> any ($ Temporal.Time.getTimeslotId time) [+						(< Factory.Data.Interval.getMinBound timeslotIdBounds),+						(> Factory.Data.Interval.getMaxBound timeslotIdBounds)+					]+				)+			 ) $ Data.Map.map Data.Group.getMeetingTimes groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForInvalidMeetingTimes problemValidationSwitches && not (Data.Map.null invalidMeetingTimesByGroupId),+			show ProblemConfiguration.ProblemValidationSwitches.checkForInvalidMeetingTimesTag ++ ": some groups specify meeting-times, using timeslot-identifiers which are outside permissible bounds " ++ show timeslotIdBounds ++ "; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList invalidMeetingTimesByGroupId)+		),+		let+			daysAndLocationIdsByGroupId	= Data.Map.filter (+				not . Data.Set.null . fst {-days-}+			 ) . Data.Map.map (+				\(meetingDays, locationId)	-> (+					Data.Set.filter (+						not . (`Data.Resource.isAvailableOn` (locationCatalogue ! locationId))+					) meetingDays,+					locationId+				) -- Pair.+			 ) $ Data.Map.mapMaybe (+				uncurry fmap . (+					(,) . Data.Set.map Temporal.Time.getDay . Data.Group.getMeetingTimes &&& Data.Group.getMaybeLocationId+				)+			 ) groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckMeetingLocationsAvailability problemValidationSwitches && not (Data.Map.null daysAndLocationIdsByGroupId),+			show ProblemConfiguration.ProblemValidationSwitches.checkMeetingLocationsAvailabilityTag ++ ": some groups require a location, which isn't available @ all of the specified meeting-times; " ++ show (+				Data.Map.toList $ Data.Map.map (Control.Arrow.first Data.Set.toList) daysAndLocationIdsByGroupId+			)+		),+		let+			groupsWithIndependentlyAvailableMembers	= filter (+				Temporal.Availability.isUnavailable . Data.Resource.getAvailability . (+					(`Data.HumanResource.extractGroupMembersOf` studentBodyRegister) &&& (`Data.HumanResource.extractGroupMembersOf` teacherRegister)+				)+			 ) . Data.Map.keys $ Data.Map.filter (+				uncurry (&&) . (+					(> 0) . Data.Group.countNTimeslotsPerWeek &&& Data.Group.getMandatesAttendance+				) -- If no meetings are required or members needn't attend, then they needn't ever be simultaneously available.+			 ) groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckSimultaneousAvailabilityOfGroupMembers problemValidationSwitches && not (null groupsWithIndependentlyAvailableMembers),+			show ProblemConfiguration.ProblemValidationSwitches.checkSimultaneousAvailabilityOfGroupMembersTag ++ ": some groups which mandate attendance, can never meet because their members are never simultaneously available; " ++ show groupsWithIndependentlyAvailableMembers+		),+		let+			unavailableDaysByGroupId :: Data.Map.Map Data.Group.Id (Data.Set.Set Temporal.Day.Day)+			unavailableDaysByGroupId	= Data.Map.filter (+				not . Data.Set.null+			 ) . Data.Map.mapWithKey (+				\groupId -> let+					memberStudents	= Data.HumanResource.extractGroupMembersOf groupId studentBodyRegister+					memberTeachers	= Data.HumanResource.extractGroupMembersOf groupId teacherRegister+				in Data.Set.filter (+					\day -> (+						not (Data.Map.null memberStudents) || not (Data.Map.null memberTeachers)+					) && not (+						any (+							Temporal.Availability.isAvailableOn day+						) $ map Data.Resource.getAvailability (Data.Map.elems memberStudents) ++ map Data.Resource.getAvailability (Data.Map.elems memberTeachers)+					)+				)+			 ) $ Data.Map.map (+				Data.Set.map Temporal.Time.getDay . Data.Group.getMeetingTimes+			 ) groupCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckAvailabilityOfAnyGroupMember problemValidationSwitches && not (Data.Map.null unavailableDaysByGroupId),+			show ProblemConfiguration.ProblemValidationSwitches.checkAvailabilityOfAnyGroupMemberTag ++ ": specific meetings of some groups can never be attended, because none of the members are available on that day; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList unavailableDaysByGroupId)+		),+		let+			unavailableDaysByStudentBody	= findUnavailableDaysByGroupIdByHumanResourceId groupCatalogue studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsAvailabilityForMandatoryMeetings problemValidationSwitches && not (Data.Map.null unavailableDaysByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsAvailabilityForMandatoryMeetingsTag ++ ": some student-bodies are unavailable for some of the meetings, of those groups mandating attendance, of which they're members; " ++ show (+				Data.Map.toList $ Data.Map.map (+					Data.Map.toList . Data.Map.map Data.Set.toList+				) unavailableDaysByStudentBody+			)+		),+		let+			unavailableDaysByTeacherId	= findUnavailableDaysByGroupIdByHumanResourceId groupCatalogue teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckTeachersAvailabilityForMandatoryMeetings problemValidationSwitches && not (Data.Map.null unavailableDaysByTeacherId),+			show ProblemConfiguration.ProblemValidationSwitches.checkTeachersAvailabilityForMandatoryMeetingsTag ++ ": some teachers are unavailable for some of the meetings, of those groups mandating attendance, of which they're members; " ++ show (+				Data.Map.toList $ Data.Map.map (+					Data.Map.toList . Data.Map.map Data.Set.toList+				) unavailableDaysByTeacherId+			)+		),+		let+			synchronousTimesByStudentBody	= Data.Map.filter (+				not . Data.Set.null	-- Leave only those student-bodies who're double-booked.+			 ) $ Data.Map.mapWithKey (+				\studentBody studentProfile	-> uncurry Data.Set.intersection $ (+					Data.Foldable.foldr Data.Set.union Data.Set.empty . Data.Set.map (+						\subject -> Data.Foldable.foldr1 Data.Set.intersection . Data.Map.map (+							Data.Foldable.foldr Data.Set.union Data.Set.empty . Data.Set.filter (+								Data.Foldable.all (+									(`Data.Resource.isAvailableOn` studentProfile) . Temporal.Time.getDay+								) -- Remove any course which specifies any time when the student's unavailable.+							) . Data.Set.map (+								Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest+							) -- Extract the specified times from the relevant portion of this teacher's service; which could be null.+						 ) . Data.Map.filter (+							not . Data.Set.null	-- Remove those teachers who don't offer a course in the required subject.+						 ) . Data.Map.map (+							Data.Set.filter (+								Data.Course.isSuitable (Aggregate.StudentBody.getSize studentBody) subject+							) . Data.Teacher.getService	-- Select the relevant portion of this teacher's service, which should be either zero or one course.+						 ) $ Data.Map.filter (+							Data.Resource.isAvailable . (,) studentProfile	-- Confirm that this teacher & student-body are simultaneously available.+						 ) teacherRegister+					) . Data.Student.deriveAmalgamatedKnowledgeRequirement &&& Data.Foldable.foldr (+						Data.Set.union . Data.Group.getMeetingTimes . (+							groupCatalogue !	-- Acquire the group-profile.+						)+					) Data.Set.empty . {- Data.Set.filter Data.Group.getMandatesAttendance . -} Data.HumanResource.getGroupMembership+				) studentProfile+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings problemValidationSwitches && not (Data.Map.null synchronousTimesByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkIndependenceOfStudentTimeslotsRequestsAndMeetingsTag ++ ": some student-bodies are members of groups, which meet @ times specified for all courses offering one of their knowledge-requirements; " ++ show (+				map (+					Control.Arrow.first Aggregate.StudentBody.getMnemonic+				) . Data.Map.toList $ Data.Map.map Data.Set.toList synchronousTimesByStudentBody+			)+		),+		let+			synchronousTimesByTeacherId	= Data.Map.filter (+				not . Data.Set.null	-- Leave only those teachers who're double-booked.+			 ) $ Data.Map.map (+				uncurry Data.Set.intersection . (+					Data.Teacher.findSpecifiedTimes &&& Data.Foldable.foldr (+						Data.Set.union . Data.Group.getMeetingTimes . (+							groupCatalogue !	-- Acquire the group-profile.+						)+					) Data.Set.empty . {- Data.Set.filter Data.Group.getMandatesAttendance . -} Data.HumanResource.getGroupMembership+				)+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings problemValidationSwitches && not (Data.Map.null synchronousTimesByTeacherId),+			show ProblemConfiguration.ProblemValidationSwitches.checkIndependenceOfTeacherTimeslotsRequestsAndMeetingsTag ++ ": some teachers are members of groups, which meet @ times specified for one of their courses; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList synchronousTimesByTeacherId)+		),+		let+			synchronousSeparateMeetingsByTimeByTeacherId	= findSynchronousSeparateMandatoryMeetingsByTimeByHumanResourceId groupCatalogue teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckTeachersForSynchronousMeetings problemValidationSwitches && not (Data.Map.null synchronousSeparateMeetingsByTimeByTeacherId),+			show ProblemConfiguration.ProblemValidationSwitches.checkTeachersForSynchronousMeetingsTag ++ ": some teachers are members of groups with synchronous meeting-times, in separate locations; " ++ show (Data.Map.toList $ Data.Map.map Data.Map.toList synchronousSeparateMeetingsByTimeByTeacherId)+		),+		let+			synchronousSeparateMeetingsByTimeByStudentBody	= findSynchronousSeparateMandatoryMeetingsByTimeByHumanResourceId groupCatalogue studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsForSynchronousMeetings problemValidationSwitches && not (Data.Map.null synchronousSeparateMeetingsByTimeByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsForSynchronousMeetingsTag ++ ": some student-bodies are members of groups with synchronous meeting-times, in separate locations; " ++ show (Data.Map.toList $ Data.Map.map Data.Map.toList synchronousSeparateMeetingsByTimeByStudentBody)+		),+		let+			teacherIds	= Data.Map.keys . Data.Map.filter (+				not . Data.Resource.isAvailable	-- Operate on Pair.+			 ) $ Data.Map.mapMaybe (+				\teacherProfile -> ((,) teacherProfile . (locationCatalogue !)) `fmap` Data.Teacher.getMaybeOwnLocationId teacherProfile+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckOwnLocationsAvailability problemValidationSwitches && not (null teacherIds),+			show ProblemConfiguration.ProblemValidationSwitches.checkOwnLocationsAvailabilityTag ++ ": some teachers claim a personal location, which isn't available @ any time during their working-week; " ++ show teacherIds+		),+		let+			duplicateClaimsByLocationId	= Data.Map.map (+				Aggregate.TeacherRegister.getTeacherIds . fst {-teacherRegister-}+			 ) . Data.Map.filter (+				uncurry (&&) . (+					(> 1) . Data.Map.size . fst {-teacherRegister-} &&& Data.Resource.isAvailable {-days on which the location & all relevant teachers are available-}+				)+			 ) $ Data.Map.mapWithKey (+				(,) . (`Data.Map.filter` teacherRegister) . Data.Teacher.inhabits+			 ) locationCatalogue+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckDuplicateOwnLocationIds problemValidationSwitches && not (Data.Map.null duplicateClaimsByLocationId),+			show ProblemConfiguration.ProblemValidationSwitches.checkDuplicateOwnLocationIdsTag ++ ": ownership of a single location, is claimed by teachers whose working-weeks aren't mutually exclusive; " ++ show (Data.Map.toList duplicateClaimsByLocationId)+		),+		let+			teacherIdsByTime	= Data.Map.filter (+				(> Data.Map.size locationCatalogue) . length	-- CAVEAT: a lax constraint, since some locations may be unavailable or unsuitable.+			 ) . Data.Map.foldrWithKey (+				\teacherId -> flip $ Data.Foldable.foldr (+					Data.Map.insertWith (++) `flip` [teacherId]+				) -- Invert the map.+			 ) Data.Map.empty $ Data.Map.map Data.Teacher.findSpecifiedTimes teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckLocationsForSynchronousSpecifiedTimes problemValidationSwitches && not (Data.Map.null teacherIdsByTime),+			show ProblemConfiguration.ProblemValidationSwitches.checkLocationsForSynchronousSpecifiedTimesTag ++ ": more courses specify the same booking-time, than there are locations in which to hold them; " ++ show (Data.Map.toList teacherIdsByTime)+		),+		let+			unavailableSubjectsByStudentBody = Data.Map.filter (not . Data.Set.null) $ Data.Map.mapWithKey (+				\studentBody studentProfile	-> Data.Set.filter (+					\subject -> not . Data.Foldable.any (+						Data.Foldable.all (+							(`Data.Resource.isAvailableOn` studentProfile) . Temporal.Time.getDay+						) . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest+					) . Aggregate.TeacherRegister.findSuitableCourseByTeacherId (+						Aggregate.StudentBody.getSize studentBody	-- Ensure the student-body fits within 'Data.Course.getMaybeMaximumClassSize'.+					) subject $ Data.Map.filter (+						Data.Resource.isAvailable . (,) studentProfile	-- Find teachers available simultaneously with this student.+					) teacherRegister+				) $ Data.Student.deriveAmalgamatedKnowledgeRequirement studentProfile+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsAvailabilityForSpecifiedTimes problemValidationSwitches && not (Data.Map.null unavailableSubjectsByStudentBody),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsAvailabilityForSpecifiedTimesTag ++ ": some student-bodies have requested subjects, for which either there're zero suitable courses, or all suitable courses specify booking-times when they're unavailable; " ++ show (Data.Map.toList $ Data.Map.map Data.Set.toList unavailableSubjectsByStudentBody)+		),+		let+			studentBodiesWithSynchronousTimeslotRequests :: [Aggregate.StudentBody.StudentBody]+			studentBodiesWithSynchronousTimeslotRequests = Data.Map.keys . Data.Map.filter null {-no acceptable permutation of courses-} $ Data.Map.mapWithKey (+				\studentBody studentProfile	-> filter {-[[[Time]]]-} (+					not . Data.List.Extra.anySame . concat {-merge the specified times, for a permutation of courses providing all required subjects-}+				) . ToolShed.Data.List.permutations {-where several teachers offer a matching course-} . map (+					\subject -> filter (+						all ((`Data.Resource.isAvailableOn` studentProfile) . Temporal.Time.getDay)	-- The student-body must be available @ all the times specified in any course.+					) . map (+						Data.Set.toList . Temporal.TimeslotRequest.getSpecifiedTimes . Data.Course.getTimeslotRequest	-- Extract the potentially null list of times specified by each course.+					) . Data.Map.elems . Aggregate.TeacherRegister.findSuitableCourseByTeacherId (Aggregate.StudentBody.getSize studentBody) subject $ Data.Map.filter (+						Data.Resource.isAvailable . (,) studentProfile+					) teacherRegister+				) . Data.Set.toList $ Data.Student.deriveAmalgamatedKnowledgeRequirement studentProfile+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckCoursesForSynchronousSpecifiedTimes problemValidationSwitches && not (null studentBodiesWithSynchronousTimeslotRequests),+			show ProblemConfiguration.ProblemValidationSwitches.checkCoursesForSynchronousSpecifiedTimesTag ++ ": some student-bodies require subjects, for which either there're zero suitable courses, or present a conflict between the specified booking-times of those courses which are suitable; " ++ show studentBodiesWithSynchronousTimeslotRequests+		),+		let+			subjectsWithInsufficientTeachers	= Data.Map.filter (+				uncurry (>)	-- Demand exceeds supply.+			 ) . Data.Map.mapWithKey (+				\subject nClassesRequired	-> (+					nClassesRequired,+					sum {-aggregate supply-} [+						nTimeslotPerWeekOfTeaching `div` Data.Course.getRequiredLessonsPerWeek course |+							(nTimeslotPerWeekOfTeaching, Just course)	<- map (+								Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay &&& Data.Teacher.lookupCourseIn subject+							) $ Data.Map.elems teacherRegister+					] -- List-comprehension.+				) -- Pair.+			 ) . Data.Map.fromListWith (+) . map (+				flip (,) 1	-- Count the number of separate classes required in each subject. CAVEAT: ignores the class-size, which may overflow all suitable locations.+			 ) . concatMap (+				Data.Set.toList . Data.Set.unions . map Data.Student.deriveAmalgamatedKnowledgeRequirement	-- Derive total knowledge-requirement of each student-class.+			 ) $ ToolShed.Data.Foldable.gatherBy Data.Student.getStream studentBodyRegister		-- Gather student-bodies which can be temporarily merged. CAVEAT: assumes 'ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger'.+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckTeachingCapacityBySubject problemValidationSwitches && not (Data.Map.null subjectsWithInsufficientTeachers),+			show ProblemConfiguration.ProblemValidationSwitches.checkTeachingCapacityBySubjectTag ++ ": the total demand for separate courses in some subjects exceeds that offered by teachers; " ++ show (Data.Map.toList subjectsWithInsufficientTeachers)+		),++-- Check workload-bounds.+		let+			idleStudentBodies	= Data.Map.filter (+				uncurry (&&) . (+					Data.Set.null . Data.Student.deriveAmalgamatedKnowledgeRequirement &&& (> 0) . Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+				)+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForIdleStudents problemValidationSwitches && not (Data.Map.null idleStudentBodies),+			show ProblemConfiguration.ProblemValidationSwitches.checkForIdleStudentsTag ++ ": some student-bodies require zero subjects, but have allocated one or more time-slots for teaching; " ++ show (Data.Map.toList idleStudentBodies)+		),+		let+			overloadedStudentBodies	= Data.Map.filter (+				uncurry (&&) . (+					not . Data.Set.null . Data.Student.deriveAmalgamatedKnowledgeRequirement &&& (== 0) . Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+				)+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForOverloadedStudents problemValidationSwitches && not (Data.Map.null overloadedStudentBodies),+			show ProblemConfiguration.ProblemValidationSwitches.checkForOverloadedStudentsTag ++ ": some student-bodies have allocated zero time-slots for teaching, but have requested one or more subjects; " ++ show (Data.Map.toList overloadedStudentBodies)+		),+		let+			idleTeachers	= Data.Map.filter (+				uncurry (&&) . (+					not . Data.Teacher.offersService &&& (> 0) . Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+				)+			 ) teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForIdleTeachers problemValidationSwitches && not (Data.Map.null idleTeachers),+			show ProblemConfiguration.ProblemValidationSwitches.checkForIdleTeachersTag ++ ": some teachers offer zero courses required by student-bodies, but have allocated one or more time-slots for teaching; " ++ show (Data.Map.toList idleTeachers)+		),+		let+			slackStudentsBodies :: Data.Map.Map Aggregate.StudentBody.StudentBody (Size.NTimeslots, Size.NTimeslots)+			slackStudentsBodies	= Data.Map.filter (uncurry (<)) $ Data.Map.map (+				(+					Temporal.Workload.getMaximum . uncurry (<+>)	-- Add the workloads associated with core & optional subject-requirements.+				) . calculateStudentWorkloadBounds teacherRegister &&& Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsLowerWorkloadBound problemValidationSwitches && not (Data.Map.null slackStudentsBodies),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsLowerWorkloadBoundTag ++ ": the workload associated with all subject-requirements, for some student-bodies, is insufficient to meet the tuition-time in their working-week; " ++ show (map (Control.Arrow.first Aggregate.StudentBody.getMnemonic) $ Data.Map.toList slackStudentsBodies)+		),+		let+			overloadedStudentBodies :: Data.Map.Map Aggregate.StudentBody.StudentBody (Size.NTimeslots, Size.NTimeslots)+			overloadedStudentBodies	= Data.Map.filter (uncurry (>)) $ Data.Map.map (+				Temporal.Workload.getMinimum . Data.Requirements.getCore . calculateStudentWorkloadBounds teacherRegister &&& Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsUpperWorkloadBound problemValidationSwitches && not (Data.Map.null overloadedStudentBodies),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsUpperWorkloadBoundTag ++ ": the workload associated with core subject-requirements, for some student-bodies, exceeds the tuition-time available in their working-week; " ++ show (map (Control.Arrow.first Aggregate.StudentBody.getMnemonic) $ Data.Map.toList overloadedStudentBodies)+		),+		let+			overloadedStudentBodies	= findHumanResourcesOverloadedWithMeetings nTimeslotsPerDay groupCatalogue studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsUpperWorkloadBound problemValidationSwitches && not (Data.Map.null overloadedStudentBodies),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsUpperWorkloadBoundTag ++ ": the time associated with meetings, for some student-bodies, exceeds the non-teaching time available in their working-week; " ++ show (Data.Map.toList overloadedStudentBodies)+		),+		let+			overloadedTeachers	= findHumanResourcesOverloadedWithMeetings nTimeslotsPerDay groupCatalogue teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckTeachersUpperWorkloadBound problemValidationSwitches && not (Data.Map.null overloadedTeachers),+			show ProblemConfiguration.ProblemValidationSwitches.checkTeachersUpperWorkloadBoundTag ++ ": the time associated with meetings, for some teachers, exceeds the non-teaching time available in their working-week; " ++ show (Data.Map.toList overloadedTeachers)+		),++-- Check miscellaneous.+		let+			rogueStudentBodies	= Data.Map.filter (+				Data.Foldable.any (not . Data.Set.null)+			 ) $ Data.Map.map (+				Data.Map.filter (+					(> 1) . Data.Set.size+				) . Data.Map.fromListWith Data.Set.union . map (+					Data.Subject.getTopic &&& Data.Set.singleton . Data.Subject.getLevel+				) . Data.Set.toList . Data.Student.deriveAmalgamatedKnowledgeRequirement+			 ) studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsForMultipleLevelsOfSameTopic problemValidationSwitches && not (Data.Map.null rogueStudentBodies),+			show ProblemConfiguration.ProblemValidationSwitches.checkStudentsForMultipleLevelsOfSameTopicTag ++ ": some student-body's knowledge-requirements include more than one level of the same topic; " ++ show (+				Data.Map.toList $ Data.Map.map (Data.Map.toList . Data.Map.map Data.Set.toList) rogueStudentBodies+			)+		),+		let+			studentBodiesWithUnrealisableFreePeriodPreference	= extractResourceIdsWithUnrealisableFreePeriodPreference studentBodyRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForStudentsWithUnrealisableFreePeriodPreference problemValidationSwitches && not (null studentBodiesWithUnrealisableFreePeriodPreference),+			show ProblemConfiguration.ProblemValidationSwitches.checkForStudentsWithUnrealisableFreePeriodPreferenceTag ++ ": the preference of some student-bodies, for the position of free time-slots, within those days on which they're available, can never be realised because of the meeting-times of groups of which they're members; " ++ show (map Aggregate.StudentBody.getMnemonic studentBodiesWithUnrealisableFreePeriodPreference)+		),+		let+			teacherIdsWithUnrealisableFreePeriodPreference	= extractResourceIdsWithUnrealisableFreePeriodPreference teacherRegister+		in (+			ProblemConfiguration.ProblemValidationSwitches.getCheckForTeachersWithUnrealisableFreePeriodPreference problemValidationSwitches && not (null teacherIdsWithUnrealisableFreePeriodPreference),+			show ProblemConfiguration.ProblemValidationSwitches.checkForTeachersWithUnrealisableFreePeriodPreferenceTag ++ ": the preference of some teachers, for the position of free time-slots, within those days on which they're available, can never be realised because of the meeting-times of groups of which they're members; " ++ show teacherIdsWithUnrealisableFreePeriodPreference+		)+	 ] where+		nTimeslotsPerDay :: Size.NTimeslots+		nTimeslotsPerDay	= calculateNTimeslotsPerDay timeslotIdBounds++		extractResourceIdsWithUnrealisableFreePeriodPreference :: (+			Data.HumanResource.HumanResource	humanResource,+			Data.Resource.Resource			humanResource+		 ) => Data.Resource.ResourceMap humanResourceId humanResource -> [humanResourceId]+		extractResourceIdsWithUnrealisableFreePeriodPreference	= Data.Map.keys . Data.Map.filter (+			\profile -> let+				meetingTimesByDay	= Temporal.Time.categoriseByDay . Aggregate.GroupCatalogue.getMeetingTimes groupCatalogue $ Data.HumanResource.getGroupMembership profile+			in Data.Foldable.all (+				(+					\meetingTimeslotIdSet -> case Data.Maybe.fromJust $ Data.HumanResource.getMaybeFreePeriodPreference profile of+						Temporal.FreePeriodPreference.Pre	-> Data.Set.member (Factory.Data.Interval.getMinBound timeslotIdBounds) meetingTimeslotIdSet+						Temporal.FreePeriodPreference.Post	-> all (`Data.Set.member` meetingTimeslotIdSet) $ Factory.Data.Interval.toList timeslotIdBounds+						Temporal.FreePeriodPreference.Terminal	-> Data.Set.member (Factory.Data.Interval.getMaxBound timeslotIdBounds) meetingTimeslotIdSet+				) . Data.Maybe.fromMaybe Data.Set.empty . (`Data.Map.lookup` meetingTimesByDay)+			) . Temporal.Availability.deconstruct $ Data.Resource.getAvailability profile+		 ) . Data.Map.filter Data.HumanResource.hasFreePeriodPreference++		coursesByTeacherIdBySynchronisationId	= Aggregate.TeacherRegister.findCoursesByTeacherIdBySynchronisationId teacherRegister+		distinctCoursesBySynchronisationId	= Aggregate.TeacherRegister.findDistinctCoursesBySynchronisationId coursesByTeacherIdBySynchronisationId++{- |+	* Merges those /student-bodies/ whose /profile/s are identical, into a /student-body/.++	* Also writes the list of those students affected.+-}+reduceStudentBodyRegister :: (+	Ord	level,+	Ord	stream,+	Ord	teachingRatio+ )+	=> Aggregate.StudentClass.MnemonicSeparator+	-> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Control.Monad.Writer.Writer [[Aggregate.StudentBody.StudentBody]] (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId)+reduceStudentBodyRegister mnemonicSeparator problemParameters	= do+	studentBodyRegister	<- Aggregate.StudentBodyRegister.reduce mnemonicSeparator $ getStudentBodyRegister problemParameters++	return {-to Writer-monad-} problemParameters { getStudentBodyRegister = studentBodyRegister }++{- |+	* Removes /course/s from the /teacherRegister/, which aren't required by any /student/.++	* Writes an association-list of /teacherId/ & any /knowledge/ they offer for which there's no demand;+	where there's a requirement for all a /teacher/'s knowledge, then no data is written for that teacher, rather than writing a null set.+-}+removeRedundantCourses :: (+#if !MIN_VERSION_containers(0,5,2)+	Ord	synchronisationId,+	Ord	timeslotId,+#endif+	Ord	level+ )+	=> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Control.Monad.Writer.Writer [(teacherId, Data.Subject.Knowledge level)] (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId)+removeRedundantCourses problemParameters	= let+	(teacherRegister, redundantServiceByTeacherId)	= (+		Data.Map.map fst &&& Data.Map.filter (not . Data.Set.null) . Data.Map.map snd+	 ) . Data.Map.map (+		\profile -> let+			(requiredService, redundantService)	= Data.Set.partition (+				(`Data.Set.member` Aggregate.StudentBodyRegister.extractDistinctSubjects (getStudentBodyRegister problemParameters)) . Data.Course.getSubject+			 ) $ Data.Teacher.getService profile+		in (+			profile {Data.Teacher.getService = requiredService},+			redundantService+		) -- Pair.+	 ) $ getTeacherRegister problemParameters+ in do+	Control.Monad.Writer.tell . Data.Map.toList $ Data.Map.map (Data.Set.map Data.Course.getSubject) redundantServiceByTeacherId++	return {-to Writer-monad-} problemParameters {+		getTeacherRegister	= teacherRegister+	}++-- | Remove any /groups/ from the /groupCatalogue/ which have zero /meeting-times/.+removePointlessGroups+	:: ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Control.Monad.Writer.Writer [Data.Group.Id] (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId)+removePointlessGroups problemParameters	= let+	(pointlessGroupMembership, reducedGroupCatalogue)	= Control.Arrow.first Data.Map.keysSet . Data.Map.partition (+		Data.Set.null . Data.Group.getMeetingTimes+	 ) $ getGroupCatalogue problemParameters+ in do+	Control.Monad.Writer.tell $ Data.Set.toList pointlessGroupMembership++	return {-to Writer-monad-} problemParameters {+		getGroupCatalogue	= reducedGroupCatalogue,+		getStudentBodyRegister	= Data.Map.map (Data.Student.unsubscribe pointlessGroupMembership) $ getStudentBodyRegister problemParameters,+		getTeacherRegister	= Data.Map.map (Data.Teacher.unsubscribe pointlessGroupMembership) $ getTeacherRegister problemParameters+	}++-- | Remove any /groups/ from the /groupCatalogue/ to which neither /student-bodies/ nor /teachers/ have subscribed.+removeUnsubscribedGroups+	:: RealFrac teachingRatio+	=> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Control.Monad.Writer.Writer [Data.Group.Id] (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId)+removeUnsubscribedGroups problemParameters	= let+	(reducedGroupCatalogue, unsubscribedGroupCatalogue)	= Data.Map.partitionWithKey (+		\groupId _	-> Data.Set.member groupId . uncurry Data.Set.union $ (+			Data.HumanResource.extractCombinedGroupMembership . getStudentBodyRegister &&& Data.HumanResource.extractCombinedGroupMembership . getTeacherRegister+		) problemParameters+	 ) $ getGroupCatalogue problemParameters+ in do+	Control.Monad.Writer.tell $ Data.Map.keys unsubscribedGroupCatalogue++	return {-to Writer-monad-} problemParameters {+		getGroupCatalogue	= reducedGroupCatalogue+	}++-- | Proxies request to 'Aggregate.TeacherRegister.mergeConstraintsOnSynchronisedCourses'.+mergeConstraintsOnSynchronisedCourses :: (+	Ord	level,+	Ord	synchronisationId,+	Ord	teacherId,+	Ord	timeslotId,+	Show	synchronisationId,+	Show	timeslotId+ ) => ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+mergeConstraintsOnSynchronisedCourses problemParameters	= problemParameters {+	getTeacherRegister	= Aggregate.TeacherRegister.mergeConstraintsOnSynchronisedCourses $ getTeacherRegister problemParameters+}++{- |+	* When temporary student-body mergers are permitted according to the execution-options, some problem-validation switches are inappropriate & should be disabled to prevent false positives.++	* Also writes the names of any disabled switches.+-}+disableAnyValidationInappropriateForTemporaryStudentBodyMerger+	:: ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId+	-> Control.Monad.Writer.Writer [String] (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId)+disableAnyValidationInappropriateForTemporaryStudentBodyMerger problemParameters	= foldr (+	\(_, disabledSwitchTag)	-> (Control.Monad.Writer.tell [disabledSwitchTag] >>)	-- Report the disabled problem-validation switch's name, & forward the writer.+ ) (+	return {-to Writer-monad-} problemParameters {+		getProblemValidationSwitches	= problemValidationSwitches {+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodiesExceedTeachers		= False,+			ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsLocationCapacity	= False+		} -- Disable potentially conflicting problem-validation switches.+	} -- Initial value.+ ) $ filter (+	($ problemValidationSwitches) . fst {-accessor-}	-- Select enabled problem-validation switches.+ ) [+	(ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodiesExceedTeachers,			ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodiesExceedTeachersTag),+	(ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsLocationCapacity,	ProblemConfiguration.ProblemValidationSwitches.checkIfStudentBodySizeExceedsLocationCapacityTag)+ ] where+	problemValidationSwitches	= getProblemValidationSwitches problemParameters++-- | True if any /student-body/ or /teacher/ has a preference for the location of any free timeslots in their working day.+hasAnyFreePeriodPreference :: RealFrac teachingRatio => ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Bool+hasAnyFreePeriodPreference	= uncurry (||) . (Aggregate.StudentBodyRegister.hasAnyFreePeriodPreference . getStudentBodyRegister &&& Aggregate.TeacherRegister.hasAnyFreePeriodPreference . getTeacherRegister)++-- | Whether /course/s offer different /minimumConsecutiveLessons/.+hasVariousMinimumConsecutiveLessons ::+#if !MIN_VERSION_containers(0,5,2)+	(+		Ord	level,+		Ord	synchronisationId,+		Ord	timeslotId+	) =>+#endif+	ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId -> Bool+hasVariousMinimumConsecutiveLessons = (> 1) . Data.Set.size . Data.Foldable.foldr (+	\teacherProfile -> Data.Set.union (Data.Set.map Data.Course.getMinimumConsecutiveLessons $ Data.Teacher.getService teacherProfile)+ ) Data.Set.empty . getTeacherRegister++instance (+	Enum		timeslotId,+	Ord		level,+	Ord		synchronisationId,+	Ord		teacherId,+	Ord		timeslotId,+	RealFrac	teachingRatio,+	Show		level,+	Show		synchronisationId,+	Show		teacherId,+	Show		timeslotId+ ) => Configuration.Configuration (ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId) where+	issueWarnings problemParameters	= [+		msg | (True, msg) <- [+			let+				excessTotalWorkloadByStudentBody :: Data.Map.Map Aggregate.StudentBody.StudentBody Size.NTimeslots+				excessTotalWorkloadByStudentBody	= findExcessTotalWorkloadByStudentBody problemParameters+			in (+				not $ Data.Map.null excessTotalWorkloadByStudentBody,+				"the time required for the total (core & optional) knowledge-requirements of some student-bodies, exceeds that allocated to teaching; " ++ show (+					Control.Arrow.first Aggregate.StudentBody.getMnemonic `map` Data.Map.toList excessTotalWorkloadByStudentBody+				)+			),+			let+				subjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek	= Aggregate.TeacherRegister.findSubjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek $ getTeacherRegister problemParameters+			in (+				not $ Data.Map.null subjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek,+				"some subjects have been offered by more than one teacher, but in courses requiring a different number of lessons per week; " ++ show (+					Data.Map.toList $ Data.Map.map Data.Map.toList subjectsOfferedInMultipleCoursesRequiringDifferentLessonsPerWeek+				)+			), (+				ProblemConfiguration.ValidationSwitch.areAllOff $ getProblemValidationSwitches problemParameters,+				"all problem-validation switches are off; the problem-parameters may be invalid"+			), (+				ProblemConfiguration.ValidationSwitch.areAllOff $ getTimetableValidationSwitches problemParameters,+				"all timetable-validation switches are off; any imported timetable may be invalid"+			),+			let+				subjectsByTeacherId	= Data.Map.map (+					map Data.Course.getSubject . Data.Set.toList+				 ) . Data.Map.filter (+					not . Data.Set.null+				 ) . Data.Map.map (+					Data.Set.filter (+						Data.Maybe.maybe False (+							null . show	-- BODGE: the type is unknown.+						) . Data.Course.getMaybeSynchronisationId+					) . Data.Teacher.getService+				 ) $ getTeacherRegister problemParameters+			in (+				not $ Data.Map.null subjectsByTeacherId,+				"some teachers have defined courses with a null 'synchronisationId'; " ++ show (Data.Map.toList subjectsByTeacherId)+			),+			let+				synchronousMeetingsByTimeByStudentBodyMnemonic	= findSynchronousMeetingsByTimeByStudentBodyMnemonic problemParameters+			in (+				not $ Data.Map.null synchronousMeetingsByTimeByStudentBodyMnemonic,+				"the following student-bodies have synchonous group-meetings; " ++ show (+					map (Control.Arrow.first Aggregate.StudentBody.getMnemonic) . Data.Map.toList $ Data.Map.map Data.Map.toList synchronousMeetingsByTimeByStudentBodyMnemonic+				)+			), -- Pair.+			let+				synchronousMeetingsByTimeByTeacherId	= findSynchronousMeetingsByTimeByTeacherId problemParameters+			in (+				not $ Data.Map.null synchronousMeetingsByTimeByTeacherId,+				"the following teachers have synchonous group-meetings; " ++ show (Data.Map.toList $ Data.Map.map Data.Map.toList synchronousMeetingsByTimeByTeacherId)+			), -- Pair.+			case calculateNTimeslotsPerDay $ getTimeslotIdBounds problemParameters of+				1 -> (+					hasAnyFreePeriodPreference problemParameters,+					"a " ++ show Temporal.FreePeriodPreference.tag ++ " is meaningless with only one time-slot per day"+				 ) -- Pair.+				2 -> (+					let+						hasTerminalFreePeriodPreference :: Data.HumanResource.HumanResource resource => Data.Resource.ResourceMap resourceId resource -> Bool+						hasTerminalFreePeriodPreference	= Data.Foldable.any $ (== Just Temporal.FreePeriodPreference.Terminal) . Data.HumanResource.getMaybeFreePeriodPreference+					in uncurry (||) $ (+						hasTerminalFreePeriodPreference . getStudentBodyRegister &&& hasTerminalFreePeriodPreference . getTeacherRegister+					) problemParameters,+					"'" ++ Temporal.FreePeriodPreference.tag ++ "=" ++ show Temporal.FreePeriodPreference.Terminal ++ "' is redundant when there are only two time-slots per day"+				 ) -- Pair.+				_ -> (False, undefined)+		]+	 ]+
+ src-lib/WeekDaze/ProblemConfiguration/ProblemValidationSwitches.hs view
@@ -0,0 +1,955 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the toggle-switches used to enable/disable checks on the validity of /ProblemParameters/.+-}++module WeekDaze.ProblemConfiguration.ProblemValidationSwitches(+-- * Types+-- ** Data-types+	ProblemValidationSwitches(..),+-- * Constants+--	tag,+	checkAvailabilityOfAnyGroupMemberTag,+	checkCapacityOfLocationsForMeetingsTag,+	checkCoursesForSynchronousSpecifiedTimesTag,+	checkDuplicateMeetingLocationIdsTag,+	checkDuplicateOwnLocationIdsTag,+	checkForAlternativesToSynchronisedCoursesTag,+	checkForDuplicateStudentIdsTag,+	checkForIdleStudentsTag,+	checkForIdleTeachersTag,+	checkForInvalidMeetingTimesTag,+	checkForMultipleCoursesPerTeacherPerSynchronisationIdTag,+	checkForNonExistentFacilitiesTag,+	checkForNonExistentGroupIdsTag,+	checkForNonExistentMeetingLocationIdsTag,+	checkForNonExistentOwnLocationIdsTag,+	checkForOverloadedStudentsTag,+	checkForSingletonSynchronisedCoursesTag,+	checkForStudentsRequiringMultipleSynchronisedSubjectsTag,+	checkForStudentsWithUnrealisableFreePeriodPreferenceTag,+	checkForSynchronisedCoursesWithDifferentIdealTimeslotsTag,+	checkForSynchronisedCoursesWithDifferentLessonsPerWeekTag,+	checkForSynchronisedCoursesWithExcessLessonsPerWeekTag,+	checkForSynchronisedCoursesWithExcessSpecifiedTimesTag,+	checkForSynchronisedCoursesWithExcessTimeslotRequestsTag,+	checkForSynchronisedCoursesWithoutSuitableLocationsTag,+	checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag,+	checkForTeachersWithUnrealisableFreePeriodPreferenceTag,+	checkIfStudentBodiesExceedTeachersTag,+	checkIfStudentBodySizeExceedsCapacityOfAllLocationsTag,+	checkIfStudentBodySizeExceedsLocationCapacityTag,+	checkIndependenceOfStudentTimeslotsRequestsAndMeetingsTag,+	checkIndependenceOfTeacherTimeslotsRequestsAndMeetingsTag,+	checkLocationsAvailabilityToSupportCoursesTag,+	checkLocationsForSynchronousSpecifiedTimesTag,+	checkMeetingLocationsAvailabilityTag,+	checkMinimumConsecutiveLessonsTag,+	checkNullGroupIdTag,+	checkNullLocationCatalogueTag,+	checkNullStudentBodyRegisterTag,+	checkNullTeacherRegisterTag,+	checkOwnLocationsAvailabilityTag,+	checkRequiredLessonsPerWeekTag,+	checkSimultaneousAvailabilityOfGroupMembersTag,+	checkStudentsAvailabilityForMandatoryMeetingsTag,+	checkStudentsAvailabilityForSpecifiedTimesTag,+	checkStudentsForMultipleLevelsOfSameTopicTag,+	checkStudentsForSynchronousMeetingsTag,+	checkStudentsLowerWorkloadBoundTag,+	checkStudentsUpperWorkloadBoundTag,+	checkSubjectExistenceTag,+	checkSuitableLocationsForKnowledgeRequirementsTag,+	checkTeachersAvailabilityForMandatoryMeetingsTag,+	checkTeachersForSynchronousMeetingsTag,+	checkTeachersUpperWorkloadBoundTag,+	checkTeachingCapacityBySubjectTag,+	checkTimeslotIdBoundsTag,+	checkTimeslotRequestsTag+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT+import qualified	WeekDaze.Enhanced.EnhancedTuple			as Enhanced.EnhancedTuple+import qualified	WeekDaze.ProblemConfiguration.ValidationSwitch	as ProblemConfiguration.ValidationSwitch+import			WeekDaze.Enhanced.EnhancedBool()++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Maybe+import qualified	WeekDaze.Database.Selector			as Database.Selector++-- Some checks are irrelevant given the known integrity of the database.+instance Database.Selector.Selector ProblemValidationSwitches where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= Database.Selector.tablePrefix ++ tag+	 in do+		switchesRows	<- map (+			map $ Data.Maybe.fromMaybe ProblemConfiguration.ValidationSwitch.defaultCheck . either (+				error . showString "WeekDaze.ProblemConfiguration.ProblemValidationSwitches.fromDatabase:\tfailed to parse the value for a switch read from the database; " . show+			) id . Database.HDBC.safeFromSql+		 ) `fmap` Database.Selector.select connection [+			checkAvailabilityOfAnyGroupMemberTag,+			checkCapacityOfLocationsForMeetingsTag,+			checkCoursesForSynchronousSpecifiedTimesTag,+			checkDuplicateMeetingLocationIdsTag,+--			checkDuplicateOwnLocationIdsTag,+			checkForAlternativesToSynchronisedCoursesTag,+--			checkForDuplicateStudentIdsTag,+			checkForIdleStudentsTag,+			checkForIdleTeachersTag,+--			checkForInvalidMeetingTimesTag,+			checkForMultipleCoursesPerTeacherPerSynchronisationIdTag,+			checkForNonExistentFacilitiesTag,+--			checkForNonExistentGroupIdsTag,+--			checkForNonExistentMeetingLocationIdsTag,+--			checkForNonExistentOwnLocationIdsTag,+			checkForOverloadedStudentsTag,+			checkForSingletonSynchronisedCoursesTag,+			checkForStudentsRequiringMultipleSynchronisedSubjectsTag,+			checkForStudentsWithUnrealisableFreePeriodPreferenceTag,+			checkForSynchronisedCoursesWithDifferentIdealTimeslotsTag,+			checkForSynchronisedCoursesWithDifferentLessonsPerWeekTag,+			checkForSynchronisedCoursesWithExcessLessonsPerWeekTag,+			checkForSynchronisedCoursesWithExcessSpecifiedTimesTag,+			checkForSynchronisedCoursesWithExcessTimeslotRequestsTag,+			checkForSynchronisedCoursesWithoutSuitableLocationsTag,+			checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag,+			checkForTeachersWithUnrealisableFreePeriodPreferenceTag,+			checkIfStudentBodiesExceedTeachersTag,+			checkIfStudentBodySizeExceedsCapacityOfAllLocationsTag,+			checkIfStudentBodySizeExceedsLocationCapacityTag,+			checkIndependenceOfStudentTimeslotsRequestsAndMeetingsTag,+			checkIndependenceOfTeacherTimeslotsRequestsAndMeetingsTag,+			checkLocationsAvailabilityToSupportCoursesTag,+			checkLocationsForSynchronousSpecifiedTimesTag,+			checkMeetingLocationsAvailabilityTag,+--			checkMinimumConsecutiveLessonsTag,+--			checkNullGroupIdTag,+			checkNullLocationCatalogueTag,+			checkNullStudentBodyRegisterTag,+			checkNullTeacherRegisterTag,+			checkOwnLocationsAvailabilityTag,+			checkRequiredLessonsPerWeekTag,+			checkSimultaneousAvailabilityOfGroupMembersTag,+			checkStudentsAvailabilityForMandatoryMeetingsTag,+			checkStudentsAvailabilityForSpecifiedTimesTag,+--			checkStudentsForMultipleLevelsOfSameTopicTag,+			checkStudentsForSynchronousMeetingsTag,+			checkStudentsLowerWorkloadBoundTag,+			checkStudentsUpperWorkloadBoundTag,+--			checkSubjectExistenceTag,+			checkSuitableLocationsForKnowledgeRequirementsTag,+			checkTeachersAvailabilityForMandatoryMeetingsTag,+			checkTeachersForSynchronousMeetingsTag,+			checkTeachersUpperWorkloadBoundTag,+			checkTeachingCapacityBySubjectTag+--			checkTimeslotIdBoundsTag,+--			checkTimeslotRequestsTag+		 ] [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-Monad-} $ case switchesRows of+			[]		-> Data.Default.def+			[switchesRow]	-> case switchesRow of+				[+					checkAvailabilityOfAnyGroupMember,+					checkCapacityOfLocationsForMeetings,+					checkCoursesForSynchronousSpecifiedTimes,+					checkDuplicateMeetingLocationIds,+--					checkDuplicateOwnLocationIds,+					checkForAlternativesToSynchronisedCourses,+--					checkForDuplicateStudentIds,+					checkForIdleStudents,+					checkForIdleTeachers,+--					checkForInvalidMeetingTimes,+					checkForMultipleCoursesPerTeacherPerSynchronisationId,+					checkForNonExistentFacilities,+--					checkForNonExistentGroupIds,+--					checkForNonExistentMeetingLocationIds,+--					checkForNonExistentOwnLocationIds,+					checkForOverloadedStudents,+					checkForSingletonSynchronisedCourses,+					checkForStudentsRequiringMultipleSynchronisedSubjects,+					checkForStudentsWithUnrealisableFreePeriodPreference,+					checkForSynchronisedCoursesWithDifferentIdealTimeslots,+					checkForSynchronisedCoursesWithDifferentLessonsPerWeek,+					checkForSynchronisedCoursesWithExcessLessonsPerWeek,+					checkForSynchronisedCoursesWithExcessSpecifiedTimes,+					checkForSynchronisedCoursesWithExcessTimeslotRequests,+					checkForSynchronisedCoursesWithoutSuitableLocations,+					checkForSynchronisedCoursesWithUnavailableSpecifiedDays,+					checkForTeachersWithUnrealisableFreePeriodPreference,+					checkIfStudentBodiesExceedTeachers,+					checkIfStudentBodySizeExceedsCapacityOfAllLocations,+					checkIfStudentBodySizeExceedsLocationCapacity,+					checkIndependenceOfStudentTimeslotsRequestsAndMeetings,+					checkIndependenceOfTeacherTimeslotsRequestsAndMeetings,+					checkLocationsAvailabilityToSupportCourses,+					checkLocationsForSynchronousSpecifiedTimes,+					checkMeetingLocationsAvailability,+--					checkMinimumConsecutiveLessons,+--					checkNullGroupId,+					checkNullLocationCatalogue,+					checkNullStudentBodyRegister,+					checkNullTeacherRegister,+					checkOwnLocationsAvailability,+					checkRequiredLessonsPerWeek,+					checkSimultaneousAvailabilityOfGroupMembers,+					checkStudentsAvailabilityForMandatoryMeetings,+					checkStudentsAvailabilityForSpecifiedTimes,+--					checkStudentsForMultipleLevelsOfSameTopic,+					checkStudentsForSynchronousMeetings,+					checkStudentsLowerWorkloadBound,+					checkStudentsUpperWorkloadBound,+--					checkSubjectExistence,+					checkSuitableLocationsForKnowledgeRequirements,+					checkTeachersAvailabilityForMandatoryMeetings,+					checkTeachersForSynchronousMeetings,+					checkTeachersUpperWorkloadBound,+					checkTeachingCapacityBySubject+--					checkTimeslotIdBounds,+--					checkTimeslotRequests+				 ] -> Data.Default.def {+					getCheckAvailabilityOfAnyGroupMember				= checkAvailabilityOfAnyGroupMember,+					getCheckCapacityOfLocationsForMeetings				= checkCapacityOfLocationsForMeetings,+					getCheckCoursesForSynchronousSpecifiedTimes			= checkCoursesForSynchronousSpecifiedTimes,+					getCheckDuplicateMeetingLocationIds				= checkDuplicateMeetingLocationIds,+--					getCheckDuplicateOwnLocationIds					= checkDuplicateOwnLocationIds,+					getCheckForAlternativesToSynchronisedCourses			= checkForAlternativesToSynchronisedCourses,+--					getCheckForDuplicateStudentIds					= checkForDuplicateStudentIds,+					getCheckForIdleStudents						= checkForIdleStudents,+					getCheckForIdleTeachers						= checkForIdleTeachers,+--					getCheckForInvalidMeetingTimes					= checkForInvalidMeetingTimes,+					getCheckForMultipleCoursesPerTeacherPerSynchronisationId	= checkForMultipleCoursesPerTeacherPerSynchronisationId,+					getCheckForNonExistentFacilities				= checkForNonExistentFacilities,+--					getCheckForNonExistentGroupIds					= checkForNonExistentGroupIds,+--					getCheckForNonExistentMeetingLocationIds			= checkForNonExistentMeetingLocationIds,+--					getCheckForNonExistentOwnLocationIds				= checkForNonExistentOwnLocationIds,+					getCheckForOverloadedStudents					= checkForOverloadedStudents,+					getCheckForSingletonSynchronisedCourses				= checkForSingletonSynchronisedCourses,+					getCheckForStudentsRequiringMultipleSynchronisedSubjects	= checkForStudentsRequiringMultipleSynchronisedSubjects,+					getCheckForStudentsWithUnrealisableFreePeriodPreference		= checkForStudentsWithUnrealisableFreePeriodPreference,+					getCheckForSynchronisedCoursesWithDifferentIdealTimeslots	= checkForSynchronisedCoursesWithDifferentIdealTimeslots,+					getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek	= checkForSynchronisedCoursesWithDifferentLessonsPerWeek,+					getCheckForSynchronisedCoursesWithExcessLessonsPerWeek		= checkForSynchronisedCoursesWithExcessLessonsPerWeek,+					getCheckForSynchronisedCoursesWithExcessSpecifiedTimes		= checkForSynchronisedCoursesWithExcessSpecifiedTimes,+					getCheckForSynchronisedCoursesWithExcessTimeslotRequests	= checkForSynchronisedCoursesWithExcessTimeslotRequests,+					getCheckForSynchronisedCoursesWithoutSuitableLocations		= checkForSynchronisedCoursesWithoutSuitableLocations,+					getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays	= checkForSynchronisedCoursesWithUnavailableSpecifiedDays,+					getCheckForTeachersWithUnrealisableFreePeriodPreference		= checkForTeachersWithUnrealisableFreePeriodPreference,+					getCheckIfStudentBodiesExceedTeachers				= checkIfStudentBodiesExceedTeachers,+					getCheckIfStudentBodySizeExceedsCapacityOfAllLocations		= checkIfStudentBodySizeExceedsCapacityOfAllLocations,+					getCheckIfStudentBodySizeExceedsLocationCapacity		= checkIfStudentBodySizeExceedsLocationCapacity,+					getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings	= checkIndependenceOfStudentTimeslotsRequestsAndMeetings,+					getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings	= checkIndependenceOfTeacherTimeslotsRequestsAndMeetings,+					getCheckLocationsAvailabilityToSupportCourses			= checkLocationsAvailabilityToSupportCourses,+					getCheckLocationsForSynchronousSpecifiedTimes			= checkLocationsForSynchronousSpecifiedTimes,+					getCheckMeetingLocationsAvailability				= checkMeetingLocationsAvailability,+--					getCheckMinimumConsecutiveLessons				= checkMinimumConsecutiveLessons,+--					getCheckNullGroupId						= checkNullGroupId,+					getCheckNullLocationCatalogue					= checkNullLocationCatalogue,+					getCheckNullStudentBodyRegister					= checkNullStudentBodyRegister,+					getCheckNullTeacherRegister					= checkNullTeacherRegister,+					getCheckOwnLocationsAvailability				= checkOwnLocationsAvailability,+					getCheckRequiredLessonsPerWeek					= checkRequiredLessonsPerWeek,+					getCheckSimultaneousAvailabilityOfGroupMembers			= checkSimultaneousAvailabilityOfGroupMembers,+					getCheckStudentsAvailabilityForMandatoryMeetings		= checkStudentsAvailabilityForMandatoryMeetings,+					getCheckStudentsAvailabilityForSpecifiedTimes			= checkStudentsAvailabilityForSpecifiedTimes,+--					getCheckStudentsForMultipleLevelsOfSameTopic			= checkStudentsForMultipleLevelsOfSameTopic,+					getCheckStudentsForSynchronousMeetings				= checkStudentsForSynchronousMeetings,+					getCheckStudentsLowerWorkloadBound				= checkStudentsLowerWorkloadBound,+					getCheckStudentsUpperWorkloadBound				= checkStudentsUpperWorkloadBound,+--					getCheckSubjectExistence					= checkSubjectExistence,+					getCheckSuitableLocationsForKnowledgeRequirements		= checkSuitableLocationsForKnowledgeRequirements,+					getCheckTeachersAvailabilityForMandatoryMeetings		= checkTeachersAvailabilityForMandatoryMeetings,+					getCheckTeachersForSynchronousMeetings				= checkTeachersForSynchronousMeetings,+					getCheckTeachersUpperWorkloadBound				= checkTeachersUpperWorkloadBound,+					getCheckTeachingCapacityBySubject				= checkTeachingCapacityBySubject+--					getCheckTimeslotIdBounds					= checkTimeslotIdBounds,+--					getCheckTimeslotRequests					= checkTimeslotRequests+				}+				_ -> error $ "WeekDaze.ProblemConfiguration.ProblemValidationSwitches.fromDatabase:\tunexpected number of columns=" ++ show (length switchesRow) ++ " in row of table " ++ show tableName ++ "."+			_		-> error $ "WeekDaze.ProblemConfiguration.ProblemValidationSwitches.fromDatabase:\tunexpected number of rows=" ++ show (length switchesRows) ++ " selected from table " ++ show tableName ++ "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag								= "problemValidationSwitches"++-- | Used to qualify SQL & XML.+checkAvailabilityOfAnyGroupMemberTag :: String+checkAvailabilityOfAnyGroupMemberTag				= "checkAvailabilityOfAnyGroupMember"++-- | Used to qualify SQL & XML.+checkCapacityOfLocationsForMeetingsTag :: String+checkCapacityOfLocationsForMeetingsTag				= "checkCapacityOfLocationsForMeetings"++-- | Used to qualify SQL & XML.+checkCoursesForSynchronousSpecifiedTimesTag :: String+checkCoursesForSynchronousSpecifiedTimesTag			= "checkCoursesForSynchronousSpecifiedTimes"++-- | Used to qualify SQL & XML.+checkDuplicateMeetingLocationIdsTag :: String+checkDuplicateMeetingLocationIdsTag				= "checkDuplicateMeetingLocationIds"++-- | Used to qualify XML.+checkDuplicateOwnLocationIdsTag :: String+checkDuplicateOwnLocationIdsTag					= "checkDuplicateOwnLocationIds"++-- | Used to qualify SQL & XML.+checkForAlternativesToSynchronisedCoursesTag :: String+checkForAlternativesToSynchronisedCoursesTag			= "checkForAlternativesToSynchronisedCourses"++-- | Used to qualify XML.+checkForDuplicateStudentIdsTag :: String+checkForDuplicateStudentIdsTag					= "checkForDuplicateStudentIds"++-- | Used to qualify SQL & XML.+checkForIdleStudentsTag :: String+checkForIdleStudentsTag						= "checkForIdleStudents"++-- | Used to qualify SQL & XML.+checkForIdleTeachersTag :: String+checkForIdleTeachersTag						= "checkForIdleTeachers"++-- | Used to qualify XML.+checkForInvalidMeetingTimesTag :: String+checkForInvalidMeetingTimesTag					= "checkForInvalidMeetingTimes"++-- | Used to qualify SQL & XML.+checkForMultipleCoursesPerTeacherPerSynchronisationIdTag :: String+checkForMultipleCoursesPerTeacherPerSynchronisationIdTag	= "checkForMultipleCoursesPerTeacherPerSynchronisationId"++-- | Used to qualify SQL & XML.+checkForNonExistentFacilitiesTag :: String+checkForNonExistentFacilitiesTag				= "checkForNonExistentFacilities"++-- | Used to qualify XML.+checkForNonExistentGroupIdsTag :: String+checkForNonExistentGroupIdsTag					= "checkForNonExistentGroupIds"++-- | Used to qualify XML.+checkForNonExistentMeetingLocationIdsTag :: String+checkForNonExistentMeetingLocationIdsTag			= "checkForNonExistentMeetingLocationIds"++-- | Used to qualify XML.+checkForNonExistentOwnLocationIdsTag :: String+checkForNonExistentOwnLocationIdsTag				= "checkForNonExistentOwnLocationIds"++-- | Used to qualify SQL & XML.+checkForOverloadedStudentsTag :: String+checkForOverloadedStudentsTag					= "checkForOverloadedStudents"++-- | Used to qualify SQL & XML.+checkForSingletonSynchronisedCoursesTag :: String+checkForSingletonSynchronisedCoursesTag				= "checkForSingletonSynchronisedCourses"++-- | Used to qualify SQL & XML.+checkForStudentsRequiringMultipleSynchronisedSubjectsTag :: String+checkForStudentsRequiringMultipleSynchronisedSubjectsTag	= "checkForStudentsRequiringMultipleSynchronisedSubjects"++-- | Used to qualify SQL & XML.+checkForStudentsWithUnrealisableFreePeriodPreferenceTag :: String+checkForStudentsWithUnrealisableFreePeriodPreferenceTag		= "checkForStudentsWithUnrealisableFreePeriodPreference"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithDifferentIdealTimeslotsTag :: String+checkForSynchronisedCoursesWithDifferentIdealTimeslotsTag	= "checkForSynchronisedCoursesWithDifferentIdealTimeslots"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithDifferentLessonsPerWeekTag :: String+checkForSynchronisedCoursesWithDifferentLessonsPerWeekTag	= "checkForSynchronisedCoursesWithDifferentLessonsPerWeek"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithExcessLessonsPerWeekTag :: String+checkForSynchronisedCoursesWithExcessLessonsPerWeekTag		= "checkForSynchronisedCoursesWithExcessLessonsPerWeek"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithExcessSpecifiedTimesTag :: String+checkForSynchronisedCoursesWithExcessSpecifiedTimesTag		= "checkForSynchronisedCoursesWithExcessSpecifiedTimes"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithExcessTimeslotRequestsTag :: String+checkForSynchronisedCoursesWithExcessTimeslotRequestsTag	= "checkForSynchronisedCoursesWithExcessTimeslotRequests"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithoutSuitableLocationsTag :: String+checkForSynchronisedCoursesWithoutSuitableLocationsTag		= "checkForSynchronisedCoursesWithoutSuitableLocations"++-- | Used to qualify SQL & XML.+checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag :: String+checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag	= "checkForSynchronisedCoursesWithUnavailableSpecifiedDays"++-- | Used to qualify SQL & XML.+checkForTeachersWithUnrealisableFreePeriodPreferenceTag :: String+checkForTeachersWithUnrealisableFreePeriodPreferenceTag		= "checkForTeachersWithUnrealisableFreePeriodPreference"++-- | Used to qualify SQL & XML.+checkIfStudentBodiesExceedTeachersTag :: String+checkIfStudentBodiesExceedTeachersTag				= "checkIfStudentBodiesExceedTeachers"++-- | Used to qualify SQL & XML.+checkIfStudentBodySizeExceedsCapacityOfAllLocationsTag :: String+checkIfStudentBodySizeExceedsCapacityOfAllLocationsTag		= "checkIfStudentBodySizeExceedsCapacityOfAllLocations"++-- | Used to qualify SQL & XML.+checkIfStudentBodySizeExceedsLocationCapacityTag :: String+checkIfStudentBodySizeExceedsLocationCapacityTag		= "checkIfStudentBodySizeExceedsLocationCapacity"++-- | Used to qualify SQL & XML.+checkIndependenceOfStudentTimeslotsRequestsAndMeetingsTag :: String+checkIndependenceOfStudentTimeslotsRequestsAndMeetingsTag	= "checkIndependenceOfStudentTimeslotsRequestsAndMeetings"++-- | Used to qualify SQL & XML.+checkIndependenceOfTeacherTimeslotsRequestsAndMeetingsTag :: String+checkIndependenceOfTeacherTimeslotsRequestsAndMeetingsTag	= "checkIndependenceOfTeacherTimeslotsRequestsAndMeetings"++-- | Used to qualify SQL & XML.+checkLocationsAvailabilityToSupportCoursesTag :: String+checkLocationsAvailabilityToSupportCoursesTag			= "checkLocationsAvailabilityToSupportCourses"++-- | Used to qualify SQL & XML.+checkLocationsForSynchronousSpecifiedTimesTag :: String+checkLocationsForSynchronousSpecifiedTimesTag			= "checkLocationsForSynchronousSpecifiedTimes"++-- | Used to qualify SQL & XML.+checkMeetingLocationsAvailabilityTag :: String+checkMeetingLocationsAvailabilityTag				= "checkMeetingLocationsAvailability"++-- | Used to qualify XML.+checkMinimumConsecutiveLessonsTag :: String+checkMinimumConsecutiveLessonsTag				= "checkMinimumConsecutiveLessons"++-- | Used to qualify XML.+checkNullGroupIdTag :: String+checkNullGroupIdTag						= "checkNullGroupId"++-- | Used to qualify SQL & XML.+checkNullLocationCatalogueTag :: String+checkNullLocationCatalogueTag					= "checkNullLocationCatalogue"++-- | Used to qualify SQL & XML.+checkNullStudentBodyRegisterTag :: String+checkNullStudentBodyRegisterTag					= "checkNullStudentBodyRegister"++-- | Used to qualify SQL & XML.+checkNullTeacherRegisterTag :: String+checkNullTeacherRegisterTag					= "checkNullTeacherRegister"++-- | Used to qualify SQL & XML.+checkOwnLocationsAvailabilityTag :: String+checkOwnLocationsAvailabilityTag				= "checkOwnLocationsAvailability"++-- | Used to qualify SQL & XML.+checkRequiredLessonsPerWeekTag :: String+checkRequiredLessonsPerWeekTag					= "checkRequiredLessonsPerWeek"++-- | Used to qualify SQL & XML.+checkSimultaneousAvailabilityOfGroupMembersTag :: String+checkSimultaneousAvailabilityOfGroupMembersTag			= "checkSimultaneousAvailabilityOfGroupMembers"++-- | Used to qualify SQL & XML.+checkStudentsAvailabilityForMandatoryMeetingsTag :: String+checkStudentsAvailabilityForMandatoryMeetingsTag		= "checkStudentsAvailabilityForMandatoryMeetings"++-- | Used to qualify SQL & XML.+checkStudentsAvailabilityForSpecifiedTimesTag :: String+checkStudentsAvailabilityForSpecifiedTimesTag			= "checkStudentsAvailabilityForSpecifiedTimes"++-- | Used to qualify XML.+checkStudentsForMultipleLevelsOfSameTopicTag :: String+checkStudentsForMultipleLevelsOfSameTopicTag			= "checkStudentsForMultipleLevelsOfSameTopic"++-- | Used to qualify SQL & XML.+checkStudentsForSynchronousMeetingsTag :: String+checkStudentsForSynchronousMeetingsTag				= "checkStudentsForSynchronousMeetings"++-- | Used to qualify SQL & XML.+checkStudentsLowerWorkloadBoundTag :: String+checkStudentsLowerWorkloadBoundTag				= "checkStudentsLowerWorkloadBound"++-- | Used to qualify SQL & XML.+checkStudentsUpperWorkloadBoundTag :: String+checkStudentsUpperWorkloadBoundTag				= "checkStudentsUpperWorkloadBound"++-- | Used to qualify XML.+checkSubjectExistenceTag :: String+checkSubjectExistenceTag					= "checkSubjectExistence"++-- | Used to qualify XML.+checkSuitableLocationsForKnowledgeRequirementsTag :: String+checkSuitableLocationsForKnowledgeRequirementsTag		= "checkSuitableLocationsForKnowledgeRequirements"++-- | Used to qualify SQL & XML.+checkTeachersAvailabilityForMandatoryMeetingsTag :: String+checkTeachersAvailabilityForMandatoryMeetingsTag		= "checkTeachersAvailabilityForMandatoryMeetings"++-- | Used to qualify SQL & XML.+checkTeachersForSynchronousMeetingsTag :: String+checkTeachersForSynchronousMeetingsTag				= "checkTeachersForSynchronousMeetings"++-- | Used to qualify SQL & XML.+checkTeachersUpperWorkloadBoundTag :: String+checkTeachersUpperWorkloadBoundTag				= "checkTeachersUpperWorkloadBound"++-- | Used to qualify SQL & XML.+checkTeachingCapacityBySubjectTag :: String+checkTeachingCapacityBySubjectTag				= "checkTeachingCapacityBySubject"++-- | Used to qualify XML.+checkTimeslotIdBoundsTag :: String+checkTimeslotIdBoundsTag					= "checkTimeslotIdBounds"++-- | Used to qualify XML.+checkTimeslotRequestsTag :: String+checkTimeslotRequestsTag					= "checkTimeslotRequests"++-- | Encapsulates the data which defines the problem.+data ProblemValidationSwitches	= MkProblemValidationSwitches {+	getCheckAvailabilityOfAnyGroupMember				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that at least one member, can attend each meeting of a group.+	getCheckCapacityOfLocationsForMeetings				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that any /location/, specified for the /meeting/s of each /group/, has adequate capacity.+	getCheckCoursesForSynchronousSpecifiedTimes			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that no /course/s, required to satisfy a /student/'s /knowledge-requirements/, specify the same /booking-time/.+	getCheckDuplicateMeetingLocationIds				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that when more than one /group/ requires a /location/, that their /meeting/-times are mutually exclusive.+	getCheckDuplicateOwnLocationIds					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that when more than one /teacher/ claims a single /location/ as their own, their working-weeks are mutually exclusive.+	getCheckForAlternativesToSynchronisedCourses			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Ensure that /student/s can migrate easily between /synchronised course/s, by prohibiting any /teacher/ from offering an alternative /course/ outside the set of /synchronised courses/, but with an identical /subject/ to one of the member-/course/s.+	getCheckForDuplicateStudentIds					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that no /student/-identifier belongs to more than one /student-body/.+	getCheckForIdleStudents						:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /student/s who require zero /subject/s, but have allocated one or more /time-slot/s for teaching.+	getCheckForIdleTeachers						:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /teacher/s who offer zero /course/s required by /student/s, but have allocated one or more /time-slot/s for teaching.+	getCheckForInvalidMeetingTimes					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all the /timeslot-Id/s, used to define the meeting-times of groups, are within permissible bounds.+	getCheckForMultipleCoursesPerTeacherPerSynchronisationId	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that no /teacher/ offers more than one /course/ with the same /synchronisationId/.+	getCheckForNonExistentFacilities				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether all /facilities/, referenced by those /course/s offered by /teacher/s, exist in at least one /location/.+	getCheckForNonExistentGroupIds					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether all /group-id/s, referenced by /human-resource/s, exist independently.+	getCheckForNonExistentMeetingLocationIds			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether all /location-id/s, required for the meetings of /group/s, exist.+	getCheckForNonExistentOwnLocationIds				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether all /location-id/s, referenced by /teacher/s, exist independently.+	getCheckForOverloadedStudents					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /student/s who have allocated zero /time-slot/s for teaching, but have requested one or more /subject/s.+	getCheckForSingletonSynchronisedCourses				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /teacher/s whose /course/s are members of singleton sets of synchronised courses.+	getCheckForStudentsRequiringMultipleSynchronisedSubjects	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for any /student-body/ requiring multiple /subject/s only offered within one set of /synchronised course/s.+	getCheckForStudentsWithUnrealisableFreePeriodPreference	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for any /student-body/ whose preference for the position of free /time-slot/s, within those days when they're /available/, can never be realised because of the meeting-times of /group/s of which they're members.+	getCheckForSynchronisedCoursesWithDifferentIdealTimeslots	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /synchronised course/s don't define /timeslotRequest/s with different /ideal timeslot-id/s.+	getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /synchronised course/s which require different numbers of /lesson/s per week.+	getCheckForSynchronisedCoursesWithExcessLessonsPerWeek		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /synchronised course/s which require more /lesson/s per week, than the number of /time-slot/s for which all the interested /student-bodies/ & required /teacher/s, are simultaneously /available/.+	getCheckForSynchronisedCoursesWithExcessSpecifiedTimes		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /synchronised course/s which have fewer /lesson/ per week than specified /booking-time/s.+	getCheckForSynchronisedCoursesWithExcessTimeslotRequests	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /synchronised course/s which define both /ideal timeslotIds/ & specified /booking-time/s.+	getCheckForSynchronisedCoursesWithoutSuitableLocations		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /synchronised course/s which lack sufficient /locations/ offering the required /facilities/, which are simultaneously /available/ to the /teacher/s & all interested /student/s.+	getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /synchronised course/s which specify /time/s, on /day/s when not all the interested student-bodies & required /teacher/s, are /available/.+	getCheckForTeachersWithUnrealisableFreePeriodPreference	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for any /teacher/ whose preference for the position of free /time-slot/s, within those days when they're /available/, can never be realised because of the /meeting/-times of /group/s of which they're members.+	getCheckIfStudentBodiesExceedTeachers				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether there are sufficient /teacher/s for the number of /student-bodies/, on each day.+	getCheckIfStudentBodySizeExceedsCapacityOfAllLocations		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether each /student-body/ can be accommodated within the largest /available/ /location/.+	getCheckIfStudentBodySizeExceedsLocationCapacity		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether all /student-bodies/ can be accommodated within the /available/ /location/s, on each day.+	getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /student-bodies/ are members of /group/s which specify meeting-times (even those which don't mandate attendance), which match any of the specified booking-times of /course/s they must attend.+	getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /teacher/s are members of /group/s which specify meeting-times (even those which don't mandate attendance), which match any of the specified booking-times of /course/s they must attend.+	getCheckLocationsAvailabilityToSupportCourses			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that there are sufficient /location/s, simultaneously available with at least one /student-body/ & at least one /teacher/, to support the total number of /time-slot/s required for the /course/s offered by all /teacher/s.+	getCheckLocationsForSynchronousSpecifiedTimes			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check there are enough /locations/, in which to book /lesson/s, at those /time/s specified by different /teachers/.+	getCheckMeetingLocationsAvailability				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that any /location/ required for a /group/, is /available/ at all /meeting/-times.+	getCheckMinimumConsecutiveLessons				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that a /course/'s /minimumConsecutiveLessons/ doesn't exceed the number of /time-slot/s per /day/.+	getCheckNullGroupId						:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for null identifiers in the /group-catalogue/.+	getCheckNullLocationCatalogue					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether the /location-catalogue/ is empty.+	getCheckNullStudentBodyRegister					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether the /student-body register/ is empty.+	getCheckNullTeacherRegister					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check whether the /teacher register/ is empty.+	getCheckOwnLocationsAvailability				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that if /teacher/s specify their own /location/, that there's some common /availability/.+	getCheckRequiredLessonsPerWeek					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that no /course/ is offered, which requires more /lesson/s per week, than the /teacher/ works.+	getCheckSimultaneousAvailabilityOfGroupMembers			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all the members of each /group/, are simultaneously /available/.+	getCheckStudentsAvailabilityForMandatoryMeetings		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /student-bodies/ are /available/ for the /meeting/-times of the /group/s of which they're members.+	getCheckStudentsAvailabilityForSpecifiedTimes			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that no /course/, required to satisfy a /student/'s /knowledge-requirements/, specifies any /time/, on a /day/ when that /student/'s un/available/.+	getCheckStudentsForMultipleLevelsOfSameTopic			:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that the /knowledge-requirements/ of each /student-body/, don't specify more than one /level/ in any /topic/. This might occur legitimately where studying one /subject/ for two different exams e.g. Scottish Higher & A-level.+	getCheckStudentsForSynchronousMeetings				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /student-bodies/ aren't members of /group/s with synchronous meeting-times.+	getCheckStudentsLowerWorkloadBound				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /student-bodies/ book sufficient /subject/s.+	getCheckStudentsUpperWorkloadBound				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /student-bodies/ don't book excess /subject/s.+	getCheckSubjectExistence					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for the existence of the requested /subject/s.+	getCheckSuitableLocationsForKnowledgeRequirements		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that there are suitable /location/s for each /knowledge-requirement/ of each /student-body/.+	getCheckTeachersAvailabilityForMandatoryMeetings		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /teacher/s are /available/ for the /meeting/-times of the /group/s of which they're members.+	getCheckTeachersForSynchronousMeetings				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /teacher/s aren't members of /group/s with synchronous /meeting/-times.+	getCheckTeachersUpperWorkloadBound				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /teacher/s aren't members of too many /group/s.+	getCheckTeachingCapacityBySubject				:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that there's sufficient teaching-capacity, to satisfy the demand by /student/s for each /subject/.+	getCheckTimeslotIdBounds					:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check the range of /timeslot-id/s defined, is sufficient.+	getCheckTimeslotRequests					:: ProblemConfiguration.ValidationSwitch.Check	-- ^ Check that all /timeslot-request/s reference a valid /timeslot-id/.+} deriving (Eq, Show)++instance HXT.XmlPickler ProblemValidationSwitches where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(+			a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56+		) -> MkProblemValidationSwitches a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39 a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56,	-- Construct from a tuple.+		\MkProblemValidationSwitches {+			getCheckAvailabilityOfAnyGroupMember				= checkAvailabilityOfAnyGroupMember,+			getCheckCapacityOfLocationsForMeetings				= checkCapacityOfLocationsForMeetings,+			getCheckCoursesForSynchronousSpecifiedTimes			= checkCoursesForSynchronousSpecifiedTimes,+			getCheckDuplicateMeetingLocationIds				= checkDuplicateMeetingLocationIds,+			getCheckDuplicateOwnLocationIds					= checkDuplicateOwnLocationIds,+			getCheckForAlternativesToSynchronisedCourses			= checkForAlternativesToSynchronisedCourses,+			getCheckForDuplicateStudentIds					= checkForDuplicateStudentIds,+			getCheckForIdleStudents						= checkForIdleStudents,+			getCheckForIdleTeachers						= checkForIdleTeachers,+			getCheckForInvalidMeetingTimes					= checkForInvalidMeetingTimes,+			getCheckForMultipleCoursesPerTeacherPerSynchronisationId	= checkForMultipleCoursesPerTeacherPerSynchronisationId,+			getCheckForNonExistentFacilities				= checkForNonExistentFacilities,+			getCheckForNonExistentGroupIds					= checkForNonExistentGroupIds,+			getCheckForNonExistentMeetingLocationIds			= checkForNonExistentMeetingLocationIds,+			getCheckForNonExistentOwnLocationIds				= checkForNonExistentOwnLocationIds,+			getCheckForOverloadedStudents					= checkForOverloadedStudents,+			getCheckForSingletonSynchronisedCourses				= checkForSingletonSynchronisedCourses,+			getCheckForStudentsRequiringMultipleSynchronisedSubjects	= checkForStudentsRequiringMultipleSynchronisedSubjects,+			getCheckForStudentsWithUnrealisableFreePeriodPreference		= checkForStudentsWithUnrealisableFreePeriodPreference,+			getCheckForSynchronisedCoursesWithDifferentIdealTimeslots	= checkForSynchronisedCoursesWithDifferentIdealTimeslots,+			getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek	= checkForSynchronisedCoursesWithDifferentLessonsPerWeek,+			getCheckForSynchronisedCoursesWithExcessLessonsPerWeek		= checkForSynchronisedCoursesWithExcessLessonsPerWeek,+			getCheckForSynchronisedCoursesWithExcessSpecifiedTimes		= checkForSynchronisedCoursesWithExcessSpecifiedTimes,+			getCheckForSynchronisedCoursesWithExcessTimeslotRequests	= checkForSynchronisedCoursesWithExcessTimeslotRequests,+			getCheckForSynchronisedCoursesWithoutSuitableLocations		= checkForSynchronisedCoursesWithoutSuitableLocations,+			getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays	= checkForSynchronisedCoursesWithUnavailableSpecifiedDays,+			getCheckForTeachersWithUnrealisableFreePeriodPreference		= checkForTeachersWithUnrealisableFreePeriodPreference,+			getCheckIfStudentBodiesExceedTeachers				= checkIfStudentBodiesExceedTeachers,+			getCheckIfStudentBodySizeExceedsCapacityOfAllLocations		= checkIfStudentBodySizeExceedsCapacityOfAllLocations,+			getCheckIfStudentBodySizeExceedsLocationCapacity		= checkIfStudentBodySizeExceedsLocationCapacity,+			getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings	= checkIndependenceOfStudentTimeslotsRequestsAndMeetings,+			getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings	= checkIndependenceOfTeacherTimeslotsRequestsAndMeetings,+			getCheckLocationsAvailabilityToSupportCourses			= checkLocationsAvailabilityToSupportCourses,+			getCheckLocationsForSynchronousSpecifiedTimes			= checkLocationsForSynchronousSpecifiedTimes,+			getCheckMeetingLocationsAvailability				= checkMeetingLocationsAvailability,+			getCheckMinimumConsecutiveLessons				= checkMinimumConsecutiveLessons,+			getCheckNullGroupId						= checkNullGroupId,+			getCheckNullLocationCatalogue					= checkNullLocationCatalogue,+			getCheckNullStudentBodyRegister					= checkNullStudentBodyRegister,+			getCheckNullTeacherRegister					= checkNullTeacherRegister,+			getCheckOwnLocationsAvailability				= checkOwnLocationsAvailability,+			getCheckRequiredLessonsPerWeek					= checkRequiredLessonsPerWeek,+			getCheckSimultaneousAvailabilityOfGroupMembers			= checkSimultaneousAvailabilityOfGroupMembers,+			getCheckStudentsAvailabilityForMandatoryMeetings		= checkStudentsAvailabilityForMandatoryMeetings,+			getCheckStudentsAvailabilityForSpecifiedTimes			= checkStudentsAvailabilityForSpecifiedTimes,+			getCheckStudentsForMultipleLevelsOfSameTopic			= checkStudentsForMultipleLevelsOfSameTopic,+			getCheckStudentsForSynchronousMeetings				= checkStudentsForSynchronousMeetings,+			getCheckStudentsLowerWorkloadBound				= checkStudentsLowerWorkloadBound,+			getCheckStudentsUpperWorkloadBound				= checkStudentsUpperWorkloadBound,+			getCheckSubjectExistence					= checkSubjectExistence,+			getCheckSuitableLocationsForKnowledgeRequirements		= checkSuitableLocationsForKnowledgeRequirements,+			getCheckTeachersAvailabilityForMandatoryMeetings		= checkTeachersAvailabilityForMandatoryMeetings,+			getCheckTeachersForSynchronousMeetings				= checkTeachersForSynchronousMeetings,+			getCheckTeachersUpperWorkloadBound				= checkTeachersUpperWorkloadBound,+			getCheckTeachingCapacityBySubject				= checkTeachingCapacityBySubject,+			getCheckTimeslotIdBounds					= checkTimeslotIdBounds,+			getCheckTimeslotRequests					= checkTimeslotRequests+		} -> (+			checkAvailabilityOfAnyGroupMember,+			checkCapacityOfLocationsForMeetings,+			checkCoursesForSynchronousSpecifiedTimes,+			checkDuplicateMeetingLocationIds,+			checkDuplicateOwnLocationIds,+			checkForAlternativesToSynchronisedCourses,+			checkForDuplicateStudentIds,+			checkForIdleStudents,+			checkForIdleTeachers,+			checkForInvalidMeetingTimes,+			checkForMultipleCoursesPerTeacherPerSynchronisationId,+			checkForNonExistentFacilities,+			checkForNonExistentGroupIds,+			checkForNonExistentMeetingLocationIds,+			checkForNonExistentOwnLocationIds,+			checkForOverloadedStudents,+			checkForSingletonSynchronisedCourses,+			checkForStudentsRequiringMultipleSynchronisedSubjects,+			checkForStudentsWithUnrealisableFreePeriodPreference,+			checkForSynchronisedCoursesWithDifferentIdealTimeslots,+			checkForSynchronisedCoursesWithDifferentLessonsPerWeek,+			checkForSynchronisedCoursesWithExcessLessonsPerWeek,+			checkForSynchronisedCoursesWithExcessSpecifiedTimes,+			checkForSynchronisedCoursesWithExcessTimeslotRequests,+			checkForSynchronisedCoursesWithoutSuitableLocations,+			checkForSynchronisedCoursesWithUnavailableSpecifiedDays,+			checkForTeachersWithUnrealisableFreePeriodPreference,+			checkIfStudentBodiesExceedTeachers,+			checkIfStudentBodySizeExceedsCapacityOfAllLocations,+			checkIfStudentBodySizeExceedsLocationCapacity,+			checkIndependenceOfStudentTimeslotsRequestsAndMeetings,+			checkIndependenceOfTeacherTimeslotsRequestsAndMeetings,+			checkLocationsAvailabilityToSupportCourses,+			checkLocationsForSynchronousSpecifiedTimes,+			checkMeetingLocationsAvailability,+			checkMinimumConsecutiveLessons,+			checkNullGroupId,+			checkNullLocationCatalogue,+			checkNullStudentBodyRegister,+			checkNullTeacherRegister,+			checkOwnLocationsAvailability,+			checkRequiredLessonsPerWeek,+			checkSimultaneousAvailabilityOfGroupMembers,+			checkStudentsAvailabilityForMandatoryMeetings,+			checkStudentsAvailabilityForSpecifiedTimes,+			checkStudentsForMultipleLevelsOfSameTopic,+			checkStudentsForSynchronousMeetings,+			checkStudentsLowerWorkloadBound,+			checkStudentsUpperWorkloadBound,+			checkSubjectExistence,+			checkSuitableLocationsForKnowledgeRequirements,+			checkTeachersAvailabilityForMandatoryMeetings,+			checkTeachersForSynchronousMeetings,+			checkTeachersUpperWorkloadBound,+			checkTeachingCapacityBySubject,+			checkTimeslotIdBounds,+			checkTimeslotRequests+		) -- Deconstruct to a tuple.+	 ) $ Enhanced.EnhancedTuple.xp57Tuple (+		getCheckAvailabilityOfAnyGroupMember def `HXT.xpDefault` HXT.xpAttr checkAvailabilityOfAnyGroupMemberTag HXT.xpickle {-Bool-}+	 ) (+		getCheckCapacityOfLocationsForMeetings def `HXT.xpDefault` HXT.xpAttr checkCapacityOfLocationsForMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckCoursesForSynchronousSpecifiedTimes def `HXT.xpDefault` HXT.xpAttr checkCoursesForSynchronousSpecifiedTimesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckDuplicateMeetingLocationIds def `HXT.xpDefault` HXT.xpAttr checkDuplicateMeetingLocationIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckDuplicateOwnLocationIds def `HXT.xpDefault` HXT.xpAttr checkDuplicateOwnLocationIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForAlternativesToSynchronisedCourses def `HXT.xpDefault` HXT.xpAttr checkForAlternativesToSynchronisedCoursesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForDuplicateStudentIds def `HXT.xpDefault` HXT.xpAttr checkForDuplicateStudentIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForIdleStudents def `HXT.xpDefault` HXT.xpAttr checkForIdleStudentsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForIdleTeachers def `HXT.xpDefault` HXT.xpAttr checkForIdleTeachersTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForInvalidMeetingTimes def `HXT.xpDefault` HXT.xpAttr checkForInvalidMeetingTimesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForMultipleCoursesPerTeacherPerSynchronisationId def `HXT.xpDefault` HXT.xpAttr checkForMultipleCoursesPerTeacherPerSynchronisationIdTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForNonExistentFacilities def `HXT.xpDefault` HXT.xpAttr checkForNonExistentFacilitiesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForNonExistentGroupIds def `HXT.xpDefault` HXT.xpAttr checkForNonExistentGroupIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForNonExistentMeetingLocationIds def `HXT.xpDefault` HXT.xpAttr checkForNonExistentMeetingLocationIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForNonExistentOwnLocationIds def `HXT.xpDefault` HXT.xpAttr checkForNonExistentOwnLocationIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForOverloadedStudents def `HXT.xpDefault` HXT.xpAttr checkForOverloadedStudentsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSingletonSynchronisedCourses def `HXT.xpDefault` HXT.xpAttr checkForSingletonSynchronisedCoursesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForStudentsRequiringMultipleSynchronisedSubjects def `HXT.xpDefault` HXT.xpAttr checkForStudentsRequiringMultipleSynchronisedSubjectsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForStudentsWithUnrealisableFreePeriodPreference def `HXT.xpDefault` HXT.xpAttr checkForStudentsWithUnrealisableFreePeriodPreferenceTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithDifferentIdealTimeslots def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithDifferentIdealTimeslotsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithDifferentLessonsPerWeekTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithExcessLessonsPerWeek def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithExcessLessonsPerWeekTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithExcessSpecifiedTimes def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithExcessSpecifiedTimesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithExcessTimeslotRequests def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithExcessTimeslotRequestsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithoutSuitableLocations def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithoutSuitableLocationsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays def `HXT.xpDefault` HXT.xpAttr checkForSynchronisedCoursesWithUnavailableSpecifiedDaysTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForTeachersWithUnrealisableFreePeriodPreference def `HXT.xpDefault` HXT.xpAttr checkForTeachersWithUnrealisableFreePeriodPreferenceTag HXT.xpickle {-Bool-}+	 ) (+		getCheckIfStudentBodiesExceedTeachers def `HXT.xpDefault` HXT.xpAttr checkIfStudentBodiesExceedTeachersTag HXT.xpickle {-Bool-}+	 ) (+		getCheckIfStudentBodySizeExceedsCapacityOfAllLocations def `HXT.xpDefault` HXT.xpAttr checkIfStudentBodySizeExceedsCapacityOfAllLocationsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckIfStudentBodySizeExceedsLocationCapacity def `HXT.xpDefault` HXT.xpAttr checkIfStudentBodySizeExceedsLocationCapacityTag HXT.xpickle {-Bool-}+	 ) (+		getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings def `HXT.xpDefault` HXT.xpAttr checkIndependenceOfStudentTimeslotsRequestsAndMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings def `HXT.xpDefault` HXT.xpAttr checkIndependenceOfTeacherTimeslotsRequestsAndMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckLocationsAvailabilityToSupportCourses def `HXT.xpDefault` HXT.xpAttr checkLocationsAvailabilityToSupportCoursesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckLocationsForSynchronousSpecifiedTimes def `HXT.xpDefault` HXT.xpAttr checkLocationsForSynchronousSpecifiedTimesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckMeetingLocationsAvailability def `HXT.xpDefault` HXT.xpAttr checkMeetingLocationsAvailabilityTag HXT.xpickle {-Bool-}+	 ) (+		getCheckMinimumConsecutiveLessons def `HXT.xpDefault` HXT.xpAttr checkMinimumConsecutiveLessonsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckNullGroupId def `HXT.xpDefault` HXT.xpAttr checkNullGroupIdTag HXT.xpickle {-Bool-}+	 ) (+		getCheckNullLocationCatalogue def `HXT.xpDefault` HXT.xpAttr checkNullLocationCatalogueTag HXT.xpickle {-Bool-}+	 ) (+		getCheckNullStudentBodyRegister def `HXT.xpDefault` HXT.xpAttr checkNullStudentBodyRegisterTag HXT.xpickle {-Bool-}+	 ) (+		getCheckNullTeacherRegister def `HXT.xpDefault` HXT.xpAttr checkNullTeacherRegisterTag HXT.xpickle {-Bool-}+	 ) (+		getCheckOwnLocationsAvailability def `HXT.xpDefault` HXT.xpAttr checkOwnLocationsAvailabilityTag HXT.xpickle {-Bool-}+	 ) (+		getCheckRequiredLessonsPerWeek def `HXT.xpDefault` HXT.xpAttr checkRequiredLessonsPerWeekTag HXT.xpickle {-Bool-}+	 ) (+		getCheckSimultaneousAvailabilityOfGroupMembers def `HXT.xpDefault` HXT.xpAttr checkSimultaneousAvailabilityOfGroupMembersTag HXT.xpickle {-Bool-}+	 ) (+		getCheckStudentsAvailabilityForMandatoryMeetings def `HXT.xpDefault` HXT.xpAttr checkStudentsAvailabilityForMandatoryMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckStudentsAvailabilityForSpecifiedTimes def `HXT.xpDefault` HXT.xpAttr checkStudentsAvailabilityForSpecifiedTimesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckStudentsForMultipleLevelsOfSameTopic def `HXT.xpDefault` HXT.xpAttr checkStudentsForMultipleLevelsOfSameTopicTag HXT.xpickle {-Bool-}+	 ) (+		getCheckStudentsForSynchronousMeetings def `HXT.xpDefault` HXT.xpAttr checkStudentsForSynchronousMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckStudentsLowerWorkloadBound def `HXT.xpDefault` HXT.xpAttr checkStudentsLowerWorkloadBoundTag HXT.xpickle {-Bool-}+	 ) (+		getCheckStudentsUpperWorkloadBound def `HXT.xpDefault` HXT.xpAttr checkStudentsUpperWorkloadBoundTag HXT.xpickle {-Bool-}+	 ) (+		getCheckSubjectExistence def `HXT.xpDefault` HXT.xpAttr checkSubjectExistenceTag HXT.xpickle {-Bool-}+	 ) (+		getCheckSuitableLocationsForKnowledgeRequirements def `HXT.xpDefault` HXT.xpAttr checkSuitableLocationsForKnowledgeRequirementsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTeachersAvailabilityForMandatoryMeetings def `HXT.xpDefault` HXT.xpAttr checkTeachersAvailabilityForMandatoryMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTeachersForSynchronousMeetings def `HXT.xpDefault` HXT.xpAttr checkTeachersForSynchronousMeetingsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTeachersUpperWorkloadBound def `HXT.xpDefault` HXT.xpAttr checkTeachersUpperWorkloadBoundTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTeachingCapacityBySubject def `HXT.xpDefault` HXT.xpAttr checkTeachingCapacityBySubjectTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTimeslotIdBounds def `HXT.xpDefault` HXT.xpAttr checkTimeslotIdBoundsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTimeslotRequests def `HXT.xpDefault` HXT.xpAttr checkTimeslotRequestsTag HXT.xpickle {-Bool-}+	 ) where+		def :: ProblemValidationSwitches+		def	= Data.Default.def++instance Data.Default.Default ProblemValidationSwitches where+	def = MkProblemValidationSwitches {+		getCheckAvailabilityOfAnyGroupMember				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckCapacityOfLocationsForMeetings				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckCoursesForSynchronousSpecifiedTimes			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckDuplicateMeetingLocationIds				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckDuplicateOwnLocationIds					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForAlternativesToSynchronisedCourses			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForDuplicateStudentIds					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForIdleStudents						= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForIdleTeachers						= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForInvalidMeetingTimes					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForMultipleCoursesPerTeacherPerSynchronisationId	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForNonExistentFacilities				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForNonExistentGroupIds					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForNonExistentMeetingLocationIds			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForNonExistentOwnLocationIds				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForOverloadedStudents					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSingletonSynchronisedCourses				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForStudentsRequiringMultipleSynchronisedSubjects	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForStudentsWithUnrealisableFreePeriodPreference		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithDifferentIdealTimeslots	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithExcessLessonsPerWeek		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithExcessSpecifiedTimes		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithExcessTimeslotRequests	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithoutSuitableLocations		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForTeachersWithUnrealisableFreePeriodPreference		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckIfStudentBodiesExceedTeachers				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckIfStudentBodySizeExceedsCapacityOfAllLocations		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckIfStudentBodySizeExceedsLocationCapacity		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckLocationsAvailabilityToSupportCourses			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckLocationsForSynchronousSpecifiedTimes			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckMeetingLocationsAvailability				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckMinimumConsecutiveLessons				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckNullGroupId						= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckNullLocationCatalogue					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckNullStudentBodyRegister					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckNullTeacherRegister					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckOwnLocationsAvailability				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckRequiredLessonsPerWeek					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckSimultaneousAvailabilityOfGroupMembers			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckStudentsAvailabilityForMandatoryMeetings		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckStudentsAvailabilityForSpecifiedTimes			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckStudentsForMultipleLevelsOfSameTopic			= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckStudentsForSynchronousMeetings				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckStudentsLowerWorkloadBound				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckStudentsUpperWorkloadBound				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckSubjectExistence					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckSuitableLocationsForKnowledgeRequirements		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTeachersAvailabilityForMandatoryMeetings		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTeachersForSynchronousMeetings				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTeachersUpperWorkloadBound				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTeachingCapacityBySubject				= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTimeslotIdBounds					= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTimeslotRequests					= ProblemConfiguration.ValidationSwitch.defaultCheck+	}++instance ProblemConfiguration.ValidationSwitch.ValidationSwitchSet ProblemValidationSwitches where+	areAllOff problemValidationSwitches	= not $ any ($ problemValidationSwitches) [+		getCheckAvailabilityOfAnyGroupMember,+		getCheckCapacityOfLocationsForMeetings,+		getCheckCoursesForSynchronousSpecifiedTimes,+		getCheckDuplicateMeetingLocationIds,+		getCheckDuplicateOwnLocationIds,+		getCheckForAlternativesToSynchronisedCourses,+		getCheckForDuplicateStudentIds,+		getCheckForIdleStudents,+		getCheckForIdleTeachers,+		getCheckForInvalidMeetingTimes,+		getCheckForMultipleCoursesPerTeacherPerSynchronisationId,+		getCheckForNonExistentFacilities,+		getCheckForNonExistentGroupIds,+		getCheckForNonExistentMeetingLocationIds,+		getCheckForNonExistentOwnLocationIds,+		getCheckForOverloadedStudents,+		getCheckForSingletonSynchronisedCourses,+		getCheckForStudentsRequiringMultipleSynchronisedSubjects,+		getCheckForStudentsWithUnrealisableFreePeriodPreference,+		getCheckForSynchronisedCoursesWithDifferentIdealTimeslots,+		getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek,+		getCheckForSynchronisedCoursesWithExcessLessonsPerWeek,+		getCheckForSynchronisedCoursesWithExcessSpecifiedTimes,+		getCheckForSynchronisedCoursesWithExcessTimeslotRequests,+		getCheckForSynchronisedCoursesWithoutSuitableLocations,+		getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays,+		getCheckForTeachersWithUnrealisableFreePeriodPreference,+		getCheckIfStudentBodiesExceedTeachers,+		getCheckIfStudentBodySizeExceedsCapacityOfAllLocations,+		getCheckIfStudentBodySizeExceedsLocationCapacity,+		getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings,+		getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings,+		getCheckLocationsForSynchronousSpecifiedTimes,+		getCheckMeetingLocationsAvailability,+		getCheckMinimumConsecutiveLessons,+		getCheckNullGroupId,+		getCheckNullLocationCatalogue,+		getCheckNullStudentBodyRegister,+		getCheckNullTeacherRegister,+		getCheckOwnLocationsAvailability,+		getCheckRequiredLessonsPerWeek,+		getCheckSimultaneousAvailabilityOfGroupMembers,+		getCheckStudentsAvailabilityForMandatoryMeetings,+		getCheckStudentsAvailabilityForSpecifiedTimes,+		getCheckStudentsForMultipleLevelsOfSameTopic,+		getCheckStudentsForSynchronousMeetings,+		getCheckStudentsLowerWorkloadBound,+		getCheckStudentsUpperWorkloadBound,+		getCheckSubjectExistence,+		getCheckSuitableLocationsForKnowledgeRequirements,+		getCheckTeachersAvailabilityForMandatoryMeetings,+		getCheckTeachersForSynchronousMeetings,+		getCheckTeachersUpperWorkloadBound,+		getCheckTeachingCapacityBySubject,+		getCheckTimeslotIdBounds,+		getCheckTimeslotRequests+	 ]++instance Control.DeepSeq.NFData ProblemValidationSwitches where+	rnf (MkProblemValidationSwitches x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31 x32 x33 x34 x35 x36 x37 x38 x39 x40 x41 x42 x43 x44 x45 x46 x47 x48 x49 x50 x51 x52 x53 x54 x55 x56)	= Control.DeepSeq.rnf [+		x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x50, x51, x52, x53, x54, x55, x56+	 ]+
+ src-lib/WeekDaze/ProblemConfiguration/TimetableValidationSwitches.hs view
@@ -0,0 +1,320 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the toggle-switches used to enable/disable checks on the validity of /StudentView.Timetable.Timetable/.+-}++module WeekDaze.ProblemConfiguration.TimetableValidationSwitches(+-- * Types+-- ** Data-types+	TimetableValidationSwitches(..),+-- * Constants+--	tag,+	checkBookedSubjectsAreRequiredTag,+	checkBookedSubjectsHaveServiceTag,+	checkExistenceOfLocationIdsTag,+	checkExistenceOfStudentBodiesTag,+	checkExistenceOfTeacherIdsTag,+	checkForBookingMeetingClashTag,+	checkForMisplacedLessonsTag,+	checkForOverbookedSubjectsTag,+	checkForOverloadedStudentBodiesTag,+	checkForOverloadedTeachersTag,+	checkForResourceConflictsTag,+	checkMinimumConsecutiveLessonsTag,+	checkResourceAvailabilityTag,+	checkSynchronisedCoursesTag,+	checkTimeslotsPerDayTag+) where++import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Text.XML.HXT.Arrow.Pickle			as HXT+import qualified	WeekDaze.ProblemConfiguration.ValidationSwitch	as ProblemConfiguration.ValidationSwitch+import			WeekDaze.Enhanced.EnhancedBool()++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Maybe+import qualified	WeekDaze.Database.Selector			as Database.Selector++instance Database.Selector.Selector TimetableValidationSwitches where+	fromDatabase connection	projectIdSql	= let+		tableName :: Database.Selector.TableName+		tableName	= showString Database.Selector.tablePrefix tag+	 in do+		switchesRows	<- map (+			map $ Data.Maybe.fromMaybe ProblemConfiguration.ValidationSwitch.defaultCheck . either (+				error . showString "WeekDaze.ProblemConfiguration.TimetableValidationSwitches.fromDatabase:\tfailed to parse the value for a switch read from the database; " . show+			) id . Database.HDBC.safeFromSql+		 ) `fmap` Database.Selector.select connection [+			checkBookedSubjectsAreRequiredTag,+			checkBookedSubjectsHaveServiceTag,+			checkExistenceOfLocationIdsTag,+			checkExistenceOfStudentBodiesTag,+			checkExistenceOfTeacherIdsTag,+			checkForBookingMeetingClashTag,+			checkForMisplacedLessonsTag,+			checkForOverbookedSubjectsTag,+			checkForOverloadedStudentBodiesTag,+			checkForOverloadedTeachersTag,+			checkForResourceConflictsTag,+			checkMinimumConsecutiveLessonsTag,+			checkResourceAvailabilityTag,+			checkSynchronisedCoursesTag,+			checkTimeslotsPerDayTag+		 ] [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]++		return {-to IO-Monad-} $ case switchesRows of+			[]		-> Data.Default.def+			[switchesRow]	-> case switchesRow of+				[+					checkBookedSubjectsAreRequired,+					checkBookedSubjectsHaveService,+					checkSynchronisedCourses,+					checkExistenceOfLocationIds,+					checkExistenceOfStudentBodies,+					checkExistenceOfTeacherIds,+					checkForBookingMeetingClash,+					checkForMisplacedLessons,+					checkForOverbookedSubjects,+					checkForOverloadedStudentBodies,+					checkForOverloadedTeachers,+					checkForResourceConflicts,+					checkMinimumConsecutiveLessons,+					checkResourceAvailability,+					checkTimeslotsPerDay+				 ] -> MkTimetableValidationSwitches {+					getCheckBookedSubjectsAreRequired	= checkBookedSubjectsAreRequired,+					getCheckBookedSubjectsHaveService	= checkBookedSubjectsHaveService,+					getCheckSynchronisedCourses		= checkSynchronisedCourses,+					getCheckExistenceOfLocationIds		= checkExistenceOfLocationIds,+					getCheckExistenceOfStudentBodies	= checkExistenceOfStudentBodies,+					getCheckExistenceOfTeacherIds		= checkExistenceOfTeacherIds,+					getCheckForBookingMeetingClash		= checkForBookingMeetingClash,+					getCheckForMisplacedLessons		= checkForMisplacedLessons,+					getCheckForOverbookedSubjects		= checkForOverbookedSubjects,+					getCheckForOverloadedStudentBodies	= checkForOverloadedStudentBodies,+					getCheckForOverloadedTeachers		= checkForOverloadedTeachers,+					getCheckForResourceConflicts		= checkForResourceConflicts,+					getCheckMinimumConsecutiveLessons	= checkMinimumConsecutiveLessons,+					getCheckResourceAvailability		= checkResourceAvailability,+					getCheckTimeslotsPerDay			= checkTimeslotsPerDay+				}+				_ -> error $ "WeekDaze.ProblemConfiguration.TimetableValidationSwitches.fromDatabase:\tunexpected number of columns=" ++ show (length switchesRow) ++ " in row of table " ++ show tableName ++ "."+			_		-> error $ "WeekDaze.ProblemConfiguration.TimetableValidationSwitches.fromDatabase:\tunexpected number of rows=" ++ show (length switchesRows) ++ " selected from table " ++ show tableName ++ "."+#endif /* USE_HDBC */++-- | Used to qualify XML.+tag :: String+tag					= "timetableValidationSwitches"++-- | Used to qualify SQL & XML.+checkBookedSubjectsAreRequiredTag :: String+checkBookedSubjectsAreRequiredTag	= "checkBookedSubjectsAreRequired"++-- | Used to qualify SQL & XML.+checkBookedSubjectsHaveServiceTag :: String+checkBookedSubjectsHaveServiceTag	= "checkBookedSubjectsHaveService"++-- | Used to qualify SQL & XML.+checkExistenceOfLocationIdsTag :: String+checkExistenceOfLocationIdsTag		= "checkExistenceOfLocationIds"++-- | Used to qualify SQL & XML.+checkExistenceOfStudentBodiesTag :: String+checkExistenceOfStudentBodiesTag	= "checkExistenceOfStudentBodies"++-- | Used to qualify SQL & XML.+checkExistenceOfTeacherIdsTag :: String+checkExistenceOfTeacherIdsTag		= "checkExistenceOfTeacherIds"++-- | Used to qualify SQL & XML.+checkForBookingMeetingClashTag :: String+checkForBookingMeetingClashTag		= "checkForBookingMeetingClash"++-- | Used to qualify SQL & XML.+checkForMisplacedLessonsTag :: String+checkForMisplacedLessonsTag		= "checkForMisplacedLessons"++-- | Used to qualify SQL & XML.+checkForOverbookedSubjectsTag :: String+checkForOverbookedSubjectsTag		= "checkForOverbookedSubjects"++-- | Used to qualify SQL & XML.+checkForOverloadedStudentBodiesTag :: String+checkForOverloadedStudentBodiesTag	= "checkForOverloadedStudentBodies"++-- | Used to qualify SQL & XML.+checkForOverloadedTeachersTag :: String+checkForOverloadedTeachersTag		= "checkForOverloadedTeachers"++-- | Used to qualify SQL & XML.+checkForResourceConflictsTag :: String+checkForResourceConflictsTag		= "checkForResourceConflicts"++-- | Used to qualify SQL & XML.+checkMinimumConsecutiveLessonsTag :: String+checkMinimumConsecutiveLessonsTag	= "checkMinimumConsecutiveLessons"++-- | Used to qualify SQL & XML.+checkResourceAvailabilityTag :: String+checkResourceAvailabilityTag		= "checkResourceAvailability"++-- | Used to qualify SQL & XML.+checkSynchronisedCoursesTag :: String+checkSynchronisedCoursesTag		= "checkSynchronisedCourses"++-- | Used to qualify SQL & XML.+checkTimeslotsPerDayTag :: String+checkTimeslotsPerDayTag			= "checkTimeslotsPerDay"++-- | Encapsulates the data which defines the problem.+data TimetableValidationSwitches	= MkTimetableValidationSwitches {+	getCheckBookedSubjectsAreRequired	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all /subject/s for which there's a /booking/, are required by the /student-body/.+	getCheckBookedSubjectsHaveService	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all /subject/s for which there's a booking, have been offered as a /course/, by the referenced /teacher/.+	getCheckExistenceOfLocationIds		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all /locationId/s referenced in an imported /studentViewTimetable/, exist in the /location-catalogue/.+	getCheckExistenceOfStudentBodies	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all /student-bodies/ referenced in an imported /studentViewTimetable/, exist in the /studentBody-register/.+	getCheckExistenceOfTeacherIds		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all /teacherId/s referenced in an imported /studentViewTimetable/, exist in the /teacher-register/.+	getCheckForBookingMeetingClash		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /lesson/s booked at the same /time/ as a /meeting/, with a common /resource/-requirement.+	getCheckForMisplacedLessons		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /lesson/s booked at /location/s lacking either adequate /capacity/ or /facilities/ for their /course/.+	getCheckForOverbookedSubjects		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /student-bodies/ for whom more /lesson/s have been booked, in a specific /subject/, that required by the /course/ of which they're a part.+	getCheckForOverloadedStudentBodies	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /student-bodies/ for whom more /lesson/s have been booked, than allocated for tuition in one week.+	getCheckForOverloadedTeachers		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /teacher/s for whom more /lesson/s have been booked, than allocated for tuition in one week.+	getCheckForResourceConflicts		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /time/s at which /resource/s have been allocated in more than one /location/.+	getCheckMinimumConsecutiveLessons	:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check for /lesson/s which have been booked in runlengths shorter than required by the /course/ of which they're a part.+	getCheckResourceAvailability		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that /resource/s have been booked only on /day/s when they're /available/.+	getCheckSynchronisedCourses		:: ProblemConfiguration.ValidationSwitch.Check,	-- ^ Check that all the /teacher/s of a set of /synchronised course/s, have booked synchronous /lesson/s.+	getCheckTimeslotsPerDay			:: ProblemConfiguration.ValidationSwitch.Check	-- ^ Check that all /day/s have the correct number of /time-slot/s.+} deriving (Eq, Show)++instance () => HXT.XmlPickler TimetableValidationSwitches where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		\(a, b, c, d, e, f, h, i, j, k, l, m, n, o, p)	-> MkTimetableValidationSwitches a b c d e f h i j k l m n o p,	-- Construct from a tuple.+		\MkTimetableValidationSwitches {+			getCheckBookedSubjectsAreRequired	= checkBookedSubjectsAreRequired,+			getCheckBookedSubjectsHaveService	= checkBookedSubjectsHaveService,+			getCheckSynchronisedCourses		= checkSynchronisedCourses,+			getCheckExistenceOfLocationIds		= checkExistenceOfLocationIds,+			getCheckExistenceOfStudentBodies	= checkExistenceOfStudentBodies,+			getCheckExistenceOfTeacherIds		= checkExistenceOfTeacherIds,+			getCheckForBookingMeetingClash		= checkForBookingMeetingClash,+			getCheckForMisplacedLessons		= checkForMisplacedLessons,+			getCheckForOverbookedSubjects		= checkForOverbookedSubjects,+			getCheckForOverloadedStudentBodies	= checkForOverloadedStudentBodies,+			getCheckForOverloadedTeachers		= checkForOverloadedTeachers,+			getCheckForResourceConflicts		= checkForResourceConflicts,+			getCheckMinimumConsecutiveLessons	= checkMinimumConsecutiveLessons,+			getCheckResourceAvailability		= checkResourceAvailability,+			getCheckTimeslotsPerDay			= checkTimeslotsPerDay+		} -> (+			checkBookedSubjectsAreRequired,+			checkBookedSubjectsHaveService,+			checkSynchronisedCourses,+			checkExistenceOfLocationIds,+			checkExistenceOfStudentBodies,+			checkExistenceOfTeacherIds,+			checkForBookingMeetingClash,+			checkForMisplacedLessons,+			checkForOverbookedSubjects,+			checkForOverloadedStudentBodies,+			checkForOverloadedTeachers,+			checkForResourceConflicts,+			checkMinimumConsecutiveLessons,+			checkResourceAvailability,+			checkTimeslotsPerDay+		) -- Deconstruct to a tuple.+	 ) $ HXT.xp15Tuple (+		getCheckBookedSubjectsAreRequired def `HXT.xpDefault` HXT.xpAttr checkBookedSubjectsAreRequiredTag HXT.xpickle {-Bool-}+	 ) (+		getCheckBookedSubjectsHaveService def `HXT.xpDefault` HXT.xpAttr checkBookedSubjectsHaveServiceTag HXT.xpickle {-Bool-}+	 ) (+		getCheckExistenceOfLocationIds def `HXT.xpDefault` HXT.xpAttr checkExistenceOfLocationIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckExistenceOfStudentBodies def `HXT.xpDefault` HXT.xpAttr checkExistenceOfStudentBodiesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckExistenceOfTeacherIds def `HXT.xpDefault` HXT.xpAttr checkExistenceOfTeacherIdsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForBookingMeetingClash def `HXT.xpDefault` HXT.xpAttr checkForBookingMeetingClashTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForMisplacedLessons def `HXT.xpDefault` HXT.xpAttr checkForMisplacedLessonsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForOverbookedSubjects def `HXT.xpDefault` HXT.xpAttr checkForOverbookedSubjectsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForOverloadedStudentBodies def `HXT.xpDefault` HXT.xpAttr checkForOverloadedStudentBodiesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForOverloadedTeachers def `HXT.xpDefault` HXT.xpAttr checkForOverloadedTeachersTag HXT.xpickle {-Bool-}+	 ) (+		getCheckForResourceConflicts def `HXT.xpDefault` HXT.xpAttr checkForResourceConflictsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckMinimumConsecutiveLessons def `HXT.xpDefault` HXT.xpAttr checkMinimumConsecutiveLessonsTag HXT.xpickle {-Bool-}+	 ) (+		getCheckResourceAvailability def `HXT.xpDefault` HXT.xpAttr checkResourceAvailabilityTag HXT.xpickle {-Bool-}+	 ) (+		getCheckSynchronisedCourses def `HXT.xpDefault` HXT.xpAttr checkSynchronisedCoursesTag HXT.xpickle {-Bool-}+	 ) (+		getCheckTimeslotsPerDay def `HXT.xpDefault` HXT.xpAttr checkTimeslotsPerDayTag HXT.xpickle {-Bool-}+	 ) where+		def :: TimetableValidationSwitches+		def	= Data.Default.def++instance Data.Default.Default TimetableValidationSwitches where+	def = MkTimetableValidationSwitches {+		getCheckBookedSubjectsAreRequired	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckBookedSubjectsHaveService	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckSynchronisedCourses		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckExistenceOfLocationIds		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckExistenceOfStudentBodies	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckExistenceOfTeacherIds		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForBookingMeetingClash		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForMisplacedLessons		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForOverbookedSubjects		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForOverloadedStudentBodies	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForOverloadedTeachers		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckForResourceConflicts		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckMinimumConsecutiveLessons	= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckResourceAvailability		= ProblemConfiguration.ValidationSwitch.defaultCheck,+		getCheckTimeslotsPerDay			= ProblemConfiguration.ValidationSwitch.defaultCheck+	}++instance ProblemConfiguration.ValidationSwitch.ValidationSwitchSet TimetableValidationSwitches where+	areAllOff timetableValidationSwitches	= not $ any ($ timetableValidationSwitches) [+		getCheckBookedSubjectsAreRequired,+		getCheckBookedSubjectsHaveService,+		getCheckSynchronisedCourses,+		getCheckExistenceOfLocationIds,+		getCheckExistenceOfStudentBodies,+		getCheckExistenceOfTeacherIds,+		getCheckForBookingMeetingClash,+		getCheckForMisplacedLessons,+		getCheckForOverbookedSubjects,+		getCheckForOverloadedStudentBodies,+		getCheckForOverloadedTeachers,+		getCheckForResourceConflicts,+		getCheckMinimumConsecutiveLessons,+		getCheckResourceAvailability,+		getCheckTimeslotsPerDay+	 ]++instance Control.DeepSeq.NFData TimetableValidationSwitches where+	rnf (MkTimetableValidationSwitches x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14)	= Control.DeepSeq.rnf [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14]+
+ src-lib/WeekDaze/ProblemConfiguration/ValidationSwitch.hs view
@@ -0,0 +1,44 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines a toggle-switch used to enable/disable a validity-check.+-}++module WeekDaze.ProblemConfiguration.ValidationSwitch(+-- * Type-classes+	ValidationSwitchSet(..),+-- * Types+-- ** Type-synonyms+	Check,+-- * Constants+	defaultCheck+) where++-- | Defines whether to check a specific feature.+type Check	= Bool++-- | Default value for a 'Check'.+defaultCheck :: Check+defaultCheck	= True++-- | An interface to which a set of checks may conform.+class ValidationSwitchSet a where+	areAllOff	:: a -> Bool	-- ^ True if all switches are turned-off.
+ src-lib/WeekDaze/Size.hs view
@@ -0,0 +1,54 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Define the type for the size of various quantities.+-}++module WeekDaze.Size(+-- * Types+-- ** Type-synonyms+	NDays,+	NTimetables,+	NLocations,+	NStudents,+	NTeachers,+	NTimeslots+) where++-- | A number of /day/s.+type NDays	= Int++-- | A number of /timetables/.+type NTimetables	= Int++-- | A number of /location/s.+type NLocations	= Int++-- | A number of /student/s.+type NStudents	= Int++-- | A number of /teacher/s.+type NTeachers	= Int++-- | A number of /time-slot/s.+type NTimeslots	= Int
+ src-lib/WeekDaze/StudentView/Lesson.hs view
@@ -0,0 +1,36 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the data required to define a /time-slot/, in the /timetable/ viewed from the perspective of a /student-body/.+-}++module WeekDaze.StudentView.Lesson(+-- * Types+-- ** Type-synonyms+	Lesson+) where++import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds++-- | Specialise for the case in which a /lesson/ is viewed from the perspective of a /student-body/.+type Lesson locationId teacherId level	= Model.Lesson.Lesson (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) level+
+ src-lib/WeekDaze/StudentView/LessonResourceIds.hs view
@@ -0,0 +1,71 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the /resource/s required for a /lesson/, from the perspective of a /student-body/.+-}++module WeekDaze.StudentView.LessonResourceIds(+-- * Types+-- ** Data-types+	LessonResourceIds(..)+-- * Constants+--	tag+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Model.ResourceUser	as Model.ResourceUser+import			Text.XHtml.Strict((+++), (<<))++-- | Used to qualify XML.+tag :: String+tag	= "studentViewLessonResourceIds"++-- | Composed from both the 'locationId' & 'teacherId'.+data LessonResourceIds locationId teacherId	= MkLessonResourceIds {+	getLocationId	:: locationId,	-- ^ The identifier for the /location/ at which the /class/ will be held.+	getTeacherId	:: teacherId	-- ^ The identifier for the /teacher/ instructing this /class/.+} deriving (Eq, Ord, Show)++instance (+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	teacherId+ ) => Text.XHtml.Strict.HTML (LessonResourceIds locationId teacherId) where+	toHtml	= (+		\(locationId, teacherId) -> Text.XHtml.Strict.li << (locationId +++ '.') +++ Text.XHtml.Strict.li << (teacherId +++ '.')+	 ) . (+		getLocationId &&& getTeacherId+	 )++instance (HXT.XmlPickler locationId, HXT.XmlPickler teacherId) => HXT.XmlPickler (LessonResourceIds locationId teacherId) where+	xpickle	= HXT.xpElem tag $ HXT.xpWrap (+		uncurry MkLessonResourceIds,	-- Construct from a Pair.+		getLocationId &&& getTeacherId	-- Deconstruct to a Pair.+	 ) HXT.xpickle {-Pair-}++instance (Eq locationId, Eq teacherId) => Model.ResourceUser.ResourceUser (LessonResourceIds locationId teacherId) where+	areIndependent l r	= getLocationId l /= getLocationId r && getTeacherId l /= getTeacherId r++instance (Control.DeepSeq.NFData locationId, Control.DeepSeq.NFData teacherId) => Control.DeepSeq.NFData (LessonResourceIds locationId teacherId) where+	rnf	= Control.DeepSeq.rnf . (getLocationId &&& getTeacherId)+
+ src-lib/WeekDaze/StudentView/Timetable.hs view
@@ -0,0 +1,576 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the specific instance of the underyling generic 'Model.Timetable.Timetable', required to define the weekly /timetable/ for all /student/s, i.e. one indexed by 'Aggregate.StudentBody'.++	* This form of the /timetable/ can be re-indexed to form one appropropriate to either /teacher/s or to /location/s,+	but is more significant, since it is from this form that the other two are derived.+-}++module WeekDaze.StudentView.Timetable(+-- * Types+-- ** Type-synonyms+	InterCampusMigrationsByStudentBody,+	LessonRunlengthByStudentBody,+	Timetable,+	StudentClassesByLesson,+	Booking,+-- * Functions+	calculateMeanLocusOperandiOfTeachers,+	calculateWeightedMeanStudentBodyCombinationsPerLesson,+--	extractBookedResourceIdsAt,+	extractStudentClassAt,+--	extractRoutineForStudentBodyBySubject,+	findDistinctLocationIdsFor,+	findDistinctTeacherIdsFor,+	findStudentClassesByLessonFor,+	findStudentClassByTimeByLesson,+	findStudentClassesByLesson,+-- ** Accessors+	getStudentBodies,+-- ** Predicates+	areBookedResourcesAt,+	breaksRoutine,+-- ** Translation+	toXHtml+) where++import			Control.Arrow((&&&), (***))+import			Data.Map((!))+import qualified	Data.Array.IArray+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Data.Tuple+import qualified	Factory.Math.Statistics+import qualified	Text.XHtml.Strict+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.List.Runlength+import qualified	ToolShed.Data.Pair+import qualified	WeekDaze.Aggregate.StudentBody			as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentBodyRegister		as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Aggregate.StudentClass			as Aggregate.StudentClass+import qualified	WeekDaze.Data.Course				as Data.Course+import qualified	WeekDaze.Data.HumanResource			as Data.HumanResource+import qualified	WeekDaze.Data.Location				as Data.Location+import qualified	WeekDaze.Data.Requirements			as Data.Requirements+import qualified	WeekDaze.Data.Student				as Data.Student+import qualified	WeekDaze.Data.Subject				as Data.Subject+import qualified	WeekDaze.LinearModel.Timetable			as LinearModel.Timetable+import qualified	WeekDaze.LinearModel.TimetableForWeek		as LinearModel.TimetableForWeek+import qualified	WeekDaze.Model.Lesson				as Model.Lesson+import qualified	WeekDaze.Model.Meeting				as Model.Meeting+import qualified	WeekDaze.Model.Timetable			as Model.Timetable+import qualified	WeekDaze.Model.TimetableCoordinates		as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForWeek			as Model.TimetableForWeek+import qualified	WeekDaze.Size					as Size+import qualified	WeekDaze.StudentView.Lesson			as StudentView.Lesson+import qualified	WeekDaze.StudentView.LessonResourceIds		as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.TimetableForWeek		as StudentView.TimetableForWeek+import qualified	WeekDaze.Temporal.Time				as Temporal.Time+import qualified	WeekDaze.Text.CSS				as Text.CSS+import			Text.XHtml.Strict((+++), (<<))+import			WeekDaze.Text.XHTML()++{- |+	* An association-list of the timetables for all /students/.++	* Since /body of students/ will have identical requirements, this is indexed by /body/ rather than an individual student.+-}+type Timetable timeslotId locationId teacherId level	= Model.Timetable.Timetable Aggregate.StudentBody.StudentBody timeslotId (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) level++-- | Accessor.+getStudentBodies :: Timetable timeslotId locationId teacherId level -> [Aggregate.StudentBody.StudentBody] {-conceptually different from a student-class-}+getStudentBodies	= Data.Map.keys++{- |+	* Identifies the lists of both /locationId/ & /teacherId/, that have been booked in the 'timetable', for the specified /time/.++	* CAVEAT: whilst the booked /resources/ could reasonably be returned as sets, facilitating rapid query,+	the number of resources is typically too small for this approach to be competitive.+-}+extractBookedResourceIdsAt+	:: Data.Array.IArray.Ix timeslotId+	=> Temporal.Time.Time timeslotId+	-> Timetable timeslotId locationId teacherId level+	-> ([locationId], [teacherId])+extractBookedResourceIdsAt time	= foldr (+	\lesson (l, t) -> (: l) . StudentView.LessonResourceIds.getLocationId &&& (: t) . StudentView.LessonResourceIds.getTeacherId $ Model.Lesson.getResourceIds lesson+ ) ([], []) . Model.Timetable.extractSynchronousLessonsAt time++{- |+	* True if either of the /resource/s referenced in the specified /booking/, are already booked at the same /time/ in the /timetable/.++	* CAVEAT: it is assumed that the required /lesson/ hasn't already been defined in the /timetable/, since otherwise both /location/ & /teacher/ would clearly be booked.++	* CAVEAT: performance-hotspot.+-}+areBookedResourcesAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			locationId,+	Eq			teacherId+ )+	=> StudentView.TimetableForWeek.Booking timeslotId locationId teacherId level+	-> Timetable timeslotId locationId teacherId level+	-> Bool+areBookedResourcesAt studentViewBooking	= uncurry (||) . (+	elem (StudentView.LessonResourceIds.getLocationId resourceIds) *** elem (StudentView.LessonResourceIds.getTeacherId resourceIds)+ ) . extractBookedResourceIdsAt (Model.TimetableForWeek.getBookedTime studentViewBooking) where+	resourceIds	= Model.Lesson.getResourceIds $ Model.TimetableForWeek.getBookedLesson studentViewBooking++{- |+	* Get the /student-bodies/ who are simultaneously booked to study the same /subject/, at the same /location/, with the same /teacher/.++	* CAVEAT: performance-hotspot.+-}+extractStudentClassAt :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			level,+	Eq			locationId,+	Eq			teacherId+ )+	=> StudentView.TimetableForWeek.Booking timeslotId locationId teacherId level+	-> Timetable timeslotId locationId teacherId level+	-> Aggregate.StudentClass.StudentClass+{-+extractStudentClassAt studentViewBooking	= Data.Map.keysSet . Data.Map.filter (+	== Just (Model.TimetableForWeek.getBookedLesson studentViewBooking)+ ) . Data.Map.map (+	Model.TimetableForWeek.getMaybeLesson $ Model.TimetableForWeek.getBookedTime studentViewBooking+ ) {-extract synchronous events-}	-- CAVEAT: too slow.+-}+extractStudentClassAt studentViewBooking = Data.Map.foldrWithKey (+	\studentBody studentViewTimetableForWeek	-> case Model.TimetableForWeek.getMaybeLesson (Model.TimetableForWeek.getBookedTime studentViewBooking) studentViewTimetableForWeek of+		Just studentViewLesson'+			| studentViewLesson' == Model.TimetableForWeek.getBookedLesson studentViewBooking	-> Data.Set.insert studentBody+			| otherwise										-> id	-- Unequal lesson.+		_												-> id	-- Unallocated timeslot.+ ) Data.Set.empty++{- |+	* Once a /teacher/ has been assigned to teach a /student-body/, in a /subject/, at a /location/, a routine has been established;+	the /student-body/ wouldn't normally be taught that /subject/, by any other /teacher/, or in any other /location/.+	If the routine is adhered to, then each /subject/ maps to a singleton set of /resource-Id/s.++	* CAVEAT: this concept doesn't apply to other views of the /timetable/:+		/teacher/-view;		the same /teacher/ can teach other /student-bodies/, in that /subject/, & at that /location/.+		/location/-view;	the same /location/ can host other /student-bodies/, for tuition of that /subject/, & by that /teacher/.+-}+extractRoutineForStudentBodyBySubject :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> Timetable timeslotId locationId teacherId level	-- ^ The /timetable/.+	-> Aggregate.StudentBody.StudentBody			-- ^ The /student-body/ whose routine is required.+	-> Data.Map.Map (Data.Subject.Subject level) (Data.Set.Set (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId))+extractRoutineForStudentBodyBySubject timetable	= StudentView.TimetableForWeek.extractRoutineBySubject . (timetable !)++{- |+	* True if the specified /lesson/, employs either a different /teacher/, or uses a different /location/, as other /booking/s in the same /subject/.++	* CAVEAT: the routine could include mergers with other /student-bodies/ to form a consistent /student-class/,+	though currently this a soft constraint addressed by both /lesson-criteria/ & /timetable-criteria/.+-}+breaksRoutine :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> Timetable timeslotId locationId teacherId level	-- ^ The current /timetable/.+	-> Aggregate.StudentBody.StudentBody			-- ^ The /student-body/ whose /routine/ to which the new /lesson/ should conform.+	-> StudentView.Lesson.Lesson locationId teacherId level	-- ^ The new /lesson/ to be booked.+	-> Bool+breaksRoutine timetable studentBody	= uncurry (+	Data.Maybe.maybe False {-there's no precedent to break-}+ ) . (+	Data.Set.notMember . Model.Lesson.getResourceIds &&& (`Data.Map.lookup` extractRoutineForStudentBodyBySubject timetable studentBody) . Model.Lesson.getSubject+ )++{- |+	* Find the distinct /locationId/s booked by the referenced /teacher/.++	* CAVEAT: doesn't account for the /location/ of any /meeting/s.+-}+findDistinctLocationIdsFor :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			teacherId,+	Ord			locationId+ )+	=> teacherId+	-> Timetable timeslotId locationId teacherId level+	-> Data.Location.Locus locationId+findDistinctLocationIdsFor teacherId	= foldr (+	Data.Set.insert . StudentView.LessonResourceIds.getLocationId+ ) Data.Set.empty . filter (+	(== teacherId) . StudentView.LessonResourceIds.getTeacherId+ ) . map Model.Lesson.getResourceIds . Model.Timetable.extractLessons++-- | Find the distinct /teacherId/s booked at the referenced /location/.+findDistinctTeacherIdsFor :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			locationId,+	Ord			teacherId+ )+	=> locationId+	-> Timetable timeslotId locationId teacherId level+	-> Data.Set.Set teacherId+findDistinctTeacherIdsFor locationId	= foldr (+	Data.Set.insert . StudentView.LessonResourceIds.getTeacherId+ ) Data.Set.empty . filter (+	(== locationId) . StudentView.LessonResourceIds.getLocationId+ ) . map Model.Lesson.getResourceIds . Model.Timetable.extractLessons++{- |+	* Gets the average number of /location/s visited by /teacher/s.++	* Because only /teacher/s who've at least one /booking/ are included, the result is only less than one if there're zero bookings.+-}+calculateMeanLocusOperandiOfTeachers :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		mean,+	Ord			locationId,+	Ord			teacherId+ ) => Timetable timeslotId locationId teacherId level -> mean+calculateMeanLocusOperandiOfTeachers timetable+	| Data.Map.null distinctLocationsByTeacherId	= 0	-- Zero bookings have been made.+	| otherwise					= Factory.Math.Statistics.getMean $ Data.Map.map Data.Set.size distinctLocationsByTeacherId+	where+		distinctLocationsByTeacherId	= foldr (+			uncurry (Data.Map.insertWith Data.Set.union) . (+				StudentView.LessonResourceIds.getTeacherId &&& Data.Set.singleton . StudentView.LessonResourceIds.getLocationId+			) . Model.Lesson.getResourceIds+		 ) Data.Map.empty $ Model.Timetable.extractLessons timetable++-- | Sets of /student-classes/ indexed by the /lesson/ for which they've been booked.+type StudentClassesByLesson locationId teacherId level	= Data.Map.Map (StudentView.Lesson.Lesson locationId teacherId level) (Data.Set.Set Aggregate.StudentClass.StudentClass)++{- |+	* Because (given sufficient /location/-capacity) one may simultaneously book more than one /student-body/, at a single /location/, taught by a single /teacher/, in a single /subject/,+	the specified /timetable/ may already contain /booking/s formed from a variety of such combinations, each having the specified /student-body/ as a member.+	Since one may reasonably wish to minimise these combinations, this function aims to enumerate distinct /student-class/es per type of /lesson/.++	* For each distinct /lesson/ of which the specified /student-body/ is a member, it identifies the set of /student-class/es already booked.++	* Any set of size greater than one, represents a /student-body combination/ for that /lesson/.+-}+findStudentClassesByLessonFor :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> Timetable timeslotId locationId teacherId level+	-> Aggregate.StudentBody.StudentBody	-- ^ The /student-body/, whose /student-class/-membership one requires.+	-> StudentClassesByLesson locationId teacherId level+findStudentClassesByLessonFor timetable	= foldr (+	\booking -> Data.Map.insertWith Data.Set.union (+		Model.TimetableForWeek.getBookedLesson booking+	) . Data.Set.singleton $ extractStudentClassAt booking timetable+ ) Data.Map.empty . LinearModel.TimetableForWeek.fromTimetableForWeek {-ignore undefined timeslots-} . (timetable !)++{- |+	* Catalogues by /lesson/, the single /student-class/, at each booking-/time/.++	* A /student-body combination/ exists for a specific /lesson/, if within the /booking-time/s identified,+	any /student/ exists in more than one of the distinct /student-class/es;+	a necessary but insufficient prerequisit for which is, that within those /time/s, more than one distinct /student-class/ must exist.+-}+findStudentClassByTimeByLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ ) => Timetable timeslotId locationId teacherId level -> Data.Map.Map (StudentView.Lesson.Lesson locationId teacherId level) (Data.Map.Map (Temporal.Time.Time timeslotId) Aggregate.StudentClass.StudentClass)+findStudentClassByTimeByLesson	= foldr (+	uncurry (+		Data.Map.insertWith $ Data.Map.unionWith Data.Set.union+	) . (+		Model.Timetable.getBookedLesson &&& uncurry Data.Map.singleton . (+			Model.TimetableCoordinates.getTime &&& Data.Set.singleton . Model.TimetableCoordinates.getObserverId+		) . Model.Timetable.getBookedCoordinates+	)+ ) Data.Map.empty . LinearModel.Timetable.fromTimetable++{- |+	* Equivalent to calling 'findStudentClassesByLessonFor' for each /student-body/, & merging the results; but more efficient.++	* A /student-body combination/ exists for a specific /lesson/, if any /student/ exists in more than one of the distinct /student-class/es;+	a necessary but insufficient prerequisit for which is, that more than one distinct /student-class/ must exist.+	E.g. if for a particular /lesson/-type, there are two /booking/s each for either one of two /student-bodies/, then neither will be part of a /student-body combination/,+	but when the results are merged by removing the booking-/time/, the /lesson/ will map to a set of size two.+-}+findStudentClassesByLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ ) => Timetable timeslotId locationId teacherId level -> StudentClassesByLesson locationId teacherId level+findStudentClassesByLesson	= Data.Map.map (+	Data.Set.fromList . Data.Map.elems {-student-classes-}	-- Discard the time.+ ) . findStudentClassByTimeByLesson++{- |+	* Each /student-body/ can be booked for a specific /lesson/ (i.e. to learn a /subject/, taught by a /teacher/, at a /location/),+	by merging with other /student-bodies/ in a variety of combinations, to form a /student-class/.++	* Gets the average number of /student-body/-combinations, over the domain of /student-bodies/ & 'StudentView.Lesson.Lesson's.+	Each number of combinations is weighted by the size of the /student-body/, in the average.+-}+calculateWeightedMeanStudentBodyCombinationsPerLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		weightedMean,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ ) => Timetable timeslotId locationId teacherId level -> weightedMean+calculateWeightedMeanStudentBodyCombinationsPerLesson timetable+	| denominator == 0	= 1	-- (zero / zero) -> 1, at the limit of only one lesson-definition in the timetable.+	| otherwise		= fromIntegral numerator / fromIntegral denominator+	where+		(numerator, denominator)	= Data.Map.foldr (+			\studentClassSet pair	-> if Data.Set.size studentClassSet == 1	-- Trap the most common case, which can be addressed more efficiently.+				then ToolShed.Data.Pair.mirror (+					+ Aggregate.StudentClass.getSize (Data.Set.findMin studentClassSet)+				) pair	-- All student-bodies must be a member of the only student-class.+				else Data.Set.foldr (+					\studentBody -> let+						(memberOfNStudentClasses, weight)	= Data.Set.size . (+							`Data.Set.filter` studentClassSet	-- Select those student-classes of which this student-body is a member.+						 ) . Data.Set.member &&& Aggregate.StudentBody.getSize $ studentBody+					in (+ memberOfNStudentClasses * weight) *** (+ weight)+				) pair . Data.Set.unions $ Data.Set.elems studentClassSet	-- Consider each distinct student-body in turn.+		 ) (0, 0) $ findStudentClassesByLesson timetable++-- | The type of a map passed to 'toXHtml'.+type InterCampusMigrationsByStudentBody	= Data.Map.Map Aggregate.StudentBody.StudentBody Size.NTimeslots++-- | The type of a map passed to 'toXHtml'.+type LessonRunlengthByStudentBody timeslotId locationId teacherId level	= Data.Map.Map Aggregate.StudentBody.StudentBody [(Temporal.Time.Time timeslotId, ToolShed.Data.List.Runlength.Code (StudentView.Lesson.Lesson locationId teacherId level))]++{- |+	* Render in /XHTML/, as a /definition-list/.++	* CAVEAT: the extra parameters make it difficult to express this as an instance of 'Text.XHtml.Strict.HTML'.+-}+toXHtml :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Show			stream,+	Show			teacherId,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	stream,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> InterCampusMigrationsByStudentBody											-- ^ The number of inter-/campus/ /student/-migrations, indexed by /student-body/.+	-> Data.Requirements.Requirements (Aggregate.StudentBodyRegister.KnowledgeByStudentBody level)				-- ^ The unbooked /knowledge-requirements/ by student-body, partitioned into core & optional /subject/s.+	-> LessonRunlengthByStudentBody timeslotId locationId teacherId level							-- ^ Excessively long subject-sessions.+	-> LessonRunlengthByStudentBody timeslotId locationId teacherId level							-- ^ Short subject-sessions.+	-> Size.NTimeslots													-- ^ The number of /time-slot/s per /day/.+	-> (StudentView.Lesson.Lesson locationId teacherId level -> Data.Course.Course synchronisationId level timeslotId)	-- ^ Find the /course/ to which the specified /lesson/ belongs.+	-> Aggregate.StudentBodyRegister.StudentBodyRegister level stream teachingRatio+	-> Model.Timetable.GenericTimetableToMarkup locationId minimumContrastRatio teacherId timeslotId (Timetable timeslotId locationId teacherId level)+toXHtml interCampusMigrationsByStudentBody unbookedKnowledgeRequirementsByStudentBody excessivelyLongSessionsByStudentBody shortSessionsByStudentBody nTimeslotsPerDay findCourseFor studentBodyRegister displaySupplementaryInformation meetingsByTime htmlMergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom timetable	= Text.XHtml.Strict.defList . map (+	\(studentBody, timetableForWeek)	-> let+		(studentProfile, (excessivelyLongSessions, shortSessions))	= (studentBodyRegister !) &&& ((excessivelyLongSessionsByStudentBody !) &&& (shortSessionsByStudentBody !)) $ studentBody	-- De-reference.+	in (+		Text.XHtml.Strict.unordList (+			Text.XHtml.Strict.toHtml studentBody : if displaySupplementaryInformation+				then Data.Maybe.catMaybes [+					let+						nInterCampusMigrations	= interCampusMigrationsByStudentBody ! studentBody+					in if nInterCampusMigrations == 0+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "The number of inter-campus migrations required by these students."+						] << (+							"Inter-campus migrations" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << nInterCampusMigrations+						),+					let+						stream	= Data.Student.getStream studentProfile+					in if any ($ show stream) [null, (== "\"\"")]	-- The string-representation is uncertain, since 'stream' is polymorphic.+						then Nothing+						else Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+							Text.XHtml.Strict.title "The year/stream for this student-body."+						] << (+							"Stream" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+							] << stream+						),+					(+						(+							Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+								Text.XHtml.Strict.title "Any core knowledge-requirements for this student-body, which are incompletely booked."+							] <<+						) . (+							"Incomplete core knowledge-requirements" ++++						) . (+							Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+							] <<+						) . Text.XHtml.Strict.unordList . Data.Set.toAscList+					) `fmap` Data.Map.lookup studentBody (+						Data.Requirements.getCore unbookedKnowledgeRequirementsByStudentBody+					),+					(+						(+							Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+								Text.XHtml.Strict.title "Any optional knowledge-requirements for this student-body, which are incompletely booked."+							] <<+						) . (+							"Incomplete optional knowledge-requirements:" ++++						) . (+							Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+							] <<+						) . Text.XHtml.Strict.unordList . Data.Set.toAscList+					) `fmap` Data.Map.lookup studentBody (+						Data.Requirements.getOptional unbookedKnowledgeRequirementsByStudentBody+					),+					Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+						Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+						Text.XHtml.Strict.title "Time allocated to teaching / time available for teaching."+					] << (+						"Utilisation-ratio" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+						] << (+							round $ 100 * (+								Model.TimetableForWeek.calculateUtilisationRatio nTimeslotsPerDay studentProfile timetableForWeek ::Rational+							) :: Int+						) +++ '%'+					),+					let+						nFreePeriods :: Size.NTimeslots+						nFreePeriods	= Model.TimetableForWeek.countUnallocatedAvailableTimeslots studentProfile timetableForWeek - Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching nTimeslotsPerDay studentProfile {-which includes the time for meetings-}+					in if nFreePeriods == 0+						then Nothing+						else Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "The number of available but unallocated time-slots, excluding those allocated to free study & meetings, multiplied by the size of the student-body."+						] << (+							"Free-periods" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << nFreePeriods +++ Text.XHtml.Strict.primHtmlChar "times" +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << Aggregate.StudentBody.getSize studentBody+						),+					let+						separatedEqualSubjectLessons	= Model.TimetableForWeek.findSeparatedEqualSubjectLessonsWithinAnyDay timetableForWeek+					in if null separatedEqualSubjectLessons+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "The number of instances of separated sessions in the same subject, in any single day."+						] << (+							"Split sessions:" +++ Text.XHtml.Strict.unordList (+								map (+									uncurry (+++) . Data.Tuple.swap . (+										(+											((Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.primHtmlChar "Implies" +++ Text.XHtml.Strict.spaceHtml) +++) . Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+												Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+											] <<+										) . pred {-count those exceeding one-} *** Model.Lesson.getSubject+									)+								) separatedEqualSubjectLessons+							)+						),+					if null excessivelyLongSessions+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+						] << (+							"Long sessions:" +++ (+								Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+									Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+								] << Text.XHtml.Strict.unordList (+									ToolShed.Data.List.nub' $ map (+										Model.Lesson.getSubject . ToolShed.Data.List.Runlength.getDatum . snd {-runlength-code-}+									) excessivelyLongSessions+								)+							)+						),+					if null shortSessions+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "Some subjects have been booked in shorter sessions than requested."+						] << (+							"Short sessions:" +++ (+								Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+									Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+								] << Text.XHtml.Strict.unordList (+									ToolShed.Data.List.nub' $ map (+										Model.Lesson.getSubject . ToolShed.Data.List.Runlength.getDatum . snd {-runlength-code-}+									) shortSessions+								)+							)+						),+					let+						studentBodyCombinationsByLesson	= Data.Map.filter ((> 1) . Data.Set.size) $ findStudentClassesByLessonFor timetable studentBody+					in if Data.Map.null studentBodyCombinationsByLesson+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "Those subjects studied with different combinations of student-bodies."+						] << (+							"Student-body combinations:" +++ Text.XHtml.Strict.unordList (+								map (+									uncurry (+++) . (+										Model.Lesson.getSubject *** (+											((Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.primHtmlChar "Implies" +++ Text.XHtml.Strict.spaceHtml) +++) . Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+												Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier,+												Text.XHtml.Strict.title "Number of combinations."+											] <<+										) . Data.Set.size+									)+								) $ Data.Map.toList studentBodyCombinationsByLesson+							)+						)+				]+				else []+		) Text.XHtml.Strict.! [Text.XHtml.Strict.theclass Text.CSS.observerSummaryCSSIdentifier],	-- CAVEAT: xhtml only permits inline elements to be nested inside a 'dt' element, & 'ul' is a block element.+		Model.TimetableForWeek.toXHtml findCourseFor studentProfile (Model.Meeting.deleteStudentBody studentBody meetingsByTime) htmlMergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom timetableForWeek+	) -- Pair.+ ) $ Data.Map.toList timetable++-- | A /lesson/ qualified by the /coordinates/ at which it is booked.+type Booking timeslotId locationId teacherId level	= Model.Timetable.Booking Aggregate.StudentBody.StudentBody timeslotId (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) level
+ src-lib/WeekDaze/StudentView/TimetableCoordinates.hs view
@@ -0,0 +1,48 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the coordinates, used to access any time-slot, in the conceptually /3-D/ data-structure of the timetable required by /student/s.++	* Each time-slot can contain a /lesson/-definition.+-}++module WeekDaze.StudentView.TimetableCoordinates(+-- * Types+-- ** Type-synonyms+	ObserverId,+	Coordinates,+	Vector+) where++import qualified	WeekDaze.Aggregate.StudentBody		as Aggregate.StudentBody+import qualified	WeekDaze.Model.TimetableCoordinates	as Model.TimetableCoordinates++-- | 'Timetable' is designed to be viewed by a /student-body/.+type ObserverId	= Aggregate.StudentBody.StudentBody++-- | Defines the three coordinates of a time-slot, within a /timetable/ designed to be viewed by a /student/.+type Coordinates timeslotId	= Model.TimetableCoordinates.Coordinates ObserverId timeslotId++-- | An ordered sequence of 'Coordinates'.+type Vector timeslotId	= [Coordinates timeslotId]+
+ src-lib/WeekDaze/StudentView/TimetableForDay.hs view
@@ -0,0 +1,39 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the data-structure, required to hold the specification of the activities of a single /day/, for any single /student-body/.++	* It forms a complete /timetable/, when combined with similar structures representing all other /day/s & /student-bodies/.+-}++module WeekDaze.StudentView.TimetableForDay(+-- * Types+-- ** Type-synonyms+	TimetableForDay+) where++import qualified	WeekDaze.Model.TimetableForDay		as Model.TimetableForDay+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds++-- | A 'Model.TimetableForDay.TimetableForDay', specialised for viewing by a /student/.+type TimetableForDay timeslotId locationId teacherId level	= Model.TimetableForDay.TimetableForDay timeslotId (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) level
+ src-lib/WeekDaze/StudentView/TimetableForWeek.hs view
@@ -0,0 +1,77 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the data-structure, to required to hold the specification of the activities of a single week, for any single /student-body/.++	* It forms a complete /timetable/, when combined with similar structures for all other /student-bodies/.+-}++module WeekDaze.StudentView.TimetableForWeek(+-- * Types+-- ** Type-synonyms+	Booking,+	TimetableForWeek,+-- * Functions+	extractRoutineBySubject+) where++import			Control.Arrow((&&&))+import qualified	Data.Array.IArray+import qualified	Data.Map+import qualified	Data.Set+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.TimetableForWeek		as Model.TimetableForWeek+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds++-- | A booking seen from one point-of-view.+type Booking timeslotId locationId teacherId level	= Model.TimetableForWeek.Booking timeslotId (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) level++-- | A timetable for one 'Data.Student.Body' with identical scheduling requirements, for any week.+type TimetableForWeek timeslotId locationId teacherId level	= Model.TimetableForWeek.TimetableForWeek timeslotId (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) level++{- |+	* Once a /teacher/ has been assigned to teach a /student-body/, in a /subject/, at a /location/, a routine has been established;+	the /student-body/ wouldn't normally be taught that /subject/, by any other /teacher/, or in any other /location/.+	If the routine is adhered to, then each /subject/ maps to a singleton set of /resource-Id/s.++	* CAVEAT: this concept doesn't apply to other views of the /timetable/:+		/teacher/-view;		the same /teacher/ can teach other /student-bodies/, in that /subject/, & at that /location/.+		/location/-view;	the same /location/ can host other /student-bodies/, for tuition of that /subject/, & by that /teacher/.+-}+extractRoutineBySubject :: (+	Data.Array.IArray.Ix	timeslotId,+	Ord			level,+	Ord			locationId,+	Ord			teacherId+ )+	=> TimetableForWeek timeslotId locationId teacherId level	-- ^ The current /timetable/.+	-> Data.Map.Map (Data.Subject.Subject level) (Data.Set.Set (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId))+extractRoutineBySubject	= foldr (+	uncurry (+		Data.Map.insertWith Data.Set.union+	) . (+		Model.Lesson.getSubject &&& Data.Set.singleton . Model.Lesson.getResourceIds+	)+ ) Data.Map.empty . Model.TimetableForWeek.extractLessons+
+ src-lib/WeekDaze/TeacherView/Lesson.hs view
@@ -0,0 +1,52 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the data required to define a /time-slot/, in the /timetable/ viewed from the perspective of a /teacher/.+-}++module WeekDaze.TeacherView.Lesson(+-- * Types+-- ** Type-synonyms+	Lesson,+-- ** Translation+	fromStudentView,+	toStudentView+) where++import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.StudentView.Lesson		as StudentView.Lesson+import qualified	WeekDaze.TeacherView.LessonResourceIds	as TeacherView.LessonResourceIds++-- | Specialise for the case in which a 'Model.Lesson.Lesson' is viewed from the perspective of the /teacher/.+type Lesson locationId level	= Model.Lesson.Lesson (TeacherView.LessonResourceIds.LessonResourceIds locationId) level++-- | Convert from the /student/-view to a /teacher/-view.+fromStudentView :: Show locationId => StudentView.Lesson.Lesson locationId teacherId level -> Aggregate.StudentClass.StudentClass -> Lesson locationId level+fromStudentView studentViewLesson studentClass	= studentViewLesson {+	Model.Lesson.getResourceIds	= TeacherView.LessonResourceIds.fromStudentView (Model.Lesson.getResourceIds studentViewLesson) studentClass+}++-- | Convert from the /teacher/-view to a /student/-view.+toStudentView :: teacherId -> Lesson locationId level -> StudentView.Lesson.Lesson locationId teacherId level+toStudentView teacherId lesson	= lesson {+	Model.Lesson.getResourceIds	= TeacherView.LessonResourceIds.toStudentView teacherId $ Model.Lesson.getResourceIds lesson+}
+ src-lib/WeekDaze/TeacherView/LessonResourceIds.hs view
@@ -0,0 +1,111 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines the /resource/s required for a /lesson/, from the perspective of a /teacher/.+-}++module WeekDaze.TeacherView.LessonResourceIds(+-- * Types+-- ** Data-types+	LessonResourceIds(+--		MkLessonResourceIds,+		getLocationId,+		getStudentClass+	),+-- * Constants+--	tag,+-- * Functions+-- ** Constructor+	mkLessonResourceIds,+-- ** Translation+	fromStudentView,+	toStudentView+) where++import			Control.Arrow((&&&))+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle		as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Model.ResourceUser		as Model.ResourceUser+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds+import			Text.XHtml.Strict((+++), (<<))++-- | Used to qualify XML.+tag :: String+tag	= "teacherViewLessonResourceIds"++-- | Composed from both the 'locationId' & 'Aggregate.StudentClass.StudentClass'.+data LessonResourceIds locationId	= MkLessonResourceIds {+	getLocationId	:: locationId,				-- ^ The identifier for the /location/ at which the /class/ will be held.+	getStudentClass	:: Aggregate.StudentClass.StudentClass	-- ^ The /class/ of /student/s to be taught.+} deriving (Eq, Ord, Show)++instance Text.XHtml.Strict.HTML locationId => Text.XHtml.Strict.HTML (LessonResourceIds locationId) where+	toHtml	= (+		\(locationId, studentClass) -> Text.XHtml.Strict.li << (locationId +++ '.') +++ Text.XHtml.Strict.li << (studentClass +++ '.')+	 ) . (+		getLocationId &&& Aggregate.StudentClass.toHtml . getStudentClass+	 )++instance HXT.XmlPickler locationId => HXT.XmlPickler (LessonResourceIds locationId) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry MkLessonResourceIds,		-- Construct from a Pair.+		getLocationId &&& getStudentClass	-- Deconstruct to a Pair.+	 ) $ HXT.xpickle `HXT.xpPair` (+		HXT.xpElem Aggregate.StudentClass.tag . HXT.xpWrap (+			Data.Set.fromList,	-- Construct from a List.+			Data.Set.toList		-- Deconstruct to a List.+		) $ HXT.xpList1 {-can't be null-} HXT.xpickle {-StudentBody-}+	 )++instance Eq locationId => Model.ResourceUser.ResourceUser (LessonResourceIds locationId) where+	areIndependent l r	= getLocationId l /= getLocationId r && Model.ResourceUser.areIndependent (getStudentClass l) (getStudentClass r)++instance Show locationId => ToolShed.SelfValidate.SelfValidator (LessonResourceIds locationId) where+	getErrors lessonResourceIds	= ToolShed.SelfValidate.extractErrors [+		(Data.Set.null $ getStudentClass lessonResourceIds,	"a class should be composed from one or more student-bodies; " ++ show lessonResourceIds)+	 ]++-- | Smart constructor.+mkLessonResourceIds+	:: Show locationId+	=> locationId				-- ^ The identifier of the /location/ at which the /student-class/ is to be taught.+	-> Aggregate.StudentClass.StudentClass	-- ^ The class of /student/s to be instructed.+	-> LessonResourceIds locationId+mkLessonResourceIds locationId studentClass+	| ToolShed.SelfValidate.isValid lessonResourceIds	= lessonResourceIds+	| otherwise						= error $ "WeekDaze.TeacherView.LessonResourceIds.mkLessonResourceIds:\t" ++ ToolShed.SelfValidate.getFirstError lessonResourceIds ++ "."+	where+		lessonResourceIds	= MkLessonResourceIds locationId studentClass++-- | Convert from the /student/-view to a /teacher/-view.+fromStudentView :: Show locationId => StudentView.LessonResourceIds.LessonResourceIds locationId teacherId -> Aggregate.StudentClass.StudentClass -> LessonResourceIds locationId+fromStudentView resourceIds	= mkLessonResourceIds (StudentView.LessonResourceIds.getLocationId resourceIds)++-- | Convert from the /teacher/-view to a /student/-view.+toStudentView :: teacherId -> LessonResourceIds locationId -> StudentView.LessonResourceIds.LessonResourceIds locationId teacherId+toStudentView teacherId resourceIds	= StudentView.LessonResourceIds.MkLessonResourceIds {+	StudentView.LessonResourceIds.getLocationId	= getLocationId resourceIds,+	StudentView.LessonResourceIds.getTeacherId	= teacherId+}+
+ src-lib/WeekDaze/TeacherView/Timetable.hs view
@@ -0,0 +1,381 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the /timetable/ for any week, for all /teacher/s.++	* It contains identical information to 'StudentView.Timetable.Timetable',+	but the data has been re-indexed to present it in a form relevant to a /teacher/ rather than a /student/.+-}++module WeekDaze.TeacherView.Timetable(+-- * Types+-- ** Type-synonyms+	Timetable,+--	Booking,+	InterCampusMigrationsByTeacherId,+	TimesByTeacherId,+-- * Functions+	findStudentClassesByLocationId,+	calculateMeanStudentClassSize,+	countLocationChangesByTeacherId,+-- ** Mutators+	bookStudentViewLesson,+--	bookTeacherViewLesson,+-- ** Translation+	fromStudentViewTimetable,+	toStudentViewTimetable,+	toXHtml+) where++import			Control.Arrow((&&&))+import			Data.Map((!))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Data.Tuple+import qualified	Factory.Math.Statistics+import qualified	Text.XHtml.Strict+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Aggregate.TeacherRegister	as Aggregate.TeacherRegister+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.HumanResource		as Data.HumanResource+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.Meeting			as Model.Meeting+import qualified	WeekDaze.Model.Timetable		as Model.Timetable+import qualified	WeekDaze.Model.TimetableForWeek		as Model.TimetableForWeek+import qualified	WeekDaze.Size				as Size+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable		as StudentView.Timetable+import qualified	WeekDaze.TeacherView.Lesson		as TeacherView.Lesson+import qualified	WeekDaze.TeacherView.LessonResourceIds	as TeacherView.LessonResourceIds+import qualified	WeekDaze.TeacherView.TimetableForWeek	as TeacherView.TimetableForWeek+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import qualified	WeekDaze.Text.CSS			as Text.CSS+import			Text.XHtml.Strict((+++), (<<))+import			WeekDaze.Text.XHTML()++-- | An association-list of the timetables for all /teachers/.+type Timetable teacherId timeslotId locationId level	= Model.Timetable.Timetable teacherId timeslotId (TeacherView.LessonResourceIds.LessonResourceIds locationId) level++{- |+	* Builds a 'Timetable' by inverting a 'StudentView.Timetable.Timetable'.++	* CAVEAT: in the original 'StudentView.Timetable.Timetable', different /student-bodies/ may simultaneously reference a single /teacher/.+	This is normal behaviour, provided the /teacher/ can cope with the class-size,+	& is implemented seemlessly, as a /map/-structure with one or more /key/s referencing a /value/, containing the same /teacher/.++	* When inverting such a /timetable/, this many-to-one relationship becomes a one-to-many, & a single /teacher-id/ must now reference many /student-bodies/.+	The simple /map/-structure, unlike a /multi-map/, can't directly accommodate multiple identical keys, with different values,+	so this is achieved by merging /student-bodies/ into /student-class/es.+-}+fromStudentViewTimetable :: (+	Data.Array.IArray.Ix	timeslotId,+	Enum			timeslotId,+	Eq			level,+	Eq			locationId,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> Bool							-- ^ Permit a temporary /student-body/ merger.+	-> Timetable teacherId timeslotId locationId level	-- ^ An unallocated /timetable/, supplied for efficiency.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Timetable teacherId timeslotId locationId level+fromStudentViewTimetable permitTemporaryStudentBodyMerger	= Data.Map.foldrWithKey (+	\studentBody studentViewTimetableForWeek teacherViewTimetable	-> snd {-timetable-} $ Data.Foldable.foldr (+		\studentViewTimetableForDay (day, teacherViewTimetable')	-> (+			pred day,	-- Because of the use of 'foldr'.+			snd {-timetable-} $ Data.Foldable.foldr (+				\maybeStudentViewLesson (timeslotId, teacherViewTimetable'')	-> (+					pred timeslotId,	-- Because of the use of 'foldr'.+					Data.Maybe.maybe teacherViewTimetable'' (+						(+							$ teacherViewTimetable''+						) . bookStudentViewLesson permitTemporaryStudentBodyMerger {-partially apply-} . (,) (+							studentBody,+							Temporal.Time.mkTime day timeslotId+						) {-construct a booking-}+					) maybeStudentViewLesson+				)+			) (+				snd {-maximum timeslotId-} $ Data.Array.IArray.bounds studentViewTimetableForDay,+				teacherViewTimetable'+			) studentViewTimetableForDay+		) {-CAVEAT: performance-hotspot-}+	) (+		snd {-maximum day-} $ Data.Array.IArray.bounds studentViewTimetableForWeek,+		teacherViewTimetable+	) studentViewTimetableForWeek+ )++{- |+	* Build a 'StudentView.Timetable.Timetable', by inverting a 'Timetable'.++	* Each /lesson/ in the /timetable/ seen from the /teacher/'s perspective, contains a /student-class/.+	This /student-class/ must be broken into /student-bodies/, before inserting repeatedly into the required /timetable/ as seen from the /student-body/'s perpective.+-}+toStudentViewTimetable+	:: (Data.Array.IArray.Ix timeslotId, Enum timeslotId)+	=> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ An unallocated /timetable/, supplied for efficiency.+	-> Timetable teacherId timeslotId locationId level+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+toStudentViewTimetable	= Data.Map.foldrWithKey (+	\teacherId teacherViewTimetableForWeek studentViewTimetable	-> snd {-timetable-} $ Data.Foldable.foldr (+		\teacherViewTimetableForDay (day, studentViewTimetable')	-> (+			pred day,	-- Because of the use of 'foldr'.+			snd {-timetable-} $ Data.Foldable.foldr (+				\maybeTeacherViewLesson (timeslotId, studentViewTimetable'')	-> (+					pred timeslotId,	-- Because of the use of 'foldr'.+					Data.Maybe.maybe studentViewTimetable'' (+						(+							$ studentViewTimetable''+						) . bookTeacherViewLesson {-partially apply-} . (,) (+							teacherId,+							Temporal.Time.mkTime day timeslotId+						) {-construct a booking-}+					) maybeTeacherViewLesson+				)+			) (+				snd {-maximum timeslotId-} $ Data.Array.IArray.bounds teacherViewTimetableForDay,+				studentViewTimetable'+			) teacherViewTimetableForDay+		)+	) (+		snd {-maximum day-} $ Data.Array.IArray.bounds teacherViewTimetableForWeek,+		studentViewTimetable+	) teacherViewTimetableForWeek+ )++-- | Apply a 'StudentView.Timetable.Booking' to a /TeacherView-timetable/.+bookStudentViewLesson :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			locationId,+	Eq			level,+	Ord			teacherId,+	Show			level,+	Show			locationId,+	Show			teacherId,+	Show			timeslotId+ )+	=> Bool									-- ^ Permit a temporary /student-body/ merger.+	-> StudentView.Timetable.Booking timeslotId locationId teacherId level	-- ^ The /coordinates/ & /lesson/ from the perspective of the /student/-view of the /timetable/.+	-> Timetable teacherId timeslotId locationId level			-- ^ The /timetable/ as seen from the /teacher/'s perspective.+	-> Timetable teacherId timeslotId locationId level+bookStudentViewLesson permitTemporaryStudentBodyMerger ((studentBody, time), studentViewLesson) teacherViewTimetable	= Model.Timetable.defineTimeslot (+	teacherViewTimetableCoordinates,+	Just studentViewLesson {+		Model.Lesson.getResourceIds	= TeacherView.LessonResourceIds.mkLessonResourceIds locationId . Data.Set.insert studentBody $ case Model.Timetable.getMaybeLesson teacherViewTimetableCoordinates teacherViewTimetable of+			Nothing	-> Data.Set.empty	-- Start a new student-class.+			Just teacherViewLesson+				| and [+					permitTemporaryStudentBodyMerger,+					TeacherView.LessonResourceIds.getLocationId teacherViewResourceIds == locationId,+					Model.Lesson.getSubject teacherViewLesson == Model.Lesson.getSubject studentViewLesson+				]		-> TeacherView.LessonResourceIds.getStudentClass teacherViewResourceIds+				| otherwise	-> error $ "WeekDaze.TeacherView.Timetable.bookStudentViewLesson:\tlesson at coordinates=" ++ show teacherViewTimetableCoordinates ++ " has already been booked in either a different subject or location; " ++ show (studentViewLesson, teacherViewLesson) ++ "."+				where+					teacherViewResourceIds	= Model.Lesson.getResourceIds teacherViewLesson+	} -- Mutate.+ ) teacherViewTimetable where+	studentViewResourceIds		= Model.Lesson.getResourceIds studentViewLesson+	locationId			= StudentView.LessonResourceIds.getLocationId studentViewResourceIds+	teacherViewTimetableCoordinates	= (StudentView.LessonResourceIds.getTeacherId studentViewResourceIds, time)++-- | Catalogue the /student-class/es booked in the specified /timetable/, indexed by /location-Id/.+findStudentClassesByLocationId+	:: (Data.Array.IArray.Ix timeslotId, Ord locationId)+	=> Timetable teacherId timeslotId locationId level+	-> Data.Map.Map locationId [Aggregate.StudentClass.StudentClass]+findStudentClassesByLocationId	= Data.Map.fromListWith (++) . map (+	(TeacherView.LessonResourceIds.getLocationId &&& return {-to List-monad-} . TeacherView.LessonResourceIds.getStudentClass) . Model.Lesson.getResourceIds+ ) . Model.Timetable.extractLessons++-- | Calculates the mean over all /booking/s, of the size of the /student-class/.+calculateMeanStudentClassSize :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		meanValue+ ) => Timetable teacherId timeslotId locationId level -> meanValue+calculateMeanStudentClassSize teacherViewTimetable+	| null lessons	= 0	-- The timetable is completely unpopulated.+	| otherwise	= Factory.Math.Statistics.getMean $ map (+		Aggregate.StudentClass.getSize . TeacherView.LessonResourceIds.getStudentClass . Model.Lesson.getResourceIds+	) lessons+	where+		lessons	= Model.Timetable.extractLessons teacherViewTimetable++{- |+	* Counts the /location/-changes made by each /teacher/.++	* The minimum value of zero can be achieved either by a completely unbooked /timetable/,+	or one completely booked by the /lesson/s in the same /location/.++	* CAVEAT: doesn't account for the /location/ of any /meeting/s.+-}+countLocationChangesByTeacherId :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			locationId+ ) => Timetable teacherId timeslotId locationId level -> Data.Map.Map teacherId Int+countLocationChangesByTeacherId	= Data.Map.map TeacherView.TimetableForWeek.countLocationChanges++-- | A /lesson/ qualified by the /coordinates/ at which it is booked.+type Booking teacherId timeslotId locationId level	= Model.Timetable.Booking teacherId timeslotId (TeacherView.LessonResourceIds.LessonResourceIds locationId) level++-- | Books a /TeacherView-booking/ in a /StudentView-timetable/.+bookTeacherViewLesson+	:: Data.Array.IArray.Ix timeslotId+	=> Booking teacherId timeslotId locationId level				-- ^ The /coordinates/ & /lesson/ from the perspective of the /teacher/-view of the /timetable/.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level	-- ^ The /timetable/ as seen from the /student/'s perspective.+	-> StudentView.Timetable.Timetable timeslotId locationId teacherId level+bookTeacherViewLesson ((teacherId, time), teacherViewLesson) studentViewTimetable	= Data.Set.foldr (+	Model.Timetable.defineTimeslot . flip (,) (+		Just $ TeacherView.Lesson.toStudentView teacherId teacherViewLesson+	) . flip (,) time+ ) studentViewTimetable $ TeacherView.LessonResourceIds.getStudentClass teacherViewResourceIds where+	teacherViewResourceIds	= Model.Lesson.getResourceIds teacherViewLesson++-- | The type of a map passed to 'toXHtml'.+type InterCampusMigrationsByTeacherId teacherId	= Data.Map.Map teacherId Size.NTimeslots++-- | A map indexed by /teacherId/, of sets of /times/.+type TimesByTeacherId teacherId timeslotId	= Data.Map.Map teacherId (Temporal.Time.TimeSet timeslotId)++-- | Render in /XHTML/, as a /definition-list/.+toXHtml :: (+	Data.Array.IArray.Ix	timeslotId,+	Fractional		minimumContrastRatio,+	Ord			level,+	Ord			locationId,+	Ord			minimumContrastRatio,+	Ord			teacherId,+	RealFrac		teachingRatio,+	Show			level,+	Show			locationId,+	Text.XHtml.Strict.HTML	level,+	Text.XHtml.Strict.HTML	locationId,+	Text.XHtml.Strict.HTML	synchronisationId,+	Text.XHtml.Strict.HTML	teacherId,+	Text.XHtml.Strict.HTML	timeslotId+ )+	=> InterCampusMigrationsByTeacherId teacherId										-- ^ The number of inter-/campus/ /teacher/-migrations, indexed by /teacherId/.+	-> TimesByTeacherId teacherId timeslotId										-- ^ Unbooked but specified times, by /teacherId/.+	-> Size.NTimeslots													-- ^ The number of /time-slot/s per /day/.+	-> (teacherId -> TeacherView.Lesson.Lesson locationId level -> Data.Course.Course synchronisationId level timeslotId)	-- ^ Find the /course/ to which the specified /lesson/ belongs.+	-> Aggregate.TeacherRegister.TeacherRegister teacherId synchronisationId level timeslotId locationId teachingRatio+	-> Model.Timetable.GenericTimetableToMarkup locationId minimumContrastRatio teacherId timeslotId (Timetable teacherId timeslotId locationId level)+toXHtml interCampusMigrationsByTeacherId unbookedSpecifiedTimesByTeacherId nTimeslotsPerDay findCourseFor teacherRegister displaySupplementaryInformation meetingsByTime htmlMergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom	= Text.XHtml.Strict.defList . map (+	\(teacherId, timetableForWeek)	-> let+		teacherProfile	= teacherRegister ! teacherId+	in (+		Text.XHtml.Strict.unordList (+			Text.XHtml.Strict.toHtml teacherId : if displaySupplementaryInformation+				then Data.Maybe.catMaybes [+					let+						nInterCampusMigrations	= interCampusMigrationsByTeacherId ! teacherId+					in if nInterCampusMigrations == 0+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "The number of inter-campus migrations required of this teacher."+						] << (+							"Inter-campus migrations" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << nInterCampusMigrations+						),+					if Data.HumanResource.getNTimeslotsPerWeekOfTeaching nTimeslotsPerDay teacherProfile == 0+						then Nothing+						else Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.infoCSSIdentifier,+							Text.XHtml.Strict.title "Time allocated to teaching / time available for teaching."+						] << (+							"Utilisation-ratio" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << (+								round $ 100 * (+									Model.TimetableForWeek.calculateUtilisationRatio nTimeslotsPerDay teacherProfile timetableForWeek ::Rational+								) :: Int+							) +++ '%'+						),+					let+						nFreePeriods	= Model.TimetableForWeek.countUnallocatedAvailableTimeslots teacherProfile timetableForWeek - Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching nTimeslotsPerDay teacherProfile {-which includes the time for meetings-}+					in if nFreePeriods == 0+						then Nothing+						else Just $ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "The number of available but unallocated time-slots, excluding those allocated to administration & meetings."+						] << (+							"Free-periods" +++ Text.XHtml.Strict.spaceHtml +++ '=' +++ Text.XHtml.Strict.spaceHtml +++ Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+								Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+							] << nFreePeriods+						),+					let+						separatedEqualLessons	= Model.TimetableForWeek.findSeparatedEqualLessonsWithinAnyDay timetableForWeek+					in if null separatedEqualLessons+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "The number of instances of separated sessions of identical lessons, in any single day."+						] << (+							"Split sessions:" +++ Text.XHtml.Strict.defList (+								map (+									Data.Tuple.swap . Control.Arrow.first (+										(+											Text.XHtml.Strict.thespan Text.XHtml.Strict.! [+												Text.XHtml.Strict.theclass Text.CSS.numericDataCSSIdentifier+											] <<+										) . pred {-count those exceeding one-}+									)+								) separatedEqualLessons+							)+						),+					let+						unbookedSpecifiedTimes	= unbookedSpecifiedTimesByTeacherId ! teacherId+					in if Data.Set.null unbookedSpecifiedTimes+						then Nothing+						else Just $ Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+							Text.XHtml.Strict.theclass Text.CSS.warningCSSIdentifier,+							Text.XHtml.Strict.title "Times specified by courses, which haven't been booked, for courses which have."+						] << (+							"Unbooked times:" +++ (+								Text.XHtml.Strict.thediv Text.XHtml.Strict.! [+									Text.XHtml.Strict.theclass Text.CSS.dataCSSIdentifier+								] << Text.XHtml.Strict.unordList (+									Data.Set.toAscList unbookedSpecifiedTimes+								)+							)+						)+				]+				else []+		) Text.XHtml.Strict.! [Text.XHtml.Strict.theclass Text.CSS.observerSummaryCSSIdentifier],	-- CAVEAT: xhtml only permits inline elements to be nested inside a 'dt' element, & 'ul' is a block element.+		Model.TimetableForWeek.toXHtml (+			findCourseFor teacherId	-- Partially apply.+		) teacherProfile (+			Model.Meeting.deleteTeacherId teacherId meetingsByTime+		) htmlMergeDuplicateTimeslots displayAxisLabels weekend maybeGenerateLessonColourFrom timetableForWeek+	) -- Pair.+ ) . Data.Map.toList+
+ src-lib/WeekDaze/TeacherView/TimetableForWeek.hs view
@@ -0,0 +1,59 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@] Defines the type of a /teacher/'s personal /timetable/ for any week.+-}++module WeekDaze.TeacherView.TimetableForWeek(+-- * Types+-- ** Type-synonyms+	TimetableForWeek,+-- * Functions+	countLocationChanges+) where++import			Control.Arrow((&&&))+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.TimetableForWeek		as Model.TimetableForWeek+import qualified	WeekDaze.TeacherView.LessonResourceIds	as TeacherView.LessonResourceIds++-- | A timetable for one 'teacher', for any week.+type TimetableForWeek timeslotId locationId level	= Model.TimetableForWeek.TimetableForWeek timeslotId (TeacherView.LessonResourceIds.LessonResourceIds locationId) level++{- |+	* Counts the number of times a /teacher/ has to relocate.++	* CAVEAT: an unallocated /time-slot/ is considered to have an unspecified /location/,+	which matches that of any adjacent unallocated /time-slot/s, but never that of an adjacent /lesson/.+-}+countLocationChanges :: (Data.Array.IArray.Ix timeslotId, Eq locationId) => TimetableForWeek timeslotId locationId level -> Int+countLocationChanges	= foldr (+	\(x, y)	-> if x /= y then succ else id	-- Count the number of times (Maybe locationId) changes.+ ) 0 . uncurry zip . (+	init &&& tail+ ) . Data.Foldable.concatMap (+	map (+		fmap $ TeacherView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds+	) . Data.Array.IArray.elems+ )+
+ src-lib/WeekDaze/Temporal/Availability.hs view
@@ -0,0 +1,193 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	Describes the availability of some /resource/.++ [@CAVEAT@]++	* Availability, as defined here, can only be defined for each whole /day/ in any unspecified week,+	rather than individual time-slots within a day, or sporadic days in the year.+	This restriction isn't conceptual, but merely for the tractability of the code.++	* Resources available for only part of a /day/, can't be directly accommodated.+-}++module WeekDaze.Temporal.Availability(+-- * Types+-- ** Data-types+	Availability(+		deconstruct+	),+-- * Constants+	tag,+--	fulltime,+--	unavailable,+-- * Functions+--	availabilityParser,+	calculateAvailabilityRatio,+	countDaysPerWeekAvailable,+	countInternalAvailabilityGaps,+	findIntersection,+	findIntersections,+--	findUnion,+	findUnions,+-- ** Constructor+	mkAvailability,+-- ** Predicates+	isFulltime,+	isUnavailable,+	isAvailableOn+#ifdef USE_HDBC+-- ** Translation+	,fromMySqlSet+	,toMySqlSet+#endif+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.SelfValidate+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Day		as Temporal.Day++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	WeekDaze.Database.Selector	as Database.Selector++instance Data.Convertible.Convertible Database.HDBC.SqlValue Availability {-multi-parameter type-class-} where+	safeConvert	= fmap fromMySqlSet . Data.Convertible.safeConvert++-- | Constructs an /Availability/ from a MySql set.+fromMySqlSet :: String -> Availability+fromMySqlSet	= mkAvailability . Database.Selector.fromMySqlSet++-- | Constructs a MySql set from an /Availability/.+toMySqlSet :: Availability -> String+toMySqlSet	= Database.Selector.toMySqlSet . Data.Set.toList . deconstruct+#endif /* USE_HDBC */++-- | Used to qualify SQL & XML.+tag :: String+tag	= "availability"++-- | The set of /day/s on which an arbitrary /resource/ is /available/.+newtype Availability	= MkAvailability {+	deconstruct	:: Data.Set.Set Temporal.Day.Day+} deriving (Eq, Ord)++instance Show Availability where+	showsPrec _	= shows . Data.Set.toList . deconstruct	-- Hides the data-constructor.++instance Control.DeepSeq.NFData Availability where+	rnf	= Control.DeepSeq.rnf . deconstruct++-- | Constant.+fulltime :: Availability+fulltime	= mkAvailability Temporal.Day.range++-- | Constant.+unavailable :: Availability+unavailable	= MkAvailability Data.Set.empty++instance Data.Default.Default Availability where+	def	= fulltime++{- |+	* Smart constructor.++	* Prevents one directly constructing an un/available/ /resource/, though one can indirectly as a result of an operation which returns a new one; e.g. 'findIntersection'.+-}+mkAvailability :: [Temporal.Day.Day] -> Availability+mkAvailability days+	| ToolShed.SelfValidate.isValid availability	= availability+	| otherwise					= error $ "WeekDaze.Temporal.Availability.mkAvailability:\t" ++ ToolShed.SelfValidate.getFirstError availability ++ "."+	where+		availability	= MkAvailability $ Data.Set.fromList days++instance ToolShed.SelfValidate.SelfValidator Availability where+	getErrors availability	= ToolShed.SelfValidate.extractErrors [(isUnavailable availability, "no availability")]++instance HXT.XmlPickler Availability where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		mkAvailability,			-- Construct from a List.+		Data.Set.toList . deconstruct	-- Deconstruct to a List.+	 ) $ HXT.xpList1 {-can't be null-} HXT.xpickle++-- | The number of /day/s per week, which can be considered /available/.+countDaysPerWeekAvailable :: Availability -> Size.NDays+countDaysPerWeekAvailable	= Data.Set.size . deconstruct++-- | Counts non-terminal blocks of consecutive un/available/ /day/s.+countInternalAvailabilityGaps :: Availability -> Size.NDays+countInternalAvailabilityGaps available+	| isUnavailable available	= 0+	| otherwise			= length . filter (+		> 1		-- Select non-consecutive available days.+	) . uncurry (+		zipWith (-)	-- Measure the unavailable duration between successive available days.+	) . (+		map fromEnum . tail &&& map fromEnum . init+	) . Data.Set.toAscList $ deconstruct available++-- | Returns the ratio of the available portion of the week, to the whole week (including weekends).+calculateAvailabilityRatio :: Fractional f => Availability -> f+calculateAvailabilityRatio	= (/ fromIntegral Temporal.Day.nDaysPerWeek) . fromIntegral . countDaysPerWeekAvailable++-- | Returns the /day/s on which both /resource/s are /available/.+findIntersection :: Availability -> Availability -> Availability+findIntersection (MkAvailability l) (MkAvailability r)	= MkAvailability $ Data.Set.intersection l r++-- | Returns the /day/s on which all the specified /resource/s are /available/.+findIntersections :: Data.Foldable.Foldable foldable => foldable Availability -> Availability+findIntersections	= Data.Foldable.foldr findIntersection fulltime++-- | Returns the /day/s on which either /resource/ is /available/.+findUnion :: Availability -> Availability -> Availability+findUnion (MkAvailability l) (MkAvailability r)	= MkAvailability $ Data.Set.union l r++-- | Returns the /day/s on which any of the specified /resource/s is /available/.+findUnions :: Data.Foldable.Foldable foldable => foldable Availability -> Availability+findUnions	= Data.Foldable.foldr findUnion unavailable++-- | True if the /resource/ is available every /day/.+isFulltime :: Availability -> Bool+isFulltime	= (== Temporal.Day.nDaysPerWeek) . Data.Set.size . deconstruct++{- |+	* 'True' is the /resource/ is available on zero /day/s.++	* CAVEAT: an 'Availability' which is completely un/available/, can't be constructed by 'mkAvailability', but it can result from 'findIntersection'.+-}+isUnavailable :: Availability -> Bool+isUnavailable	= Data.Set.null . deconstruct++-- | True if the unspecified /resource/ is available on the specified /day/.+isAvailableOn :: Temporal.Day.Day -> Availability -> Bool+isAvailableOn day	= (day `Data.Set.member`) . deconstruct+
+ src-lib/WeekDaze/Temporal/Day.hs view
@@ -0,0 +1,116 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines the days of the week.++	* This is required to define the day of a /booking/ in the timetable.++	* Day/Time modules may already exist in the Haskell-platform's standard library,+	but since no account of; time-zones, locales, or leap-years, is required, they're undoubtedly over-engineered for the requirement.+-}++module WeekDaze.Temporal.Day(+-- * Types+-- ** Type-synonyms+	Weekend,+-- ** Data-types+	Day(),+-- * Constants+	tag,+	nDaysPerWeek,+	range,+-- * Functions+	getYesterday,+	getTomorrow,+	getAdjacentDays+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Array.IArray+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema+import qualified	WeekDaze.Size			as Size++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue Day {-multi-parameter type-class-} where+	safeConvert	= fmap read . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify SQL & XML.+tag :: String+tag	= "day"++-- | Defines the days of the working-week.+data Day	= Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday	deriving (+	Data.Array.IArray.Ix,+	Bounded,+	Enum,+	Eq,+	Ord,+	Read,+	Show+ )++instance Text.XHtml.Strict.HTML Day where+	toHtml	= Text.XHtml.Strict.toHtml . show++instance HXT.XmlPickler Day where+	xpickle	= HXT.xpElem tag . HXT.xpAttr "value" . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show range++instance Control.DeepSeq.NFData Day where+	rnf _	= ()++-- | Like 'pred', but treats the enumerable type as a circular list.+getYesterday :: Day -> Day+getYesterday day+	| day == minBound	= maxBound+	| otherwise		= pred day++-- | Like 'succ', but treats the enumerable type as a circular list.+getTomorrow :: Day -> Day+getTomorrow day+	| day == maxBound	= minBound+	| otherwise		= succ day++-- | Returns yesterday & tomorrow.+getAdjacentDays :: Day -> (Day, Day)+getAdjacentDays	= getYesterday &&& getTomorrow++-- | The constant number of days in a week.+nDaysPerWeek :: Size.NDays+nDaysPerWeek	= succ {-fence-post-} $ fromEnum (maxBound :: Day) - fromEnum (minBound :: Day)++-- | The constant complete range of values.+range :: [Day]+range	= [minBound .. maxBound]++-- | Contains all days generally considered to be work-days rather than weekend.+type Weekend	= Data.Set.Set Day+
+ src-lib/WeekDaze/Temporal/FreePeriodPreference.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE CPP, MultiParamTypeClasses #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Defines a preference, for the position within in a day, of any free-periods.++	* This might allow a /teacher/ to perform non-teaching tasks at home, prior to arrival at, or after departure from, the school.+-}++module WeekDaze.Temporal.FreePeriodPreference(+-- * Types+-- ** Data-types+	FreePeriodPreference(..),+-- * Constants+	tag+) where++import qualified	Control.DeepSeq+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	Text.XML.HXT.Arrow.Pickle.Schema++#ifdef USE_HDBC+import qualified	Data.Convertible+import qualified	Database.HDBC++instance Data.Convertible.Convertible Database.HDBC.SqlValue FreePeriodPreference {-multi-parameter type-class-} where+	safeConvert	= fmap read . Data.Convertible.safeConvert+#endif /* USE_HDBC */++-- | Used to qualify SQL & XML.+tag :: String+tag	= "freePeriodPreference"++-- | The human-resource's preference for the position of unallocated /time-slot/s, within any working /day/.+data FreePeriodPreference+	= Pre		-- ^ A preference for unallocated /time-slot/s to precede the first allocated /lesson/ of the day.+	| Post		-- ^ A preference for unallocated /time-slot/s to follow the last allocated /lesson/ of the day.+	| Terminal	-- ^ A preference for unallocated /time-slot/s to either precede the first or follow the last, /lesson/ of the day.+	deriving (Bounded, Enum, Eq, Ord, Read, Show)++instance HXT.XmlPickler FreePeriodPreference where+--	xpickle	= HXT.xpAttr tag HXT.xpPrim+	xpickle	= HXT.xpAttr tag . HXT.xpWrap (read, show) . HXT.xpTextDT . Text.XML.HXT.Arrow.Pickle.Schema.scEnum $ map show [minBound :: FreePeriodPreference .. maxBound]	-- There can only ever be one preference, so it can reasonably be assumed to be an attribute.++instance Control.DeepSeq.NFData FreePeriodPreference where+	rnf _	= ()+
+ src-lib/WeekDaze/Temporal/Time.hs view
@@ -0,0 +1,167 @@+{-# LANGUAGE CPP, FlexibleContexts #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* The time-slot within any /day/ is identified by an abstract enumerable type, & is therefore only loosely related to time;+	i.e. in this representation, one would specify the first or perhaps the last /time-slot/, rather than booking for say exactly /9:30/.++	* The actual time can only be derived from the /time-slot/,+	using knowlege of the time at which the working-day began, & of the constant duration of each time-slot;+	but it's irrelevant to the scheduling-task.++	* Because no absolute time is associated with specific /time-slot/s within a /day/,+	/lunch-time/ merely exists invisibly between two time-slots, & plays no part in the scheduling.++	* The /day/ & the abstract identifier of the /time-slot/ within that day,+	together define the coordinates of a specific /time-slot/ in the timetable.++	* Day/Time modules may already exist in the Haskell-platform's standard library,+	but since no account of; time-zones, locales, or leap-years, is required, they're undoubtedly over-engineered for the requirement.+-}++module WeekDaze.Temporal.Time(+-- * Types+-- ** Type-synonyms+	TimeSet,+	TimesByDay,+-- ** Data-types+	Time(+--		MkTime,+		getDay,+		getTimeslotId+	),+-- * Constants+--	tag,+-- * Functions+	calculateNTimeslotsPerWeek,+	calculateDistance,+	calculateAbsoluteDistance,+	categoriseByDay,+	shift,+	shiftTime,+-- ** Constructors+#ifdef USE_HDBC+	mkTimeFromSql,+#endif+	mkTime+) where++import qualified	Control.Arrow+import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Map+import qualified	Data.Set+import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((+++))+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Day		as Temporal.Day++#ifdef USE_HDBC+import qualified	Database.HDBC+import qualified	Data.Convertible+import qualified	WeekDaze.Database.Selector	as Database.Selector++-- | Construct from database-values.+mkTimeFromSql+	:: Data.Convertible.Convertible Database.HDBC.SqlValue timeslotId	-- Flexible context.+	=> Database.HDBC.SqlValue	-- ^ Day.+	-> Database.HDBC.SqlValue	-- ^ timeslotId.+	-> Time timeslotId+mkTimeFromSql daySql	= mkTime (+	either (+		error . showString "WeekDaze.Temporal.Time.mkTimeFromSql:\tfailed to parse the value for " . shows Temporal.Day.tag . showString " read from the database; " . show+	) id $ Database.HDBC.safeFromSql daySql+ ) . either (+	error . showString "WeekDaze.Temporal.Time.mkTimeFromSql:\tfailed to parse the value for " . shows Database.Selector.timeslotIdColumnName . showString " read from the database; " . show+ ) id . Database.HDBC.safeFromSql+#endif /* USE_HDBC */++-- | Defines the coordinates of specific /time-slot/, within a given week.+data Time timeslotId	= MkTime {+	getDay		:: Temporal.Day.Day,	-- ^ Accessor.+	getTimeslotId	:: timeslotId		-- ^ Accessor.+} deriving (Eq, Ord)++instance Control.DeepSeq.NFData	timeslotId => Control.DeepSeq.NFData (Time timeslotId) where+	rnf	= Control.DeepSeq.rnf . (getDay &&& getTimeslotId)++-- | Constructor.+mkTime :: Temporal.Day.Day -> timeslotId -> Time timeslotId+mkTime	= MkTime++-- | Used to qualify XML.+tag :: String+tag	= "time"++instance Read timeslotId => Read (Time timeslotId) where+	readsPrec _	= map (Control.Arrow.first $ uncurry MkTime) . reads++instance Show timeslotId => Show (Time timeslotId) where+	showsPrec _	= shows . (getDay &&& getTimeslotId)	-- Hides the data-constructor & accessors.++instance Text.XHtml.Strict.HTML timeslotId => Text.XHtml.Strict.HTML (Time timeslotId) where+	toHtml time	= getDay time +++ Text.XHtml.Strict.spaceHtml +++ getTimeslotId time++instance HXT.XmlPickler timeslotId => HXT.XmlPickler (Time timeslotId) where+	xpickle	= HXT.xpElem tag $ HXT.xpWrap (+		uncurry MkTime,			-- Construct from a Pair.+		getDay &&& getTimeslotId	-- Deconstruct to a Pair.+	 ) HXT.xpickle {-Pair-}++-- | Calculates the number of /time-slot/s in a week, when provided by the number of /time-slot/s per /day/.+calculateNTimeslotsPerWeek :: Size.NTimeslots -> Size.NTimeslots+calculateNTimeslotsPerWeek	= (Temporal.Day.nDaysPerWeek *)++-- | The signed distance between /time-slots/.+calculateDistance :: Enum timeslotId => timeslotId -> timeslotId -> Size.NTimeslots+calculateDistance x y	= fromEnum x - fromEnum y++-- | The absolute distance between /time-slots/.+calculateAbsoluteDistance :: Enum timeslotId => timeslotId -> timeslotId -> Size.NTimeslots+calculateAbsoluteDistance x y	= abs $ calculateDistance x y++-- | Shift the /time-slot/ by the specified number of places.+shift :: Enum timeslotId => Size.NTimeslots -> timeslotId -> timeslotId+shift i	= toEnum . (+ i) . fromEnum++-- | Shift the /time/ by the specified number of /time-slot/s.+shiftTime :: Enum timeslotId => Size.NTimeslots -> Time timeslotId -> Time timeslotId+shiftTime i	= uncurry MkTime . (getDay &&& shift i . getTimeslotId)++-- | An arbitrary set of /Time/s.+type TimeSet timeslotId	= Data.Set.Set (Time timeslotId)++-- | Arbitrary /time/s, categorised by /day/.+type TimesByDay timeslotId	= Data.Map.Map Temporal.Day.Day (Data.Set.Set timeslotId)++{- |+	* Categorise the specified times, according to their /day/.++	* CAVEAT: some /day/s have zero meetings, & therefore don't have a key in the resulting map.+-}+categoriseByDay :: Ord timeslotId => TimeSet timeslotId -> TimesByDay timeslotId+categoriseByDay	= Data.Set.foldr (+	uncurry (Data.Map.insertWith Data.Set.union) . (getDay &&& Data.Set.singleton . getTimeslotId)+ ) Data.Map.empty+
+ src-lib/WeekDaze/Temporal/TimeAxes.hs view
@@ -0,0 +1,77 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++-}++module WeekDaze.Temporal.TimeAxes(+-- * Types+-- ** Data-types+	TimeAxes(+--		MkTimeAxes,+		getByDay,+		getByTimeslotId+	),+-- * Constants+--	tag,+--	dayTag,+--	byTimeslotIdTag,+-- * Functions+-- ** Constructor+	mkTimeAxes+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT++-- | Defines a concept over the two Cartesian axes used to graph it by /time/.+data TimeAxes a = MkTimeAxes {+	getByDay	:: a,	-- ^ Accessor.+	getByTimeslotId	:: a	-- ^ Accessor.+} deriving (Eq, Show)++-- | Constructor.+mkTimeAxes :: a -> a -> TimeAxes a+mkTimeAxes	= MkTimeAxes++-- | Used to qualify XML.+tag :: String+tag		= "timeAxes"++-- | Used to qualify XML.+byDayTag :: String+byDayTag	= "byDay"++-- | Used to qualify XML.+byTimeslotIdTag :: String+byTimeslotIdTag	= "byTimeslotId"++instance HXT.XmlPickler a => HXT.XmlPickler (TimeAxes a) where+	xpickle	= HXT.xpElem tag . HXT.xpWrap (+		uncurry MkTimeAxes,		-- Construct from a Pair.+		getByDay &&& getByTimeslotId	-- Deconstruct to a Pair.+	 ) $ HXT.xpAttr byDayTag HXT.xpickle {-Bool-} `HXT.xpPair` HXT.xpAttr byTimeslotIdTag HXT.xpickle {-Bool-}++instance Control.DeepSeq.NFData	a => Control.DeepSeq.NFData (TimeAxes a) where+	rnf	= Control.DeepSeq.rnf . (getByDay &&& getByTimeslotId)+
+ src-lib/WeekDaze/Temporal/TimeslotRequest.hs view
@@ -0,0 +1,198 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Either the ideal /time-slot/ in any /day/, or the specific set of /time/s in each week, at which to book a /lesson/ of a /course/.++	* One may for example;+	prefer to teach a demanding /course/ early, when concentration is relatively high;+	avoid swimming immediately after lunch;+	book games in a consecutive sequence of time-slots, during the afternoon.++	* If there are fewer specified /time/s, than there are /lesson/s required per week for the /course/,+	then the remainder are booked at arbitrary times.+-}++module WeekDaze.Temporal.TimeslotRequest(+-- * Types+-- ** Data-types+	TimeslotRequest(..),+-- * Constants+--	tag,+--	ideallyTag,+	specificallyTag,+-- * Functions+	countSpecifiedTimes,+	countSpecifiedDays,+	getMaybeIdealTimeslotId,+	getSpecifiedTimes,+--	groupSpecifiedTimesByDay,+	findDistinctRunlengthsOfSpecifiedTimes,+-- ** Predicates+	isIdeally,+	isSpecific,+	isNull,+	isASpecifiedTime,+	isASpecifiedDay+) where++import			Control.Arrow((&&&))+import qualified	Control.DeepSeq+import qualified	Data.Default+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Set+import qualified	Text.XML.HXT.Arrow.Pickle	as HXT+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.List.Runlength+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Day		as Temporal.Day+import qualified	WeekDaze.Temporal.Time		as Temporal.Time++-- | Used to qualify Output & XML.+tag :: String+tag		= "timeslotRequest"++-- | Used to qualify Output & XML.+ideallyTag :: String+ideallyTag	= "ideally"++-- | Used to qualify Output & XML.+specificallyTag :: String+specificallyTag	= "specifically"++-- | Defines the /ideal time-slot/ on any /day/, or the specific /time/s in each week, at which to book a /lesson/ of a specific /course/.+data TimeslotRequest timeslotId+	= Ideally timeslotId					-- ^ Book as close to the specified /time-slot/ as possible, but on an arbitrary /day/.+	| Specifically (Temporal.Time.TimeSet timeslotId)	-- ^ Book at the specified /time/s in each week; any remaining /lesson/ required for the /course/ are booked at arbitrary /time/s.+	deriving (Eq, Ord)++instance Show timeslotId => Show (TimeslotRequest timeslotId) where+	showsPrec _ timeslotRequest	= showString (tag ++ "={") . (+		case timeslotRequest of+			Ideally timeslotId	-> showString ideallyTag . showChar '=' . shows timeslotId+			Specifically timeSet	-> showString specificallyTag . showChar '=' . shows (Data.Set.toList timeSet)+	 ) . showChar '}'++instance Data.Default.Default (TimeslotRequest timeslotId) where+	def	= Specifically Data.Set.empty++instance (HXT.XmlPickler timeslotId, Ord timeslotId) => HXT.XmlPickler (TimeslotRequest timeslotId) where+	xpickle	= HXT.xpDefault Data.Default.def . HXT.xpElem tag $ HXT.xpAlt (+		\timeslotRequest -> if isIdeally timeslotRequest then 0 else 1	-- Lookup the appropriate pickler in the list below.+	 ) [+		HXT.xpElem ideallyTag $ HXT.xpWrap (+			Ideally,				-- Construct from a timeslotId.+			\(Ideally timeslotId)	-> timeslotId	-- Deconstruct to a timeslotId.+		) HXT.xpickle,+		HXT.xpElem specificallyTag . HXT.xpWrap (+			Specifically . Data.Set.fromList,	-- Construct from a list of Times.+			Data.Set.toList . getSpecifiedTimes	-- Deconstruct to a list of Times.+		) $ HXT.xpList1 {-can't be null-} HXT.xpickle {-Time-}+	 ]++instance Control.DeepSeq.NFData timeslotId => Control.DeepSeq.NFData (TimeslotRequest timeslotId) where+	rnf (Specifically timeSet)	= Control.DeepSeq.rnf timeSet+	rnf _				= ()++-- | Accessor, which returns a default value for data constructed by 'Specifically'.+getMaybeIdealTimeslotId :: TimeslotRequest timeslotId -> Maybe timeslotId+getMaybeIdealTimeslotId (Ideally timeslotId)	= Just timeslotId+getMaybeIdealTimeslotId _			= Nothing++-- | Accessor, which returns a default value for data constructed by 'Ideally'.+getSpecifiedTimes :: TimeslotRequest timeslotId -> Temporal.Time.TimeSet timeslotId+getSpecifiedTimes (Specifically timeSet)	= timeSet+getSpecifiedTimes _				= Data.Set.empty++-- | Counts the number of specified /time/s.+countSpecifiedTimes :: TimeslotRequest timeslotId -> Size.NTimeslots+countSpecifiedTimes	= Data.Set.size . getSpecifiedTimes++-- | Counts the number of discrete /day/s specified.+countSpecifiedDays ::+#if !MIN_VERSION_containers(0,5,2)+	Ord timeslotId =>	-- Not required after "Data.Set-7.8.1".+#endif+	TimeslotRequest timeslotId -> Size.NDays+countSpecifiedDays	= Data.Set.size . Data.Set.map Temporal.Time.getDay . getSpecifiedTimes++-- | True when the /timeslot-request/ was constructed by 'Ideally'.+isIdeally :: TimeslotRequest timeslotId -> Bool+isIdeally (Ideally _)	= True+isIdeally _		= False++{- |+	* True when the /timeslot-request/ was constructed by 'Specifically'++	* CAVEAT: the set of specified /time/s may still be null.+-}+isSpecific :: TimeslotRequest timeslotId -> Bool+isSpecific (Specifically _)	= True+isSpecific _			= False++{- |+	* True if there are zero specified /time/s.++	* CAVEAT: an /ideal time-slot/ may still have been defined.+-}+isNull :: TimeslotRequest timeslotId -> Bool+isNull	= Data.Set.null . getSpecifiedTimes++-- | True if the specified /time/ is one of those requested.+isASpecifiedTime :: Ord timeslotId => Temporal.Time.Time timeslotId -> TimeslotRequest timeslotId -> Bool+isASpecifiedTime time (Specifically timeSet)	= Data.Set.member time timeSet+isASpecifiedTime _ _				= False++-- | True if one of the specified /time/s falls on the specified /day/.+isASpecifiedDay :: Temporal.Day.Day -> TimeslotRequest timeslotId -> Bool+isASpecifiedDay day (Specifically timeSet)	= Data.Foldable.any ((== day) . Temporal.Time.getDay) timeSet+isASpecifiedDay _ _				= False++{- |+	* The ascending list of specified /time/s, for each /day/.++	* CAVEAT: the specific /day/ is dropped from the results,+	& the results don't include those days on which there're zero /timeslot-requests/.+-}+groupSpecifiedTimesByDay :: TimeslotRequest timeslotId -> [[Temporal.Time.Time timeslotId]]+groupSpecifiedTimesByDay	= Data.List.groupBy (ToolShed.Data.List.equalityBy Temporal.Time.getDay) . Data.Set.toAscList . getSpecifiedTimes++-- | Find the set of distinct run-lengths of consecutive specified /time/s, occuring within any single /day/.+findDistinctRunlengthsOfSpecifiedTimes :: Enum timeslotId => TimeslotRequest timeslotId -> Data.Set.Set Size.NTimeslots+findDistinctRunlengthsOfSpecifiedTimes	= Data.Set.fromList . concatMap (+	map (+		succ {-fence-post-} . ToolShed.Data.List.Runlength.getLength+	) . filter ToolShed.Data.List.Runlength.getDatum {-Bool-} . ToolShed.Data.List.Runlength.encode . map (+		== 1	-- Only true for consecutive timeslot-requests.+	) . (+		uncurry (+			zipWith (-)+		) . (+			tail &&& id+		) -- Find the difference between adjacent timeslot-requests.+	) . map (+		fromEnum . Temporal.Time.getTimeslotId	-- Required in order to find the distance between time-slots.+	)+ ) . groupSpecifiedTimesByDay+
+ src-lib/WeekDaze/Temporal/Workload.hs view
@@ -0,0 +1,62 @@+{-+	Copyright (C) 2013 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Bounds the minimum & maximum workload of an individual, measured in terms of a number of /time-slot/s.+-}++module WeekDaze.Temporal.Workload(+-- * Types+-- ** Type-synonyms+	Bounds,+-- * Constants+	unloaded,+-- * Functions+-- ** Accessors+	getMinimum,+	getMaximum,+-- ** Operators+	(<+>)+) where++import			Control.Arrow((***))+import qualified	WeekDaze.Size	as Size++infixl 6 <+>	-- Same as (+).++-- | The minimum & maximum duration, in /time-slot/s.+type Bounds	= (Size.NTimeslots, Size.NTimeslots)++-- | The origin.+unloaded :: Bounds+unloaded	= (0, 0)++-- | Accessor.+getMinimum :: Bounds -> Size.NTimeslots+getMinimum	= fst++-- | Accessor.+getMaximum :: Bounds -> Size.NTimeslots+getMaximum	= snd++-- | Add the specified /bounds/.+(<+>) :: Bounds -> Bounds -> Bounds+(<+>)	= uncurry (***) . ((+) *** (+))	-- Independently add the two minima, & the two maxima.+
+ src-lib/WeekDaze/Text/CSS.hs view
@@ -0,0 +1,116 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Exports labels used to name CSS-classes, & functions to encode arbitrary CSS-identifiers.+-}++module WeekDaze.Text.CSS(+-- * Types+-- ** Type-synonyms+	CSSIdentifier,+-- * Constants+	boxCSSIdentifier,+	cssSuffix,+	consoleOutputCSSIdentifier,+	dataCSSIdentifier,+	numericDataCSSIdentifier,+	infoCSSIdentifier,+	warningCSSIdentifier,+	observerSummaryCSSIdentifier,+	timetableViewCSSIdentifier,+--	validIdentifierCharacterSet,+-- * Functions+-- ** Constructor+	mkIdentifier+) where++import qualified	Data.Char+import qualified	Data.Set+import qualified	System.FilePath++-- | The suffix used for CSS-files.+cssSuffix :: System.FilePath.FilePath+cssSuffix	= "css"++-- | Merely aids self-documentation.+type CSSIdentifier	= String++-- | A CSS class-label, for an HTML /box/.+boxCSSIdentifier :: CSSIdentifier+boxCSSIdentifier		= "box"++-- | A CSS class-label, denoting console-output.+consoleOutputCSSIdentifier :: CSSIdentifier+consoleOutputCSSIdentifier	= "consoleOutput"++-- | A CSS class-label, for arbitrary data.+dataCSSIdentifier :: CSSIdentifier+dataCSSIdentifier		= "data"++-- | A CSS class-label, for arbitrary data.+numericDataCSSIdentifier :: CSSIdentifier+numericDataCSSIdentifier	= "numericData"++-- | A CSS class-label, denoting some form of informative message.+infoCSSIdentifier :: CSSIdentifier+infoCSSIdentifier		= "info"++-- | A CSS class-label, denoting some form of warning message.+warningCSSIdentifier :: CSSIdentifier+warningCSSIdentifier		= "warning"++-- | A CSS class-label, for the individual /timetable/ for a week, as seen by some observer.+observerSummaryCSSIdentifier :: CSSIdentifier+observerSummaryCSSIdentifier	= "observerSummary"++-- | A CSS class-label, for a view of a /timetable/ for the week.+timetableViewCSSIdentifier :: CSSIdentifier+timetableViewCSSIdentifier	= "timetableView"++{- |+	* An identifier in CSS, can only be composed from a restricted character-set.++	* CAVEAT: valid HTML-identifiers also include ':' & '.'.+-}+validIdentifierCharacterSet :: Data.Set.Set Char+validIdentifierCharacterSet	= Data.Set.unions [+	Data.Set.fromDistinctAscList ['a' .. 'z'],+	Data.Set.fromDistinctAscList ['A' .. 'Z'],+	Data.Set.fromDistinctAscList ['0' .. '9'],+	Data.Set.fromList "-_"+ ]++{- |+	* Normalises an arbitrary string into a valid CSS-identifier.++	* <http://www.w3.org/TR/CSS2/syndata.html#characters>+-}+mkIdentifier :: String -> CSSIdentifier+mkIdentifier s	= removeIllegalPrefix $ filter (`Data.Set.member` validIdentifierCharacterSet) s where+	removeIllegalPrefix :: String -> String+	removeIllegalPrefix ('-' : s'@('-' : _))	= removeIllegalPrefix {-recurse-} s'	-- It can't start with a double hyphen.+	removeIllegalPrefix s'@('-' : (x : xs))+		| Data.Char.isDigit x	= removeIllegalPrefix {-recurse-} xs			-- It can't start with either, a hyphen followed by a digit, or with a digit.+		| otherwise		= s'							-- Terminate.+	removeIllegalPrefix s'@(x : xs)+		| Data.Char.isDigit x	= removeIllegalPrefix {-recurse-} xs			-- It can't start with a digit.+		| otherwise		= s'							-- Terminate.+	removeIllegalPrefix []				= error $ "WeekDaze.Text.CSS.mkIdentifier:\tnormalisation of '" ++ s ++ "', resulted in a null string."
+ src-lib/WeekDaze/Text/XHTML.hs view
@@ -0,0 +1,73 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* Declares an 'Int'-instance for XHTML.+	* Exports some convenience-functions for XHTML.+-}++module WeekDaze.Text.XHTML(+-- * Constants+--	showHideButtonCSSIdentifier,+-- * Functions+	mkShowHideButton,+	mkXHTMLDiv,+	mkXHTMLSpan+) where++import qualified	Text.XHtml.Strict+import			Text.XHtml.Strict((!), (<<))+import qualified	WeekDaze.Text.CSS	as Text.CSS++-- | A CSS class-label, for an HTML /button/.+showHideButtonCSSIdentifier :: Text.CSS.CSSIdentifier+showHideButtonCSSIdentifier	= "showHideButton"++instance Text.XHtml.Strict.HTML Int where+	toHtml	= Text.XHtml.Strict.toHtml . show++-- | Create a button to show/hide the specified element.+mkShowHideButton+	:: Bool				-- ^ Whether the element is initially displayed; if 'False', the caller should insert 'Text.XHtml.Strict.thestyle "display: none"' into their element.+	-> Text.CSS.CSSIdentifier	-- ^ The name of the element to show or hide.+	-> Text.XHtml.Strict.Html+mkShowHideButton displayState elementIdentifier	= Text.XHtml.Strict.button ! [+	Text.XHtml.Strict.theclass showHideButtonCSSIdentifier,+	Text.XHtml.Strict.strAttr "onclick" . showString "this.innerHTML = ((this.innerHTML !== '" . showString hideLabel . showString "') ? '" . showString hideLabel . showString "' : '" . showString showLabel . showString "'); var element = document.getElementById('" $ showString elementIdentifier "'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+ ] << (+	if displayState+		then hideLabel+		else showLabel+ ) where+	hideLabel, showLabel :: String+	hideLabel	= "Hide"+	showLabel	= "Show"++-- | Make an XHTML /div/, which labels & classifies the contents.+mkXHTMLDiv :: String -> Text.XHtml.Strict.Html -> Text.XHtml.Strict.Html+mkXHTMLDiv s	= Text.XHtml.Strict.thediv ! [Text.XHtml.Strict.theclass $ Text.CSS.mkIdentifier s, Text.XHtml.Strict.title s]++-- | Make an XHTML /span/, which labels & classifies the contents.+mkXHTMLSpan :: String -> Text.XHtml.Strict.Html -> Text.XHtml.Strict.Html+mkXHTMLSpan s	= Text.XHtml.Strict.thespan ! [Text.XHtml.Strict.theclass $ Text.CSS.mkIdentifier s, Text.XHtml.Strict.title s]+
+ src-test/Main.hs view
@@ -0,0 +1,102 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]++	* The entry-point to the application's test-suite.+-}++module Main(main) where++import qualified	Control.Monad+import qualified	System.Exit+import qualified	ToolShed.Test.QuickCheck.Result+import qualified	WeekDaze.Test.QuickCheck.Aggregate.LocationCatalogue				as Test.QuickCheck.Aggregate.LocationCatalogue+import qualified	WeekDaze.Test.QuickCheck.Aggregate.StudentBody					as Test.QuickCheck.Aggregate.StudentBody+import qualified	WeekDaze.Test.QuickCheck.Aggregate.StudentBodyRegister				as Test.QuickCheck.Aggregate.StudentBodyRegister+import qualified	WeekDaze.Test.QuickCheck.Aggregate.StudentClass					as Test.QuickCheck.Aggregate.StudentClass+import qualified	WeekDaze.Test.QuickCheck.Aggregate.TeacherRegister				as Test.QuickCheck.Aggregate.TeacherRegister+import qualified	WeekDaze.Test.QuickCheck.Colour.HTMLColour					as Test.QuickCheck.Colour.HTMLColour+import qualified	WeekDaze.Test.QuickCheck.Colour.RGB						as Test.QuickCheck.Colour.RGB+import qualified	WeekDaze.Test.QuickCheck.Data.Course						as Test.QuickCheck.Data.Course+import qualified	WeekDaze.Test.QuickCheck.Data.Location						as Test.QuickCheck.Data.Location+import qualified	WeekDaze.Test.QuickCheck.Data.Student						as Test.QuickCheck.Data.Student+import qualified	WeekDaze.Test.QuickCheck.Data.Subject						as Test.QuickCheck.Data.Subject+import qualified	WeekDaze.Test.QuickCheck.Data.Teacher						as Test.QuickCheck.Data.Teacher+import qualified	WeekDaze.Test.QuickCheck.ExecutionConfiguration.Criterion			as Test.QuickCheck.ExecutionConfiguration.Criterion+import qualified	WeekDaze.Test.QuickCheck.ExecutionConfiguration.OptimiseLessonCriteriaWeights	as Test.QuickCheck.ExecutionConfiguration.OptimiseLessonCriteriaWeights+import qualified	WeekDaze.Test.QuickCheck.Identifiers.Campus					as Test.QuickCheck.Identifiers.Campus+import qualified	WeekDaze.Test.QuickCheck.Identifiers.Level					as Test.QuickCheck.Identifiers.Level+import qualified	WeekDaze.Test.QuickCheck.Identifiers.LocationId					as Test.QuickCheck.Identifiers.LocationId+import qualified	WeekDaze.Test.QuickCheck.Identifiers.TeacherId					as Test.QuickCheck.Identifiers.TeacherId+import qualified	WeekDaze.Test.QuickCheck.Identifiers.TimeslotId					as Test.QuickCheck.Identifiers.TimeslotId+import qualified	WeekDaze.Test.QuickCheck.Input.ConfigVersion					as Test.QuickCheck.Input.ConfigVersion+import qualified	WeekDaze.Test.QuickCheck.Model.TimetableAxis					as Test.QuickCheck.Model.TimetableAxis+import qualified	WeekDaze.Test.QuickCheck.Model.TimetableAxisTraversal				as Test.QuickCheck.Model.TimetableAxisTraversal+import qualified	WeekDaze.Test.QuickCheck.Model.TimetableAxisTriple				as Test.QuickCheck.Model.TimetableAxisTriple+import qualified	WeekDaze.Test.QuickCheck.StudentView.Lesson					as Test.QuickCheck.StudentView.Lesson+import qualified	WeekDaze.Test.QuickCheck.StudentView.Timetable					as Test.QuickCheck.StudentView.Timetable+import qualified	WeekDaze.Test.QuickCheck.StudentView.TimetableForDay				as Test.QuickCheck.StudentView.TimetableForDay+import qualified	WeekDaze.Test.QuickCheck.StudentView.TimetableForWeek				as Test.QuickCheck.StudentView.TimetableForWeek+import qualified	WeekDaze.Test.QuickCheck.Temporal.Availability					as Test.QuickCheck.Temporal.Availability+import qualified	WeekDaze.Test.QuickCheck.Temporal.Day						as Test.QuickCheck.Temporal.Day+import qualified	WeekDaze.Test.QuickCheck.Temporal.Time						as Test.QuickCheck.Temporal.Time+import qualified	WeekDaze.Test.QuickCheck.Temporal.TimeslotRequest				as Test.QuickCheck.Temporal.TimeslotRequest+import			WeekDaze.Test.QuickCheck.Input.Options()	-- Merely to force compilation.++-- | Entry-point.+main :: IO ()+main	= mapM_ (+	(`Control.Monad.unless` System.Exit.exitFailure) . all ToolShed.Test.QuickCheck.Result.isSuccessful =<<+ ) [+	Test.QuickCheck.Aggregate.LocationCatalogue.results,+	Test.QuickCheck.Aggregate.StudentBodyRegister.results,+	Test.QuickCheck.Aggregate.StudentBody.results,+	Test.QuickCheck.Aggregate.StudentClass.results,+	Test.QuickCheck.Aggregate.TeacherRegister.results,+	Test.QuickCheck.Colour.HTMLColour.results,+	Test.QuickCheck.Colour.RGB.results,+	Test.QuickCheck.Data.Course.results,+	Test.QuickCheck.Data.Location.results,+	Test.QuickCheck.Data.Student.results,+	Test.QuickCheck.Data.Subject.results,+	Test.QuickCheck.Data.Teacher.results,+	Test.QuickCheck.ExecutionConfiguration.Criterion.results,+	Test.QuickCheck.ExecutionConfiguration.OptimiseLessonCriteriaWeights.results,+	Test.QuickCheck.Identifiers.Campus.results,+	Test.QuickCheck.Identifiers.Level.results,+	Test.QuickCheck.Identifiers.LocationId.results,+	Test.QuickCheck.Identifiers.TeacherId.results,+	Test.QuickCheck.Identifiers.TimeslotId.results,+	Test.QuickCheck.Input.ConfigVersion.results,+	Test.QuickCheck.Model.TimetableAxis.results,+	Test.QuickCheck.Model.TimetableAxisTraversal.results,+	Test.QuickCheck.Model.TimetableAxisTriple.results,+	Test.QuickCheck.StudentView.Lesson.results,+	Test.QuickCheck.StudentView.TimetableForDay.results,+	Test.QuickCheck.StudentView.TimetableForWeek.results,+	Test.QuickCheck.StudentView.Timetable.results,+	Test.QuickCheck.Temporal.Availability.results,+	Test.QuickCheck.Temporal.Day.results,+	Test.QuickCheck.Temporal.TimeslotRequest.results,+	Test.QuickCheck.Temporal.Time.results+ ]+
+ src-test/WeekDaze/Test/QuickCheck/Aggregate/LocationCatalogue.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Aggregate.LocationCatalogue.LocationCatalogue'.+-}++module WeekDaze.Test.QuickCheck.Aggregate.LocationCatalogue(+-- * Constants+	results+) where++import qualified	Data.Map+import qualified	Data.Foldable+import qualified	Test.QuickCheck+import qualified	WeekDaze.Aggregate.LocationCatalogue	as Aggregate.LocationCatalogue+import qualified	WeekDaze.Data.Location			as Data.Location+import qualified	WeekDaze.Identifiers.Campus		as Identifiers.Campus+import qualified	WeekDaze.Identifiers.LocationId		as Identifiers.LocationId+import qualified	WeekDaze.Size				as Size+import			WeekDaze.Test.QuickCheck.Identifiers.LocationId()+import			WeekDaze.Test.QuickCheck.Data.Location()++#if !MIN_VERSION_QuickCheck(2,8,2)+import			ToolShed.Test.QuickCheck.Arbitrary.Map()+#endif++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_findSuitableLocations, prop_countDaysByFacilityName, prop_extractDistinctFacilityNames] where+	prop_findSuitableLocations, prop_countDaysByFacilityName, prop_extractDistinctFacilityNames :: Aggregate.LocationCatalogue.LocationCatalogue Identifiers.LocationId.LocationId Identifiers.Campus.Campus -> Test.QuickCheck.Property+	prop_findSuitableLocations locationCatalogue	= Test.QuickCheck.label "prop_findSuitableLocations" $ Data.Foldable.all (+		\profile -> not . Data.Map.null $ Aggregate.LocationCatalogue.findSuitableLocations (+			Data.Location.getCapacity profile+		) (+			Data.Location.getFacilityNames profile+		) locationCatalogue+	 ) locationCatalogue++	prop_countDaysByFacilityName	= Test.QuickCheck.label "prop_countDaysByFacilityName" . Data.Foldable.all (>= (1 :: Size.NDays)) . Aggregate.LocationCatalogue.countDaysByFacilityName++	prop_extractDistinctFacilityNames locationCatalogue	= Test.QuickCheck.label "prop_extractDistinctFacilityNames" $ Aggregate.LocationCatalogue.extractDistinctFacilityNames locationCatalogue == Data.Map.keysSet (Aggregate.LocationCatalogue.countDaysByFacilityName locationCatalogue)+
+ src-test/WeekDaze/Test/QuickCheck/Aggregate/StudentBody.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Aggregate.StudentBody.StudentBody'.+-}++module WeekDaze.Test.QuickCheck.Aggregate.StudentBody(+-- * Constants+	results+) where++import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Aggregate.StudentBody	as Aggregate.StudentBody++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance Test.QuickCheck.Arbitrary Aggregate.StudentBody.StudentBody where+	arbitrary	= Aggregate.StudentBody.mkStudentBody <$> (+		('m' :) . show <$> Test.QuickCheck.elements [0 :: Int .. 9]	-- Mnemonic.+	 ) <*> (+		Data.Set.fromList . map (('s' :) . show :: Int -> String) <$> (Test.QuickCheck.elements [1 .. 10 {-arbitrarily-}] >>= Test.QuickCheck.vector)	-- Student-Ids.+	 )++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Aggregate.StudentBody.StudentBody -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Aggregate.StudentBody.StudentBody, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Aggregate.StudentBody.StudentBody -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage studentBody	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) studentBody+
+ src-test/WeekDaze/Test/QuickCheck/Aggregate/StudentBodyRegister.hs view
@@ -0,0 +1,71 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Aggregate.StudentBodyRegister.StudentBodyRegister'.+-}++module WeekDaze.Test.QuickCheck.Aggregate.StudentBodyRegister(+-- * Types+-- ** Type-synonyms+	StudentBodyRegister,+-- * Constants+	results+) where++import qualified	Data.Map+import qualified	Test.QuickCheck+import qualified	WeekDaze.Aggregate.StudentBodyRegister	as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Data.Student			as Data.Student+import qualified	WeekDaze.Identifiers.Level		as Identifiers.Level+import qualified	WeekDaze.Identifiers.Stream		as Identifiers.Stream+import			WeekDaze.Test.QuickCheck.Aggregate.StudentBody()+import qualified	WeekDaze.Test.QuickCheck.Data.Student	as Test.Data.Student++#if !MIN_VERSION_QuickCheck(2,8,2)+import			ToolShed.Test.QuickCheck.Arbitrary.Map()+#endif++-- | Defines a concrete type for testing.+type StudentBodyRegister	= Aggregate.StudentBodyRegister.StudentBodyRegister Identifiers.Level.Level Identifiers.Stream.Stream Test.Data.Student.TeachingRatio++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_getSize, prop_countAvailableStudentDays, prop_countSubjectsRequired] where+	mnemonicSeparator :: Aggregate.StudentClass.MnemonicSeparator+	mnemonicSeparator	= " / "++	prop_getSize, prop_countAvailableStudentDays, prop_countSubjectsRequired :: StudentBodyRegister -> Test.QuickCheck.Property+	prop_getSize studentBodyRegister	= Test.QuickCheck.label "prop_getSize" $ Data.Map.size (Aggregate.StudentBodyRegister.reduce' mnemonicSeparator studentBodyRegister) <= Data.Map.size studentBodyRegister++	prop_countAvailableStudentDays studentBodyRegister	= Test.QuickCheck.label "prop_countAvailableStudentDays" $ Aggregate.StudentBodyRegister.countAvailableStudentDays (+		Aggregate.StudentBodyRegister.reduce' mnemonicSeparator studentBodyRegister+	 ) == Aggregate.StudentBodyRegister.countAvailableStudentDays studentBodyRegister++	prop_countSubjectsRequired studentBodyRegister	= Test.QuickCheck.label "prop_countSubjectsRequired" $ Aggregate.StudentBodyRegister.countSubjectsRequired (+		Data.Map.map Data.Student.deriveAmalgamatedKnowledgeRequirement $ Aggregate.StudentBodyRegister.reduce' mnemonicSeparator studentBodyRegister+	 ) == Aggregate.StudentBodyRegister.countSubjectsRequired (+		Data.Map.map Data.Student.deriveAmalgamatedKnowledgeRequirement studentBodyRegister+	 )+
+ src-test/WeekDaze/Test/QuickCheck/Aggregate/StudentClass.hs view
@@ -0,0 +1,45 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Aggregate.StudentClass.StudentClass'.+-}++module WeekDaze.Test.QuickCheck.Aggregate.StudentClass(+-- * Constants+	results+) where++import qualified	Data.Set+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))+import			ToolShed.Test.QuickCheck.Arbitrary.Set()+import qualified	WeekDaze.Aggregate.StudentBody	as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentClass	as Aggregate.StudentClass+import			WeekDaze.Test.QuickCheck.Aggregate.StudentBody()++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_merge] where+	prop_merge :: Aggregate.StudentClass.StudentClass -> Test.QuickCheck.Property+	prop_merge studentClass		= not (Data.Set.null studentClass) ==> Test.QuickCheck.label "prop_merge" $ Aggregate.StudentBody.getSize (Aggregate.StudentClass.merge " / " studentClass) <= Aggregate.StudentClass.getSize studentClass -- The test-data could contain one student in more than one student-body.+
+ src-test/WeekDaze/Test/QuickCheck/Aggregate/TeacherRegister.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Aggregate.TeacherRegister.TeacherRegister'.+-}++module WeekDaze.Test.QuickCheck.Aggregate.TeacherRegister(+-- * Types+-- ** Type-synonyms+--	TeacherRegister,+-- * Constants+	results+) where++import qualified	Data.Foldable+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Test.QuickCheck+import qualified	WeekDaze.Aggregate.TeacherRegister	as Aggregate.TeacherRegister+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Identifiers.Level		as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId		as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.SynchronisationId	as Identifiers.SynchronisationId+import qualified	WeekDaze.Identifiers.TeacherId		as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId		as Identifiers.TimeslotId+import qualified	WeekDaze.Test.QuickCheck.Data.Teacher	as Test.Data.Teacher+import			WeekDaze.Test.QuickCheck.Identifiers.TeacherId()++#if !MIN_VERSION_QuickCheck(2,8,2)+import			ToolShed.Test.QuickCheck.Arbitrary.Map()+#endif++-- | Defines a concrete type for testing.+type TeacherRegister	= Aggregate.TeacherRegister.TeacherRegister Identifiers.TeacherId.TeacherId Identifiers.SynchronisationId.SynchronisationId Identifiers.Level.Level Identifiers.TimeslotId.TimeslotId Identifiers.LocationId.LocationId Test.Data.Teacher.TeachingRatio++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [+	prop_locationIds,+	prop_subjects,+	prop_findSuitableCourses,+	prop_countAvailableTeacherDays+ ] where+	prop_locationIds, prop_subjects, prop_findSuitableCourses, prop_countAvailableTeacherDays :: TeacherRegister -> Test.QuickCheck.Property+	prop_locationIds teacherRegister	= Test.QuickCheck.label "prop_locationIds" . Data.Foldable.all (`Aggregate.TeacherRegister.isInhabited` teacherRegister) $ Aggregate.TeacherRegister.extractDistinctOwnLocationIds teacherRegister++	prop_subjects teacherRegister	= Test.QuickCheck.label "prop_subjects" . not . Data.Foldable.any (\subject -> Data.Map.null $ Aggregate.TeacherRegister.findSuitableCourseByTeacherId 1 subject teacherRegister) $ Aggregate.TeacherRegister.extractDistinctSubjects teacherRegister++	prop_findSuitableCourses teacherRegister	= Test.QuickCheck.label "prop_findSuitableCourses" . not . Data.Foldable.any (+		\course -> Data.Map.null $ Aggregate.TeacherRegister.findSuitableCourseByTeacherId (Data.Maybe.fromMaybe maxBound $ Data.Course.getMaybeMaximumClassSize course) (Data.Course.getSubject course) teacherRegister+	 ) $ Aggregate.TeacherRegister.extractDistinctCourses teacherRegister++	prop_countAvailableTeacherDays teacherRegister	= Test.QuickCheck.label "prop_countAvailableTeacherDays" $ Aggregate.TeacherRegister.countAvailableTeacherDays teacherRegister == Data.Foldable.sum (Data.Map.map Data.Resource.countDaysPerWeekAvailable teacherRegister)+
+ src-test/WeekDaze/Test/QuickCheck/Colour/HTMLColour.hs view
@@ -0,0 +1,79 @@+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for module 'Colour.HTMLColour'.+-}++module WeekDaze.Test.QuickCheck.Colour.HTMLColour(+-- * Constants+	results,+-- * Functions+--	normalise+) where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Colour.HTMLColour	as Colour.HTMLColour+import qualified	WeekDaze.Colour.HTMLColourCode	as Colour.HTMLColourCode+import qualified	WeekDaze.Colour.RGB		as Colour.RGB+import			WeekDaze.Colour.RGB((>+<))+import			WeekDaze.Test.QuickCheck.Colour.RGB()++-- | Map the integral magnitudes of each component colour onto the required range.+normalise :: Integral i => Colour.RGB.RGB i -> Colour.RGB.RGB i+normalise	= fmap $ (`mod` Colour.RGB.radix) . abs++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_deriveComplementaryHTMLColourCode,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_rgbUnitIntervalToHTMLColourCode,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_unitIntervalToRGB+ ] where+	prop_deriveComplementaryHTMLColourCode :: Colour.RGB.RGB Integer -> Test.QuickCheck.Property+	prop_deriveComplementaryHTMLColourCode rgb	= Test.QuickCheck.label "prop_deriveComplementaryHTMLColourCode" $ (+		== Colour.RGB.white24Bit+	 ) . (+		rgb' >+<+	 ) . Colour.HTMLColour.htmlColourCodeToRGB . Colour.HTMLColourCode.deriveComplementaryHTMLColourCode $ Colour.HTMLColour.rgbUnitIntervalToHTMLColourCode (+		Colour.RGB.toRGBUnitInterval rgb' :: Colour.RGB.RGB Rational+	 ) where+		rgb'	= normalise rgb++	prop_rgbUnitIntervalToHTMLColourCode :: Colour.RGB.RGB Integer -> Test.QuickCheck.Property+	prop_rgbUnitIntervalToHTMLColourCode rgb	= Test.QuickCheck.label "prop_rgbUnitIntervalToHTMLColourCode" . (== rgb') . Colour.HTMLColour.htmlColourCodeToRGB . Colour.HTMLColour.rgbUnitIntervalToHTMLColourCode $ (Colour.RGB.toRGBUnitInterval rgb' :: Colour.RGB.RGB Rational) where+		rgb'	= normalise rgb++	prop_unitIntervalToRGB :: Int -> Double -> Test.QuickCheck.Property+	prop_unitIntervalToRGB i angularOffset	= Test.QuickCheck.label "prop_unitIntervalToRGB" . (+		== (Colour.RGB.white24Bit :: Colour.RGB.RGB Int)+	 ) . Colour.RGB.fromRGBUnitInterval {-round off errors-} . fmap (+		(/ 3) . (* 2)	-- Each phasor averages 0, but after mapping to the closed unit interval, averages 1/2. Three such phasors were added to total 3/2, which we then correct to 1.+	 ) $ x >+< y >+< z where+		pi', i', saturation, angularSpan :: Double+		pi'		= pi+		i'		= fromIntegral (i `mod` Colour.RGB.radix) / fromInteger Colour.RGB.radix	-- Normalise to the unit interval.+		saturation	= 1+		angularSpan	= 2 * pi'++		x	= Colour.HTMLColour.unitIntervalToRGB angularSpan angularOffset saturation i'+		y	= Colour.HTMLColour.unitIntervalToRGB angularSpan (angularOffset + 2 * pi' / 3) saturation i'+		z	= Colour.HTMLColour.unitIntervalToRGB angularSpan (angularOffset + 4 * pi' / 3) saturation i'+
+ src-test/WeekDaze/Test/QuickCheck/Colour/RGB.hs view
@@ -0,0 +1,51 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for module 'Colour.RGB'.+-}++module WeekDaze.Test.QuickCheck.Colour.RGB(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Data.Triple+import qualified	WeekDaze.Colour.RGB	as Colour.RGB++instance (+	Test.QuickCheck.Arbitrary	primaryColour+ ) => Test.QuickCheck.Arbitrary (Colour.RGB.RGB primaryColour) where+	arbitrary	= ToolShed.Data.Triple.uncurry3 Colour.RGB.mkRGB `fmap` Test.QuickCheck.arbitrary {-triple-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_absDifference,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_rgbUnitInterval+ ] where+	prop_absDifference :: Colour.RGB.RGB Integer -> Colour.RGB.RGB Integer -> Test.QuickCheck.Property+	prop_absDifference rgbL rgbR	= Test.QuickCheck.label "prop_absDifference" $ Colour.RGB.absDifference rgbL rgbR == Colour.RGB.absDifference rgbR rgbL++	prop_rgbUnitInterval :: Colour.RGB.RGB Integer -> Test.QuickCheck.Property+	prop_rgbUnitInterval rgb	= Test.QuickCheck.label "prop_rgbUnitInterval" $ Colour.RGB.fromRGBUnitInterval (Colour.RGB.toRGBUnitInterval rgb :: Colour.RGB.RGB Rational) == rgb+
+ src-test/WeekDaze/Test/QuickCheck/Data/Course.hs view
@@ -0,0 +1,93 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Data.Course.Course'.+-}++module WeekDaze.Test.QuickCheck.Data.Course(+-- * Types+-- ** Type-synonyms+--	Course,+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	Data.Maybe+import qualified	Test.QuickCheck+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.Location			as Data.Location+import qualified	WeekDaze.Identifiers.Level		as Identifiers.Level+import qualified	WeekDaze.Identifiers.SynchronisationId	as Identifiers.SynchronisationId+import qualified	WeekDaze.Identifiers.TimeslotId		as Identifiers.TimeslotId+import qualified	WeekDaze.Temporal.Day			as Temporal.Day+import qualified	WeekDaze.Temporal.TimeslotRequest	as Temporal.TimeslotRequest+import qualified	WeekDaze.Test.QuickCheck.Data.Location	as Test.Data.Location+import qualified	WeekDaze.Test.QuickCheck.Temporal.Time	as Test.Temporal.Time+import			WeekDaze.Test.QuickCheck.Data.Subject()+import			WeekDaze.Test.QuickCheck.Identifiers.SynchronisationId()+import			WeekDaze.Test.QuickCheck.Temporal.TimeslotRequest()++instance (+	Ord				timeslotId,+	Show				level,+	Show				synchronisationId,+	Show				timeslotId,+	Test.QuickCheck.Arbitrary	level,+	Test.QuickCheck.Arbitrary	synchronisationId,+	Test.QuickCheck.Arbitrary	timeslotId+ ) => Test.QuickCheck.Arbitrary (Data.Course.Course synchronisationId level timeslotId) where+	arbitrary	= do+		subject				<- Test.QuickCheck.arbitrary+		requiredLessonsPerWeek		<- Test.QuickCheck.elements [1 .. Temporal.Day.nDaysPerWeek]+		requiredFacilityNames		<- fmap Data.Location.getFacilityNames (Test.QuickCheck.arbitrary {-location-} :: Test.QuickCheck.Gen Test.Data.Location.Profile)+		timeslotRequest			<- Test.QuickCheck.arbitrary+		minimumConsecutiveLessons	<- (minimum . (: [requiredLessonsPerWeek, Test.Temporal.Time.nTimeslotsPerDay])) `fmap` Test.QuickCheck.elements [1 .. 3] {-arbitrarily-}+		maybeMaximumClassSize		<- Test.QuickCheck.oneof [+			return {-to Gen-monad-} Nothing,+			Just `fmap` Test.QuickCheck.elements [1 .. 4] {-arbitrarily-}+		 ]+		maybeSynchronisationId		<- Test.QuickCheck.arbitrary++		return {-to Gen-monad-} $ Data.Course.mkCourse subject requiredLessonsPerWeek requiredFacilityNames timeslotRequest minimumConsecutiveLessons maybeMaximumClassSize maybeSynchronisationId++-- | Defines a concrete type for testing.+type Course	= Data.Course.Course Identifiers.SynchronisationId.SynchronisationId Identifiers.Level.Level Identifiers.TimeslotId.TimeslotId++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_isSuitable, prop_isRigid, prop_isFluid, prop_calculateIdealConsecutiveLessons] where+	prop_isSuitable, prop_isRigid, prop_isFluid, prop_calculateIdealConsecutiveLessons :: Course -> Test.QuickCheck.Property+	prop_isSuitable course	= Test.QuickCheck.label "prop_isSuitable" $ Data.Course.isSuitable (Data.Maybe.fromMaybe maxBound $ Data.Course.getMaybeMaximumClassSize course) (Data.Course.getSubject course) course++	prop_isRigid course	= Test.QuickCheck.label "prop_isRigid" . not $ Data.Course.isRigid course && Temporal.TimeslotRequest.isIdeally (Data.Course.getTimeslotRequest course)++	prop_isFluid course	= Test.QuickCheck.label "prop_isFluid" $ not (Temporal.TimeslotRequest.isIdeally $ Data.Course.getTimeslotRequest course) || Data.Course.isFluid course++	prop_calculateIdealConsecutiveLessons course	= Test.QuickCheck.label "prop_calculateIdealConsecutiveLessons" $ if idealConsecutiveLessons == fromIntegral minimumConsecutiveLessons+		then Data.Course.getRequiredLessonsPerWeek course `rem` minimumConsecutiveLessons == 0+		else idealConsecutiveLessons > toRational minimumConsecutiveLessons+		where+			(idealConsecutiveLessons, minimumConsecutiveLessons)		= Data.Course.calculateIdealConsecutiveLessons &&& Data.Course.getMinimumConsecutiveLessons $ course+
+ src-test/WeekDaze/Test/QuickCheck/Data/Group.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Data.Group.Group'.+-}++module WeekDaze.Test.QuickCheck.Data.Group() where++import qualified	Test.QuickCheck+import			ToolShed.Test.QuickCheck.Arbitrary.Set()+import qualified	WeekDaze.Data.Group	as Data.Group+import			WeekDaze.Test.QuickCheck.Identifiers.LocationId()+import			WeekDaze.Test.QuickCheck.Temporal.Time()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Ord				timeslotId,+	Test.QuickCheck.Arbitrary	locationId,+	Test.QuickCheck.Arbitrary	timeslotId+ ) => Test.QuickCheck.Arbitrary (Data.Group.Profile timeslotId locationId) where+	arbitrary	= Data.Group.mkProfile <$> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary <*> Test.QuickCheck.arbitrary+
+ src-test/WeekDaze/Test/QuickCheck/Data/Location.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Data.Location.Location'.+-}++module WeekDaze.Test.QuickCheck.Data.Location(+-- * Types+-- ** Type-synonyms+	Profile,+-- * Constants+	results+) where++import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	WeekDaze.Data.Location		as Data.Location+import qualified	WeekDaze.Identifiers.Campus	as Identifiers.Campus+import			WeekDaze.Test.QuickCheck.Identifiers.Campus()+import			WeekDaze.Test.QuickCheck.Temporal.Availability()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++-- | A concrete type for testing.+type Profile	= Data.Location.Profile Identifiers.Campus.Campus++instance (Show campus, Test.QuickCheck.Arbitrary campus) => Test.QuickCheck.Arbitrary (Data.Location.Profile campus) where+	arbitrary	= Data.Location.mkProfile <$> Test.QuickCheck.elements [1 .. 10 {-arbitrarily-}] {-Capacity-} <*> (+		Data.Set.fromList . return {-to Gen-monad-} . ('f' :) . show <$> Test.QuickCheck.elements [0 :: Int {-arbitrarily-} .. 9 {-arbitrarily-}]	-- FacilityNames.+	 ) <*> Test.QuickCheck.arbitrary {-Availability-} <*> Test.QuickCheck.arbitrary {-Campus-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [+	prop_isSuitable,+	prop_isSuitable',+	prop_isUnsuitable,+	prop_isAlwaysSuitable,+	prop_calculateRelativeWaste,+	prop_calculateRelativeUse+ ] where+	prop_isSuitable, prop_isSuitable', prop_isUnsuitable, prop_isAlwaysSuitable, prop_calculateRelativeWaste, prop_calculateRelativeUse :: Profile -> Test.QuickCheck.Property+	prop_isSuitable profile	= Test.QuickCheck.label "prop_isSuitable" $ Data.Location.isSuitable (Data.Location.getCapacity profile) (Data.Location.getFacilityNames profile) profile+	prop_isSuitable'	= Test.QuickCheck.label "prop_isSuitable'" . Data.Location.isSuitable 0 {-nStudents-} Data.Set.empty {-facilityNames-}+	prop_isUnsuitable	= Test.QuickCheck.label "prop_isUnsuitable" . not . Data.Location.isSuitable maxBound {-nStudents-} Data.Set.empty {-facilityNames-}+	prop_isAlwaysSuitable	= Test.QuickCheck.label "prop_isAlwaysSuitable" . Data.Location.isSuitable 0 {-nStudents-} Data.Set.empty {-facilityNames-}++	prop_calculateRelativeWaste profile	= Test.QuickCheck.label "prop_calculateRelativeWaste" $ Data.Location.calculateRelativeWaste profile (+		Data.Location.calculateWaste (Data.Location.getCapacity profile) (Data.Location.getFacilityNames profile) profile+	 ) == (0 :: Rational {-arbitrarily-}, 0)++	prop_calculateRelativeUse profile	= Test.QuickCheck.label "prop_calculateRelativeUse" $ Data.Location.calculateRelativeUse profile (+		Data.Location.calculateWaste 0 Data.Set.empty profile+	 ) == (0 :: Rational {-arbitrarily-}, 0)+
+ src-test/WeekDaze/Test/QuickCheck/Data/Student.hs view
@@ -0,0 +1,88 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Data.Student.Student'.+-}++module WeekDaze.Test.QuickCheck.Data.Student(+-- * Types+-- ** Type-synonyms+	TeachingRatio,+--	Profile,+-- * Constants+	results+) where++import			Data.Set((\\))+import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	WeekDaze.Data.HumanResource	as Data.HumanResource+import qualified	WeekDaze.Data.Resource		as Data.Resource+import qualified	WeekDaze.Data.Student		as Data.Student+import qualified	WeekDaze.Identifiers.Level	as Identifiers.Level+import qualified	WeekDaze.Identifiers.Stream	as Identifiers.Stream+import			WeekDaze.Test.QuickCheck.Data.Subject()+import			WeekDaze.Test.QuickCheck.Identifiers.Stream()+import			WeekDaze.Test.QuickCheck.Temporal.Availability()+import			WeekDaze.Test.QuickCheck.Temporal.FreePeriodPreference()+import qualified	WeekDaze.Test.QuickCheck.Temporal.Time	as Test.Temporal.Time++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Fractional			teachingRatio,+	Ord				level,+	Show				level,+	Real				teachingRatio,+	Test.QuickCheck.Arbitrary	level,+	Test.QuickCheck.Arbitrary	stream+ ) => Test.QuickCheck.Arbitrary (Data.Student.Profile level stream teachingRatio) where+	arbitrary	= Data.Student.mkProfile <$> Test.QuickCheck.arbitrary {-Maybe level-} <*> (+		do+			knowledgeRequirement		<- Test.QuickCheck.arbitrary+			coreKnowledgeRequirements	<- Data.Set.fromList . (knowledgeRequirement :) <$> Test.QuickCheck.arbitrary	-- Non-empty Set.++			(,) coreKnowledgeRequirements . (\\ coreKnowledgeRequirements) . Data.Set.fromList <$> Test.QuickCheck.arbitrary+	 ) <*> Test.QuickCheck.arbitrary {-working week-} <*> (+		(/ fromIntegral Test.Temporal.Time.nTimeslotsPerWeek) . fromIntegral <$> Test.QuickCheck.elements [1 .. Test.Temporal.Time.nTimeslotsPerWeek]	-- TeachingRatio.+	 ) <*> (+		Data.Set.fromList . map (('g' :) . show . (`mod` (10 :: Int))) <$> Test.QuickCheck.arbitrary	-- Group-membership.+	 ) <*> Test.QuickCheck.arbitrary {-maybe free-timeslot preference-}++-- | Defines a concrete type for testing.+-- type TeachingRatio	= Rational	-- Arbitrarily.+type TeachingRatio	= Double	-- Arbitrarily.++-- | Defines a concrete type for testing.+type Profile	= Data.Student.Profile Identifiers.Level.Level Identifiers.Stream.Stream TeachingRatio++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 1024}+ ) [prop_nTimeSlotsPerWeek] where+	prop_nTimeSlotsPerWeek :: Profile -> Test.QuickCheck.Property+	prop_nTimeSlotsPerWeek profile	= Test.QuickCheck.label "prop_nTimeSlotsPerWeek" $ Data.HumanResource.getNTimeslotsPerWeekOfTeaching Test.Temporal.Time.nTimeslotsPerDay profile + Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching Test.Temporal.Time.nTimeslotsPerDay profile == Test.Temporal.Time.nTimeslotsPerDay * Data.Resource.countDaysPerWeekAvailable profile+
+ src-test/WeekDaze/Test/QuickCheck/Data/Subject.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Data.Subject.Subject'.+-}++module WeekDaze.Test.QuickCheck.Data.Subject(+-- * Types+-- ** Type-synonyms+--	Subject,+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Data.Subject		as Data.Subject+import qualified	WeekDaze.Identifiers.Level	as Identifiers.Level+import			WeekDaze.Test.QuickCheck.Identifiers.Level()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (Show level, Test.QuickCheck.Arbitrary level) => Test.QuickCheck.Arbitrary (Data.Subject.Subject level) where+	arbitrary	= Data.Subject.mkSubject <$> (+		('t' :) . show <$> Test.QuickCheck.elements [0 :: Int {-arbitrarily-} .. 9 {-arbitrarily-}]	-- Topic.+	 ) <*> Test.QuickCheck.arbitrary {-Maybe level-}++-- | Defines a concrete type for testing.+type Subject	= Data.Subject.Subject Identifiers.Level.Level++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Subject -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Subject, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Subject -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage subject	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) subject+
+ src-test/WeekDaze/Test/QuickCheck/Data/Teacher.hs view
@@ -0,0 +1,117 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Data.Teacher.Teacher'.+-}++module WeekDaze.Test.QuickCheck.Data.Teacher(+-- * Types+-- ** Type-synonyms+	TeachingRatio,+--	Profile,+-- * Constants+	results+) where++import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	ToolShed.Data.List+import qualified	WeekDaze.Data.Course			as Data.Course+import qualified	WeekDaze.Data.HumanResource		as Data.HumanResource+import qualified	WeekDaze.Data.Resource			as Data.Resource+import qualified	WeekDaze.Data.Subject			as Data.Subject+import qualified	WeekDaze.Data.Teacher			as Data.Teacher+import qualified	WeekDaze.Identifiers.Level		as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId		as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.SynchronisationId	as Identifiers.SynchronisationId+import qualified	WeekDaze.Identifiers.TimeslotId		as Identifiers.TimeslotId+import qualified	WeekDaze.Temporal.TimeslotRequest	as Temporal.TimeslotRequest+import qualified	WeekDaze.Test.QuickCheck.Temporal.Time	as Test.Temporal.Time+import			WeekDaze.Test.QuickCheck.Data.Course()+import			WeekDaze.Test.QuickCheck.Identifiers.LocationId()+import			WeekDaze.Test.QuickCheck.Temporal.FreePeriodPreference()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Fractional			teachingRatio,+	Ord				level,+	Ord				synchronisationId,+	Ord				timeslotId,+	Real				teachingRatio,+	Show				level,+	Show				locationId,+	Show				synchronisationId,+	Show				timeslotId,+	Test.QuickCheck.Arbitrary	level,+	Test.QuickCheck.Arbitrary	locationId,+	Test.QuickCheck.Arbitrary	synchronisationId,+	Test.QuickCheck.Arbitrary	timeslotId+ ) => Test.QuickCheck.Arbitrary (Data.Teacher.Profile synchronisationId level timeslotId locationId teachingRatio) where+	arbitrary	= do+		course	<- Test.QuickCheck.arbitrary++		Data.Teacher.mkProfile <$> (+			Data.Set.fromList . Data.List.nubBy (+				\l r -> let+					l'	= Data.Course.getTimeslotRequest l+					r'	= Data.Course.getTimeslotRequest r+				in ToolShed.Data.List.equalityBy Data.Course.getSubject l r || (+					Temporal.TimeslotRequest.isSpecific l' && (l' == r')	-- Avoid a clash in the requested times for course in different subjects.+				)+			) . (course :) <$> Test.QuickCheck.arbitrary	-- Service.+		 ) <*> Test.QuickCheck.arbitrary {-getMaybeOwnLocationId-} <*> Test.QuickCheck.arbitrary {-working week-} <*> (+			(/ fromIntegral Test.Temporal.Time.nTimeslotsPerWeek) . fromIntegral <$> Test.QuickCheck.elements [1 .. Test.Temporal.Time.nTimeslotsPerWeek]	-- TeachingRatio.+		 ) <*> (+			Data.Set.fromList . map (('g' :) . show . (`mod` (10 :: Int))) <$> Test.QuickCheck.arbitrary	-- Group-membership.+		 ) <*> Test.QuickCheck.elements [+			Nothing,+			Just . Data.Subject.getTopic $ Data.Course.getSubject course+		 ] {-maybe specialtyTopic-} <*> Test.QuickCheck.arbitrary {-maybe free-timeslot preference-}++-- | Defines a concrete type for testing.+-- type TeachingRatio	= Rational	-- Arbitrarily.+type TeachingRatio	= Double	-- Arbitrarily.++-- | Defines a concrete type for testing.+type Profile	= Data.Teacher.Profile Identifiers.SynchronisationId.SynchronisationId Identifiers.Level.Level Identifiers.TimeslotId.TimeslotId Identifiers.LocationId.LocationId TeachingRatio++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_offersSuitableCourse,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_isSpecialistIn,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_inhabits,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 1024} prop_nTimeSlotsPerWeek+ ] where+	prop_isSpecialistIn, prop_offersSuitableCourse, prop_inhabits, prop_nTimeSlotsPerWeek :: Profile -> Test.QuickCheck.Property+	prop_isSpecialistIn profile		= Test.QuickCheck.label "prop_isSpecialistIn" . Data.Maybe.maybe True (`Data.Teacher.isSpecialistIn` profile) $ Data.Teacher.getMaybeSpecialtyTopic profile+	prop_offersSuitableCourse profile	= Test.QuickCheck.label "prop_offersSuitableCourse" . Data.Foldable.all (\subject -> Data.Teacher.offersSuitableCourse 0 subject profile) . Data.Set.map Data.Course.getSubject $ Data.Teacher.getService profile+	prop_inhabits profile			= Test.QuickCheck.label "prop_inhabits" . Data.Maybe.maybe True (`Data.Teacher.inhabits` profile) $ Data.Teacher.getMaybeOwnLocationId profile+	prop_nTimeSlotsPerWeek profile		= Test.QuickCheck.label "prop_nTimeSlotsPerWeek" $ Data.HumanResource.getNTimeslotsPerWeekOfTeaching Test.Temporal.Time.nTimeslotsPerDay profile + Data.HumanResource.getNTimeslotsPerWeekOfNonTeaching Test.Temporal.Time.nTimeslotsPerDay profile == Test.Temporal.Time.nTimeslotsPerDay * Data.Resource.countDaysPerWeekAvailable profile+
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/Criterion.hs view
@@ -0,0 +1,61 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'ExecutionConfiguration.Criterion.Criterion'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.Criterion(+-- * Types+-- ** Type-synonyms+--	Criterion,+-- * Constants+	results+) where++import qualified	Control.Monad.Writer+import qualified	Factory.Data.Interval+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))+import qualified	WeekDaze.ExecutionConfiguration.Criterion	as ExecutionConfiguration.Criterion+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight	as ExecutionConfiguration.CriterionWeight+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.CriterionWeight()++instance (+	Fractional	criterionValue,+	Real		criterionValue+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.Criterion.Criterion criterionValue) where+	arbitrary	= (ExecutionConfiguration.Criterion.mkCriterion "" . recip . fromIntegral) `fmap` Test.QuickCheck.elements [1 :: Int {-arbitrarily-} .. 10 {-arbitrarily-}]++-- | Defines a concrete type for testing.+-- type Criterion	= ExecutionConfiguration.Criterion.Criterion Rational {-arbitrarily-}+type Criterion	= ExecutionConfiguration.Criterion.Criterion Double {-arbitrarily-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_calculateWeightedMean] where+	prop_calculateWeightedMean :: [(Criterion, ExecutionConfiguration.CriterionWeight.CriterionWeight Double)] -> Test.QuickCheck.Property+	prop_calculateWeightedMean assocs	= not (null assocs)	==> Test.QuickCheck.label "prop_calculateWeightedMean" $ (`Factory.Data.Interval.elem'` Factory.Data.Interval.closedUnitInterval) weightedMean where+		weightedMean :: Double+		weightedMean	= fst {-weighted mean-} . Control.Monad.Writer.runWriter $ ExecutionConfiguration.Criterion.calculateWeightedMean assocs+
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/CriterionWeight.hs view
@@ -0,0 +1,43 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'ExecutionConfiguration.CriterionWeight.CriterionWeight'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.CriterionWeight(+-- * Types+-- ** Type-synonyms+	CriterionWeight+) where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.CriterionWeight	as ExecutionConfiguration.CriterionWeight++instance (+	Fractional	criterionWeight,+	Real		criterionWeight+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.CriterionWeight.CriterionWeight criterionWeight) where+	arbitrary	= (ExecutionConfiguration.CriterionWeight.mkCriterionWeight . recip) `fmap` Test.QuickCheck.elements (map realToFrac [1 :: Int {-arbitrarily-} .. 10 {-arbitrarily-}])++-- | Defines a concrete type for testing.+-- type CriterionWeight	= ExecutionConfiguration.CriterionWeight.CriterionWeight Rational {-arbitrarily-}+type CriterionWeight	= ExecutionConfiguration.CriterionWeight.CriterionWeight Double {-arbitrarily-}
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/EvolutionStrategies.hs view
@@ -0,0 +1,80 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ExecutionConfiguration.EvolutionStrategies.EvolutionStrategies'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.EvolutionStrategies() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.EvolutionStrategies	as ExecutionConfiguration.EvolutionStrategies+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.TimetableBreederFecundity()++instance (+	Fractional	fecundityDecayRatio,+	Fractional	populationDiversityRatio+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.EvolutionStrategies.EvolutionStrategies fecundityDecayRatio populationDiversityRatio) where+	arbitrary	= do+		synchronisedCourseMutationFecundity		<- Test.QuickCheck.arbitrary+		synchronisedCourseByDayMutationFecundity	<- Test.QuickCheck.arbitrary+		excessRunlengthMutationFecundity		<- Test.QuickCheck.arbitrary+		homogeneousStudentViewLessonMutationFecundity	<- Test.QuickCheck.arbitrary+		incompleteCourseMutationFecundity		<- Test.QuickCheck.arbitrary+		randomLessonMutationFecundity			<- Test.QuickCheck.arbitrary+		singletonStudentClassMutationFecundity		<- Test.QuickCheck.arbitrary+		splitSessionMutationFecundity			<- Test.QuickCheck.arbitrary+		studentBodyCombinationMutationFecundity		<- Test.QuickCheck.arbitrary+		studentViewTimetableForDayMutationFecundity	<- Test.QuickCheck.arbitrary+		studentViewTimetableForWeekMutationFecundity	<- Test.QuickCheck.arbitrary+		synchronousLessonMutationFecundity		<- Test.QuickCheck.arbitrary+		randomLessonMutationNTrials			<- Test.QuickCheck.arbitrary+		randomLessonMutationNTimeslots			<- Test.QuickCheck.arbitrary+		studentViewTimetableForDayMutationMaybeNDays	<- Test.QuickCheck.arbitrary+		studentViewTimetableForWeekMutationNTrials	<- Test.QuickCheck.arbitrary+		studentViewTimetableForWeekMutationNTimeslots	<- Test.QuickCheck.arbitrary+		fecundityDecayRatio				<- (recip . fromIntegral) `fmap` Test.QuickCheck.elements [1 :: Int .. 10]+		minimumPopulationDiversityRatio			<- (recip . fromIntegral) `fmap` Test.QuickCheck.elements [1 :: Int .. 10]+		maybeNInitialScouts				<- Test.QuickCheck.elements $ Nothing : map Just [1 .. 5]++		return {-to Gen-monad-} ExecutionConfiguration.EvolutionStrategies.MkEvolutionStrategies {+			ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseMutationFecundity		= synchronisedCourseMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getSynchronisedCourseByDayMutationFecundity		= synchronisedCourseByDayMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getExcessRunlengthMutationFecundity			= excessRunlengthMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getHomogeneousStudentViewLessonMutationFecundity	= homogeneousStudentViewLessonMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getIncompleteCourseMutationFecundity			= incompleteCourseMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getRandomLessonMutationFecundity			= randomLessonMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getSingletonStudentClassMutationFecundity		= singletonStudentClassMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getSplitSessionMutationFecundity			= splitSessionMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getStudentBodyCombinationMutationFecundity		= studentBodyCombinationMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForDayMutationFecundity	= studentViewTimetableForDayMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationFecundity	= studentViewTimetableForWeekMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getSynchronousLessonMutationFecundity		= synchronousLessonMutationFecundity,+			ExecutionConfiguration.EvolutionStrategies.getRandomLessonMutationNTrials			= randomLessonMutationNTrials `mod` 10,+			ExecutionConfiguration.EvolutionStrategies.getRandomLessonMutationNTimeslots			= randomLessonMutationNTimeslots `mod` 10,+			ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForDayMutationMaybeNDays	= fmap (`mod` 10) studentViewTimetableForDayMutationMaybeNDays,+			ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationNTrials	= studentViewTimetableForWeekMutationNTrials `mod` 10,+			ExecutionConfiguration.EvolutionStrategies.getStudentViewTimetableForWeekMutationNTimeslots	= studentViewTimetableForWeekMutationNTimeslots `mod` 10,+			ExecutionConfiguration.EvolutionStrategies.getFecundityDecayRatio				= fecundityDecayRatio,+			ExecutionConfiguration.EvolutionStrategies.getMinimumPopulationDiversityRatio			= minimumPopulationDiversityRatio,+			ExecutionConfiguration.EvolutionStrategies.getMaybeNInitialScouts				= maybeNInitialScouts+		}+
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/ExecutionOptions.hs view
@@ -0,0 +1,96 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ExecutionConfiguration.ExecutionOptions.ExecutionOptions'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.ExecutionOptions(+-- * Types+-- ** Type-synonyms+	CriterionWeight,+	FecundityDecayRatio,+	PopulationDiversityRatio+) where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions	as ExecutionConfiguration.ExecutionOptions+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.EvolutionStrategies()+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.LessonCriteriaWeights()+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.OptimiseLessonCriteriaWeights()+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.TimetableCriteriaWeights()+import			WeekDaze.Test.QuickCheck.Model.TimetableAxisTriple()++instance (+	Enum				fecundityDecayRatio,+	Enum				populationDiversityRatio,+	Fractional			criterionWeight,+	Fractional			fecundityDecayRatio,+	Fractional			populationDiversityRatio,+	Real				criterionWeight,+	Show				criterionWeight,+	Test.QuickCheck.Arbitrary	criterionWeight+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.ExecutionOptions.ExecutionOptions criterionWeight fecundityDecayRatio populationDiversityRatio) where+	arbitrary	= do+		evolutionStrategies			<- Test.QuickCheck.arbitrary+		maybeHint				<- Test.QuickCheck.oneof [+			fmap (Just . Left) Test.QuickCheck.arbitrary,+			fmap (Just . Right . ('f' :) . show . (`mod` (10 :: Int))) Test.QuickCheck.arbitrary,+			return {-to Gen-monad-} Nothing+		 ]+		maybeRandomSeed				<- Test.QuickCheck.arbitrary+		optimiseLessonCriteriaWeights		<- Test.QuickCheck.arbitrary+		lessonCriteriaWeights			<- Test.QuickCheck.arbitrary+		permitTemporaryStudentBodyMerger	<- Test.QuickCheck.arbitrary+		reduceStudentBodyRegister		<- Test.QuickCheck.arbitrary+		removeRedundantCourses			<- Test.QuickCheck.arbitrary+		removePointlessGroups			<- Test.QuickCheck.arbitrary+		removeUnsubscribedGroups		<- Test.QuickCheck.arbitrary+		timetableCriteriaWeights		<- Test.QuickCheck.arbitrary+		zeroInappropriateOptions		<- Test.QuickCheck.arbitrary++		return {-to Gen-monad-} . ExecutionConfiguration.ExecutionOptions.setPermitTemporaryStudentBodyMerger permitTemporaryStudentBodyMerger $ ExecutionConfiguration.ExecutionOptions.MkExecutionOptions {+			ExecutionConfiguration.ExecutionOptions.getEvolutionStrategies			= evolutionStrategies,+			ExecutionConfiguration.ExecutionOptions.getMaybeHint				= maybeHint,+			ExecutionConfiguration.ExecutionOptions.getMaybeRandomSeed			= maybeRandomSeed,+			ExecutionConfiguration.ExecutionOptions.getOptimiseLessonCriteriaWeights	= optimiseLessonCriteriaWeights,+			ExecutionConfiguration.ExecutionOptions.getLessonCriteriaWeights		= lessonCriteriaWeights,+			ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger	= undefined,	-- CAVEAT: this must be coordinated with various criteria-weights.+			ExecutionConfiguration.ExecutionOptions.getReduceStudentBodyRegister		= reduceStudentBodyRegister,+			ExecutionConfiguration.ExecutionOptions.getRemoveRedundantCourses		= removeRedundantCourses,+			ExecutionConfiguration.ExecutionOptions.getRemovePointlessGroups		= removePointlessGroups,+			ExecutionConfiguration.ExecutionOptions.getRemoveUnsubscribedGroups		= removeUnsubscribedGroups,+			ExecutionConfiguration.ExecutionOptions.getTimetableCriteriaWeights		= timetableCriteriaWeights,+			ExecutionConfiguration.ExecutionOptions.getZeroInappropriateOptions		= zeroInappropriateOptions+		}++-- | Defines a concrete type for testing.+-- type CriterionWeight		= Rational+type CriterionWeight		= Double++-- | Defines a concrete type for testing.+-- type FecundityDecayRatio	= Rational+type FecundityDecayRatio	= Double++-- | Defines a concrete type for testing.+-- type PopulationDiversityRatio	= Rational+type PopulationDiversityRatio	= Double+
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/LessonCriteriaWeights.hs view
@@ -0,0 +1,76 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ExecutionConfiguration.LessonCriteriaWeights.LessonCriteriaWeights'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.LessonCriteriaWeights() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.LessonCriteriaWeights	as ExecutionConfiguration.LessonCriteriaWeights+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.CriterionWeight()++instance (+	Fractional	criterionWeight,+	Real		criterionWeight+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.LessonCriteriaWeights.LessonCriteriaWeights criterionWeight) where+	arbitrary	= do+		weightOfAreResourcesReused				<- Test.QuickCheck.arbitrary+		weightOfGreatestMinimumConsecutiveLessons		<- Test.QuickCheck.arbitrary+		weightOfGreatestRemainingCourseLessons			<- Test.QuickCheck.arbitrary+		weightOfGreatestSynchronisedCourseSetSize		<- Test.QuickCheck.arbitrary+		weightOfIsCoreKnowledgeRequirement			<- Test.QuickCheck.arbitrary+		weightOfIsSpecialistInTopic				<- Test.QuickCheck.arbitrary+		weightOfMatchCourseClassSizeToLocationCapacity		<- Test.QuickCheck.arbitrary+		weightOfMaximiseRelativeFacilityUtilisation		<- Test.QuickCheck.arbitrary+		weightOfMaximiseStudentClassSizeOverCourseClassSize	<- Test.QuickCheck.arbitrary+		weightOfMaximiseStudentClassSizeOverLocationCapacity	<- Test.QuickCheck.arbitrary+		weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	<- Test.QuickCheck.arbitrary+		weightOfMinimiseBookingOfLocationByOtherTeachers	<- Test.QuickCheck.arbitrary+		weightOfMinimiseDeviationFromTimeslotRequest		<- Test.QuickCheck.arbitrary+		weightOfMinimiseInterCampusMigrationsOfStudents		<- Test.QuickCheck.arbitrary+		weightOfMinimiseInterCampusMigrationsOfTeachers		<- Test.QuickCheck.arbitrary+		weightOfMinimiseStudentBodyCombinations			<- Test.QuickCheck.arbitrary+		weightOfMinimiseTeachersLocusOperandi			<- Test.QuickCheck.arbitrary+		weightOfMinimiseWasteOfScarceFacilities			<- Test.QuickCheck.arbitrary++		return {-to Gen-monad-} ExecutionConfiguration.LessonCriteriaWeights.MkLessonCriteriaWeights {+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfAreResourcesReused				= weightOfAreResourcesReused,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfGreatestMinimumConsecutiveLessons		= weightOfGreatestMinimumConsecutiveLessons,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfGreatestRemainingCourseLessons			= weightOfGreatestRemainingCourseLessons,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfGreatestSynchronisedCourseSetSize		= weightOfGreatestSynchronisedCourseSetSize,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfIsCoreKnowledgeRequirement			= weightOfIsCoreKnowledgeRequirement,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfIsSpecialistInTopic				= weightOfIsSpecialistInTopic,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMatchCourseClassSizeToLocationCapacity		= weightOfMatchCourseClassSizeToLocationCapacity,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseRelativeFacilityUtilisation		= weightOfMaximiseRelativeFacilityUtilisation,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverCourseClassSize	= weightOfMaximiseStudentClassSizeOverCourseClassSize,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMaximiseStudentClassSizeOverLocationCapacity	= weightOfMaximiseStudentClassSizeOverLocationCapacity,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseBookingAtAnotherCoursesSpecifiedTime	= weightOfMinimiseBookingAtAnotherCoursesSpecifiedTime,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseBookingOfLocationByOtherTeachers	= weightOfMinimiseBookingOfLocationByOtherTeachers,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseDeviationFromTimeslotRequest		= weightOfMinimiseDeviationFromTimeslotRequest,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseInterCampusMigrationsOfStudents		= weightOfMinimiseInterCampusMigrationsOfStudents,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseInterCampusMigrationsOfTeachers		= weightOfMinimiseInterCampusMigrationsOfTeachers,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseStudentBodyCombinations			= weightOfMinimiseStudentBodyCombinations,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseTeachersLocusOperandi			= weightOfMinimiseTeachersLocusOperandi,+			ExecutionConfiguration.LessonCriteriaWeights.getWeightOfMinimiseWasteOfScarceFacilities			= weightOfMinimiseWasteOfScarceFacilities+		}+
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/OptimiseLessonCriteriaWeights.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ExecutionConfiguration.OptimiseLessonCriteriaWeights.OptimiseLessonCriteriaWeights'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.OptimiseLessonCriteriaWeights(+-- * Types+-- ** Type-synonyms+--	OptimiseLessonCriteriaWeights,+-- * Constants+	results+ ) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights	as ExecutionConfiguration.OptimiseLessonCriteriaWeights++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Fractional	criterionWeight,+	Real		criterionWeight,+	Show		criterionWeight+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.OptimiseLessonCriteriaWeights.OptimiseLessonCriteriaWeights criterionWeight) where+	arbitrary	= ExecutionConfiguration.OptimiseLessonCriteriaWeights.mkOptimiseLessonCriteriaWeights <$> Test.QuickCheck.elements [0 .. 9] <*> Test.QuickCheck.elements (+		take 10 $ iterate (/ 2) 2+	 ) <*> Test.QuickCheck.elements (+		take 10 $ iterate (/ 2) 1+	 ) <*> Test.QuickCheck.arbitrary {-useMeanOverRasterScans-}++-- | Defines a concrete type for testing.+type OptimiseLessonCriteriaWeights	= ExecutionConfiguration.OptimiseLessonCriteriaWeights.OptimiseLessonCriteriaWeights Rational {-arbitrarily-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: OptimiseLessonCriteriaWeights -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(OptimiseLessonCriteriaWeights, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: OptimiseLessonCriteriaWeights -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage optimiseLessonCriteriaWeights	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) optimiseLessonCriteriaWeights
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/TimetableBreederFecundity.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.TimetableBreederFecundity() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.TimetableBreederFecundity	as ExecutionConfiguration.TimetableBreederFecundity++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance Test.QuickCheck.Arbitrary ExecutionConfiguration.TimetableBreederFecundity.TimetableBreederFecundity where+	arbitrary	= ExecutionConfiguration.TimetableBreederFecundity.mkTimetableBreederFecundity <$> Test.QuickCheck.elements [0 .. 9] <*> Test.QuickCheck.elements [0 .. 9]+
+ src-test/WeekDaze/Test/QuickCheck/ExecutionConfiguration/TimetableCriteriaWeights.hs view
@@ -0,0 +1,76 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ExecutionConfiguration.TimetableCriteriaWeights.TimetableCriteriaWeights'.+-}++module WeekDaze.Test.QuickCheck.ExecutionConfiguration.TimetableCriteriaWeights() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights	as ExecutionConfiguration.TimetableCriteriaWeights+import			WeekDaze.Test.QuickCheck.ExecutionConfiguration.CriterionWeight()++instance (+	Fractional	criterionWeight,+	Real		criterionWeight+ ) => Test.QuickCheck.Arbitrary (ExecutionConfiguration.TimetableCriteriaWeights.TimetableCriteriaWeights criterionWeight) where+	arbitrary	= do+		weightOfMaximiseComplianceWithFreePeriodPreferences			<- Test.QuickCheck.arbitrary+		weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity		<- Test.QuickCheck.arbitrary+		weightOfMaximiseMeanStudentClassSize					<- Test.QuickCheck.arbitrary+		weightOfMaximiseSynchronisationOfSynchronisedCourses			<- Test.QuickCheck.arbitrary+		weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio			<- Test.QuickCheck.arbitrary+		weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	<- Test.QuickCheck.arbitrary+		weightOfMinimiseDispersionOfStudentFreePeriodsPerDay			<- Test.QuickCheck.arbitrary+		weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			<- Test.QuickCheck.arbitrary+		weightOfMinimiseDispersionOfTeacherWorkload				<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanInterCampusMigrationsOfStudents			<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanInterCampusMigrationsOfTeachers			<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanLocationChangesOfTeachers				<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanLocusOperandiOfTeachers				<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge		<- Test.QuickCheck.arbitrary+		weightOfMinimiseMeanStudentBodyCombinationsPerLesson			<- Test.QuickCheck.arbitrary+		weightOfMinimiseRatioOfConsecutiveEqualLessons				<- Test.QuickCheck.arbitrary+		weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		<- Test.QuickCheck.arbitrary++		return {-to Gen-monad-} ExecutionConfiguration.TimetableCriteriaWeights.MkTimetableCriteriaWeights {+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseComplianceWithFreePeriodPreferences			= weightOfMaximiseComplianceWithFreePeriodPreferences,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity	= weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseMeanStudentClassSize					= weightOfMaximiseMeanStudentClassSize,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseSynchronisationOfSynchronisedCourses			= weightOfMaximiseSynchronisationOfSynchronisedCourses,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio		= weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest	= weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay			= weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay			= weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseDispersionOfTeacherWorkload				= weightOfMinimiseDispersionOfTeacherWorkload,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanInterCampusMigrationsOfStudents			= weightOfMinimiseMeanInterCampusMigrationsOfStudents,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers			= weightOfMinimiseMeanInterCampusMigrationsOfTeachers,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanLocationChangesOfTeachers			= weightOfMinimiseMeanLocationChangesOfTeachers,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanLocusOperandiOfTeachers				= weightOfMinimiseMeanLocusOperandiOfTeachers,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge		= weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge	= weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson			= weightOfMinimiseMeanStudentBodyCombinationsPerLesson,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfConsecutiveEqualLessons			= weightOfMinimiseRatioOfConsecutiveEqualLessons,+			ExecutionConfiguration.TimetableCriteriaWeights.getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay		= weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay+		}+
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/Campus.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.Campus.Campus'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.Campus(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.Campus	as Identifiers.Campus++instance Test.QuickCheck.Arbitrary Identifiers.Campus.Campus where+	arbitrary	= (Identifiers.Campus.mkCampus . ('z' :) . show) `fmap` Test.QuickCheck.elements [0 :: Int {-arbitrarily-} .. 1 {-arbitrarily-}]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Identifiers.Campus.Campus -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Identifiers.Campus.Campus, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Identifiers.Campus.Campus -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage campus	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) campus+
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/Level.hs view
@@ -0,0 +1,54 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.Level.Level'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.Level(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.Level	as Identifiers.Level++instance Test.QuickCheck.Arbitrary Identifiers.Level.Level where+	arbitrary	= (Identifiers.Level.mkLevel . ('l' :) . show) `fmap` Test.QuickCheck.elements [0 :: Int .. 9] {-arbitrarily-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Identifiers.Level.Level -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Identifiers.Level.Level, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Identifiers.Level.Level -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage level	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) level
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/LocationId.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.LocationId.LocationId'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.LocationId(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.LocationId	as Identifiers.LocationId++instance Test.QuickCheck.Arbitrary Identifiers.LocationId.LocationId where+	arbitrary	= (Identifiers.LocationId.mkLocationId . ('l' :) . show) `fmap` Test.QuickCheck.elements [0 :: Int {-arbitrarily-} .. 9 {-arbitrarily-}]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Identifiers.LocationId.LocationId -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Identifiers.LocationId.LocationId, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Identifiers.LocationId.LocationId -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage locationId	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) locationId+
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/Stream.hs view
@@ -0,0 +1,54 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.Stream.Stream'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.Stream(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.Stream	as Identifiers.Stream++instance Test.QuickCheck.Arbitrary Identifiers.Stream.Stream where+	arbitrary	= (Identifiers.Stream.mkStream . ('s' :) . show) `fmap` Test.QuickCheck.elements [0 :: Int .. 9] {-arbitrarily-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Identifiers.Stream.Stream -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Identifiers.Stream.Stream, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Identifiers.Stream.Stream -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage stream	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) stream
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/SynchronisationId.hs view
@@ -0,0 +1,32 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.SynchronisationId.SynchronisationId'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.SynchronisationId() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Identifiers.SynchronisationId	as Identifiers.SynchronisationId++instance Test.QuickCheck.Arbitrary Identifiers.SynchronisationId.SynchronisationId where+	arbitrary	= (Identifiers.SynchronisationId.mkSynchronisationId . ('c' :) . show) `fmap` Test.QuickCheck.elements [0 :: Int .. 9] {-arbitrarily-}
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/TeacherId.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.TeacherId.TeacherId'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.TeacherId(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.TeacherId	as Identifiers.TeacherId++instance Test.QuickCheck.Arbitrary Identifiers.TeacherId.TeacherId where+	arbitrary	= (Identifiers.TeacherId.mkTeacherId . ('t' :) . show) `fmap` Test.QuickCheck.elements [0 :: Int .. 9]	-- A constant list of teacher-ids from which to select arbitrarily.++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Identifiers.TeacherId.TeacherId -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Identifiers.TeacherId.TeacherId, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Identifiers.TeacherId.TeacherId -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage teacherId	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) teacherId+
+ src-test/WeekDaze/Test/QuickCheck/Identifiers/TimeslotId.hs view
@@ -0,0 +1,67 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Identifiers.TimeslotId.TimeslotId'.+-}++module WeekDaze.Test.QuickCheck.Identifiers.TimeslotId(+-- * Constants+	results+) where++import qualified	Data.Char+import			Control.Arrow((&&&))+import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.TimeslotId	as Identifiers.TimeslotId++instance Bounded Identifiers.TimeslotId.TimeslotId where+	minBound	= Identifiers.TimeslotId.mkTimeslotId 0+	maxBound	= Identifiers.TimeslotId.mkTimeslotId 4++instance Test.QuickCheck.Arbitrary Identifiers.TimeslotId.TimeslotId where+	arbitrary	= Test.QuickCheck.elements [minBound .. maxBound]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 1024} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Identifiers.TimeslotId.TimeslotId -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Identifiers.TimeslotId.TimeslotId, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Identifiers.TimeslotId.TimeslotId -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage timeslotId	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (+		uncurry (||) . (+			Data.Char.isDigit &&& (+				`elem` ".eox"	-- Avoid accidental specification of a decimal or exponential suffix, or erroneous interpretation as octal or hexadecimal.+			) . Data.Char.toLower+		)+	 ) timeslotId+
+ src-test/WeekDaze/Test/QuickCheck/Input/ConfigVersion.hs view
@@ -0,0 +1,42 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Input.ConfigVersion.ConfigVersion'.+-}++module WeekDaze.Test.QuickCheck.Input.ConfigVersion(+-- * Constants+	results+) where++import qualified	Data.List+import qualified	Test.QuickCheck+import qualified	WeekDaze.Input.ConfigVersion	as Input.ConfigVersion++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_configVersion] where+	prop_configVersion :: Input.ConfigVersion.ConfigVersion -> Test.QuickCheck.Property+	prop_configVersion configVersion	= Test.QuickCheck.label "prop_configVersion" . (== Data.List.dropWhileEnd (== 0) configVersion') . Input.ConfigVersion.fromString $ Input.ConfigVersion.toString configVersion' where+		configVersion'	= map abs configVersion+
+ src-test/WeekDaze/Test/QuickCheck/Input/Options.hs view
@@ -0,0 +1,100 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Input.Options.Options'.+-}++module WeekDaze.Test.QuickCheck.Input.Options(+-- * Types+-- ** Type-synonyms+	Options+) where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ExecutionConfiguration.ExecutionOptions			as ExecutionConfiguration.ExecutionOptions+import qualified	WeekDaze.Identifiers.Campus						as Identifiers.Campus+import qualified	WeekDaze.Identifiers.Level						as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId						as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.SynchronisationId					as Identifiers.SynchronisationId+import qualified	WeekDaze.Identifiers.TeacherId						as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId						as Identifiers.TimeslotId+import qualified	WeekDaze.Input.Options							as Input.Options+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters				as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Test.QuickCheck.Data.Student					as Test.Data.Student+import qualified	WeekDaze.Test.QuickCheck.ExecutionConfiguration.ExecutionOptions	as Test.ExecutionConfiguration.ExecutionOptions+import			WeekDaze.Test.QuickCheck.OutputConfiguration.Options()+import			WeekDaze.Test.QuickCheck.ProblemConfiguration.ProblemParameters()++instance (+	Enum				fecundityDecayRatio,+	Enum				populationDiversityRatio,+	Enum				timeslotId,+	Fractional			criterionWeight,+	Fractional			fecundityDecayRatio,+	Fractional			minimumContrastRatio,+	Fractional			populationDiversityRatio,+	Fractional			teachingRatio,+	Ord				level,+	Ord				locationId,+	Ord				minimumContrastRatio,+	Ord				synchronisationId,+	Ord				teacherId,+	Ord				timeslotId,+	Real				criterionWeight,+	Real				teachingRatio,+	Show				campus,+	Show				criterionWeight,+	Show				level,+	Show				locationId,+	Show				minimumContrastRatio,+	Show				synchronisationId,+	Show				timeslotId,+	Test.QuickCheck.Arbitrary	campus,+	Test.QuickCheck.Arbitrary	criterionWeight,+	Test.QuickCheck.Arbitrary	level,+	Test.QuickCheck.Arbitrary	locationId,+	Test.QuickCheck.Arbitrary	stream,+	Test.QuickCheck.Arbitrary	synchronisationId,+	Test.QuickCheck.Arbitrary	teacherId,+	Test.QuickCheck.Arbitrary	timeslotId+ ) => Test.QuickCheck.Arbitrary (Input.Options.Options campus criterionWeight fecundityDecayRatio level locationId minimumContrastRatio populationDiversityRatio stream synchronisationId teacherId teachingRatio timeslotId) where+	arbitrary	= do+		(configVersion, problemParameters, executionOptions, outputOptions)	<- Test.QuickCheck.arbitrary++		let+			options	= Input.Options.MkOptions {+				Input.Options.getConfigVersion		= configVersion,+				Input.Options.getExecutionOptions	= executionOptions,+				Input.Options.getOutputOptions		= outputOptions,+				Input.Options.getProblemParameters	= problemParameters+			}++-- Force a superficially redundant pass through those mutators which, as a side-effect, checks the compatibility of options.+		return {-to Gen-monad-} . Input.Options.setTimeslotIdBounds (+			ProblemConfiguration.ProblemParameters.getTimeslotIdBounds problemParameters+		 ) $ if ExecutionConfiguration.ExecutionOptions.getPermitTemporaryStudentBodyMerger executionOptions+			then Input.Options.setPermitTemporaryStudentBodyMerger True options+			else options++-- | Defines a concrete type for testing.+type Options	= Input.Options.Options Identifiers.Campus.Campus Test.ExecutionConfiguration.ExecutionOptions.CriterionWeight Test.ExecutionConfiguration.ExecutionOptions.FecundityDecayRatio Identifiers.Level.Level Identifiers.LocationId.LocationId Test.ExecutionConfiguration.ExecutionOptions.PopulationDiversityRatio Identifiers.SynchronisationId.SynchronisationId Identifiers.TeacherId.TeacherId Test.Data.Student.TeachingRatio Identifiers.TimeslotId.TimeslotId+
+ src-test/WeekDaze/Test/QuickCheck/Model/GenerateLessonColourFrom.hs view
@@ -0,0 +1,32 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2014-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'WeekDaze.Model.GenerateLessonColourFrom'.+-}++module WeekDaze.Test.QuickCheck.Model.GenerateLessonColourFrom() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Model.GenerateLessonColourFrom	as Model.GenerateLessonColourFrom++instance Test.QuickCheck.Arbitrary Model.GenerateLessonColourFrom.GenerateLessonColourFrom where+	arbitrary	= Test.QuickCheck.elements [minBound .. maxBound]
+ src-test/WeekDaze/Test/QuickCheck/Model/Lesson.hs view
@@ -0,0 +1,38 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Model.Lesson.Lesson'.+-}++module WeekDaze.Test.QuickCheck.Model.Lesson() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Model.Lesson	as Model.Lesson+import			WeekDaze.Test.QuickCheck.Data.Subject()++instance (+	Show				level,+	Test.QuickCheck.Arbitrary	resourceIds,+	Test.QuickCheck.Arbitrary	level+ ) => Test.QuickCheck.Arbitrary (Model.Lesson.Lesson resourceIds level) where+	arbitrary	= uncurry Model.Lesson.MkLesson `fmap` Test.QuickCheck.arbitrary {-pair-}+
+ src-test/WeekDaze/Test/QuickCheck/Model/TimetableAxis.hs view
@@ -0,0 +1,44 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Model.TimetableAxis.TimetableAxis'.+-}++module WeekDaze.Test.QuickCheck.Model.TimetableAxis(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Model.TimetableAxis	as Model.TimetableAxis++instance Test.QuickCheck.Arbitrary Model.TimetableAxis.Axis where+	arbitrary	= Test.QuickCheck.elements Model.TimetableAxis.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_getOthers] where+	prop_getOthers :: Model.TimetableAxis.Axis -> Test.QuickCheck.Property+	prop_getOthers x	= Test.QuickCheck.label "prop_getOthers" . (== x) . (\[y, z] -> Model.TimetableAxis.getPerpendicular y z) $ Model.TimetableAxis.getOthers x+
+ src-test/WeekDaze/Test/QuickCheck/Model/TimetableAxisTraversal.hs view
@@ -0,0 +1,56 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Model.TimetableAxisTraversal.TimetableAxisTraversal'.+-}++module WeekDaze.Test.QuickCheck.Model.TimetableAxisTraversal(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Model.TimetableAxisTraversal	as Model.TimetableAxisTraversal+import			WeekDaze.Test.QuickCheck.Model.TimetableAxis()++instance Test.QuickCheck.Arbitrary Model.TimetableAxisTraversal.AxisTraversal where+	arbitrary	= uncurry Model.TimetableAxisTraversal.MkAxisTraversal `fmap` Test.QuickCheck.arbitrary {-pair-}++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read+--	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage	-- CAVEAT: the derived implementation of "Read" for "Model.TimetableAxis.TimetableAxis" fails.+ ] where+	prop_readPrependedWhiteSpace :: Model.TimetableAxisTraversal.AxisTraversal -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Model.TimetableAxisTraversal.AxisTraversal, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Model.TimetableAxisTraversal.AxisTraversal -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage axisTraversal	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (`elem` "+-ODT") axisTraversal+
+ src-test/WeekDaze/Test/QuickCheck/Model/TimetableAxisTriple.hs view
@@ -0,0 +1,81 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Model.TimetableAxisTriple.TimetableAxisTriple'.+-}++module WeekDaze.Test.QuickCheck.Model.TimetableAxisTriple(+-- * Constants+--	range1,+--	range2,+	results+) where++import qualified	Data.List+import qualified	Test.QuickCheck+import qualified	ToolShed.Data.List+import qualified	WeekDaze.Model.TimetableAxisTraversal	as Model.TimetableAxisTraversal+import qualified	WeekDaze.Model.TimetableAxisTriple	as Model.TimetableAxisTriple+import qualified	WeekDaze.Model.Traverse			as Model.Traverse+import			Test.QuickCheck((==>))+import			WeekDaze.Test.QuickCheck.Model.TimetableAxisTraversal()++instance Test.QuickCheck.Arbitrary Model.TimetableAxisTriple.Axes where+	arbitrary	= do+		(x, y, z)	<- Test.QuickCheck.arbitrary++		if (/= 3) . length $ Data.List.nubBy (ToolShed.Data.List.equalityBy Model.TimetableAxisTraversal.getAxis) [x, y, z]+			then Test.QuickCheck.arbitrary	-- Recurse.+			else return {-to Gen-monad-} $ Model.TimetableAxisTriple.mkAxes (x, y, z)++-- | A range of test coordinates.+range1 :: [Int]+range1	= [0 .. 1]++-- | A range of test coordinates.+range2 :: [Bool]+range2	= [minBound .. maxBound]++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_generateRasterCoordinates,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_generateRasterCoordinatesSense,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_toList+ ] where+	prop_generateRasterCoordinates :: Model.TimetableAxisTriple.Axes -> Model.TimetableAxisTriple.Axes -> Test.QuickCheck.Property+	prop_generateRasterCoordinates triple1 triple2	= triple1 /= triple2 && not (+		any Model.TimetableAxisTriple.hasWildSense [triple1, triple2]+	 ) ==> Test.QuickCheck.label "prop_generateRasterCoordinates" $ Data.List.sort (+		Model.Traverse.generateRasterCoordinates triple1 range1 range2+	 ) == Data.List.sort (+		Model.Traverse.generateRasterCoordinates triple2 range1 range2+	 )++	prop_generateRasterCoordinatesSense, prop_toList :: Model.TimetableAxisTriple.Axes -> Test.QuickCheck.Property+	prop_generateRasterCoordinatesSense triple	= not (+		Model.TimetableAxisTriple.hasWildSense triple+	 ) ==> Test.QuickCheck.label "prop_generateRasterCoordinatesSense" $ Model.Traverse.generateRasterCoordinates triple range1 range2 == reverse (+		Model.Traverse.generateRasterCoordinates (Model.TimetableAxisTriple.invertSense triple) range1 range2+	 )+	prop_toList axes				= Test.QuickCheck.label "prop_toList" $ Model.TimetableAxisTriple.fromList (Model.TimetableAxisTriple.toList axes) == axes+
+ src-test/WeekDaze/Test/QuickCheck/OutputConfiguration/FileFormat.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'OutputConfiguration.Options.FileFormat'.+-}++module WeekDaze.Test.QuickCheck.OutputConfiguration.FileFormat() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.OutputConfiguration.FileFormat	as OutputConfiguration.FileFormat+import			WeekDaze.Test.QuickCheck.OutputConfiguration.Format()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Fractional	minimumContrastRatio,+	Ord		minimumContrastRatio,+	Show		minimumContrastRatio+ ) => Test.QuickCheck.Arbitrary (OutputConfiguration.FileFormat.FileFormat minimumContrastRatio) where+	arbitrary	= OutputConfiguration.FileFormat.mkFileFormat <$> (+		('f' :) . show <$> Test.QuickCheck.elements [0 :: Int {-arbitrarily-} .. 9 {-arbitrarily-}]	-- Topic.+	 ) <*> Test.QuickCheck.arbitrary {-format-}+
+ src-test/WeekDaze/Test/QuickCheck/OutputConfiguration/Format.hs view
@@ -0,0 +1,41 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'OutputConfiguration.Format.Format'.+-}++module WeekDaze.Test.QuickCheck.OutputConfiguration.Format() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.OutputConfiguration.Format	as OutputConfiguration.Format+import			WeekDaze.Test.QuickCheck.OutputConfiguration.Style()+import			WeekDaze.Test.QuickCheck.OutputConfiguration.View()++instance (+	Fractional	minimumContrastRatio,+	Ord		minimumContrastRatio+ ) => Test.QuickCheck.Arbitrary (OutputConfiguration.Format.Format minimumContrastRatio) where+	arbitrary	= Test.QuickCheck.oneof [+		fmap OutputConfiguration.Format.XHTML Test.QuickCheck.arbitrary {-Style-},+		fmap OutputConfiguration.Format.XML Test.QuickCheck.arbitrary {-View-}+	 ]+
+ src-test/WeekDaze/Test/QuickCheck/OutputConfiguration/Options.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'OutputConfiguration.Options.Options'.+-}++module WeekDaze.Test.QuickCheck.OutputConfiguration.Options() where++import qualified	Test.QuickCheck+import			ToolShed.Test.QuickCheck.Arbitrary.Set()+import qualified	WeekDaze.OutputConfiguration.Options		as OutputConfiguration.Options+import			WeekDaze.Test.QuickCheck.OutputConfiguration.FileFormat()+import			WeekDaze.Test.QuickCheck.OutputConfiguration.Verbosity()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Fractional	minimumContrastRatio,+	Ord		minimumContrastRatio,+	Show		minimumContrastRatio+ ) => Test.QuickCheck.Arbitrary (OutputConfiguration.Options.Options minimumContrastRatio) where+	arbitrary	= OutputConfiguration.Options.mkOptions <$> Test.QuickCheck.arbitrary {-FileFormats-} <*> (+		fmap (('c' :) . show . (`mod` (10 :: Int))) <$> Test.QuickCheck.arbitrary	-- maybeOutputConfigFilePath.+	 ) <*> Test.QuickCheck.elements [1 .. 15] {-NDecimalDigits-} <*> (+		('m' :) . show . (`mod` (10 :: Int)) <$> Test.QuickCheck.arbitrary	-- mnemonicSeparator.+	 ) <*> Test.QuickCheck.arbitrary {-Verbosity-}+
+ src-test/WeekDaze/Test/QuickCheck/OutputConfiguration/Style.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'OutputConfiguration.Style.Style'.+-}++module WeekDaze.Test.QuickCheck.OutputConfiguration.Style() where++import qualified	Control.Arrow+import qualified	Test.QuickCheck+import qualified	WeekDaze.OutputConfiguration.Style	as OutputConfiguration.Style+import			ToolShed.Test.QuickCheck.Arbitrary.Set()+import			WeekDaze.Test.QuickCheck.Model.GenerateLessonColourFrom()+import			WeekDaze.Test.QuickCheck.OutputConfiguration.View()+import			WeekDaze.Test.QuickCheck.Temporal.Day()+import			WeekDaze.Test.QuickCheck.Temporal.TimeAxes()++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance (+	Fractional	minimumContrastRatio,+	Ord		minimumContrastRatio+ ) => Test.QuickCheck.Arbitrary (OutputConfiguration.Style.Style minimumContrastRatio) where+	arbitrary	= OutputConfiguration.Style.mkStyle <$> Test.QuickCheck.arbitrary {-Set View-} <*> (+		fmap (('c' :) . show . (`mod` (10 :: Int))) <$> Test.QuickCheck.arbitrary	-- maybeCSSFilePath.+	 ) <*> Test.QuickCheck.arbitrary {-getMergeDuplicateTimeslots-} <*> Test.QuickCheck.arbitrary {-getDisplayAxisLabels-} <*> Test.QuickCheck.arbitrary {-getDisplayRuntimeLog-} <*> Test.QuickCheck.arbitrary {-getDisplaySupplementaryInformation-} <*> Test.QuickCheck.arbitrary {-getWeekend-} <*> (+		fmap (+			Control.Arrow.second $ recip . fromInteger . succ . (`mod` 16)	-- Constrain to the unit interval.+		) <$> Test.QuickCheck.arbitrary	--getMaybeGenerateLessonColour.+	 )+
+ src-test/WeekDaze/Test/QuickCheck/OutputConfiguration/Verbosity.hs view
@@ -0,0 +1,32 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Distribution.Verbosity.Verbosity'.+-}++module WeekDaze.Test.QuickCheck.OutputConfiguration.Verbosity() where++import qualified	Distribution.Verbosity+import qualified	Test.QuickCheck++instance Test.QuickCheck.Arbitrary Distribution.Verbosity.Verbosity where+	arbitrary	= Test.QuickCheck.elements [minBound .. maxBound]
+ src-test/WeekDaze/Test/QuickCheck/OutputConfiguration/View.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2014 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'OutputConfiguration.View.View'.+-}++module WeekDaze.Test.QuickCheck.OutputConfiguration.View() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.OutputConfiguration.View	as OutputConfiguration.View++instance Test.QuickCheck.Arbitrary OutputConfiguration.View.View where+	arbitrary	= Test.QuickCheck.elements [OutputConfiguration.View.LocationView, OutputConfiguration.View.StudentView, OutputConfiguration.View.TeacherView]+
+ src-test/WeekDaze/Test/QuickCheck/ProblemConfiguration/ProblemParameters.hs view
@@ -0,0 +1,100 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP #-}+{-+	Copyright (C) 2013-2016 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ProblemConfiguration.ProblemParameters.ProblemParameters'.+-}++module WeekDaze.Test.QuickCheck.ProblemConfiguration.ProblemParameters(+-- * Types+-- ** Type-synonyms+	ProblemParameters+) where++import qualified	Control.Arrow+import qualified	Data.Map+import qualified	Test.QuickCheck+import qualified	WeekDaze.Identifiers.Campus			as Identifiers.Campus+import qualified	WeekDaze.Identifiers.Level			as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId			as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.SynchronisationId		as Identifiers.SynchronisationId+import qualified	WeekDaze.Identifiers.TeacherId			as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId			as Identifiers.TimeslotId+import qualified	WeekDaze.ProblemConfiguration.ProblemParameters	as ProblemConfiguration.ProblemParameters+import qualified	WeekDaze.Test.QuickCheck.Data.Teacher		as Test.Data.Teacher+import			WeekDaze.Test.QuickCheck.Aggregate.StudentBody()+import			WeekDaze.Test.QuickCheck.Data.Group()+import			WeekDaze.Test.QuickCheck.Data.Student()+import			WeekDaze.Test.QuickCheck.Identifiers.Stream()+import			WeekDaze.Test.QuickCheck.Identifiers.TeacherId()+import			WeekDaze.Test.QuickCheck.ProblemConfiguration.ProblemValidationSwitches()+import			WeekDaze.Test.QuickCheck.ProblemConfiguration.TimetableValidationSwitches()++#if !MIN_VERSION_QuickCheck(2,8,2)+import			ToolShed.Test.QuickCheck.Arbitrary.Map()+#endif++instance (+	Fractional			teachingRatio,+	Ord				level,+	Ord				locationId,+	Ord				synchronisationId,+	Ord				teacherId,+	Ord				timeslotId,+	Real				teachingRatio,+	Show				level,+	Show				locationId,+	Show				synchronisationId,+	Show				timeslotId,+	Show				campus,+	Test.QuickCheck.Arbitrary	level,+	Test.QuickCheck.Arbitrary	locationId,+	Test.QuickCheck.Arbitrary	stream,+	Test.QuickCheck.Arbitrary	synchronisationId,+	Test.QuickCheck.Arbitrary	teacherId,+	Test.QuickCheck.Arbitrary	timeslotId,+	Test.QuickCheck.Arbitrary	campus+ ) => Test.QuickCheck.Arbitrary (ProblemConfiguration.ProblemParameters.ProblemParameters campus level locationId stream synchronisationId teacherId teachingRatio timeslotId) where+	arbitrary	= do+		(problemValidationSwitches, timetableValidationSwitches, locationCatalogue, studentBodyRegister, teacherRegister)	<- Test.QuickCheck.arbitrary+		groupCatalogue														<- fmap (+			Data.Map.fromList . map (Control.Arrow.first $ ('g' :) . show . (`mod` (10 :: Int))) . Data.Map.toList+		 ) Test.QuickCheck.arbitrary	-- Avoid constructing keys containing escaped characters.+		timeslotIdBounds													<- fmap (+			\bounds@(l, r) -> if l > r+				then (r, l)+				else bounds+		 ) Test.QuickCheck.arbitrary++		return {-to Gen-monad-} ProblemConfiguration.ProblemParameters.MkProblemParameters {+			ProblemConfiguration.ProblemParameters.getProblemValidationSwitches	= problemValidationSwitches,+			ProblemConfiguration.ProblemParameters.getTimetableValidationSwitches	= timetableValidationSwitches,+			ProblemConfiguration.ProblemParameters.getGroupCatalogue		= groupCatalogue,+			ProblemConfiguration.ProblemParameters.getLocationCatalogue		= locationCatalogue,+			ProblemConfiguration.ProblemParameters.getStudentBodyRegister		= studentBodyRegister,+			ProblemConfiguration.ProblemParameters.getTeacherRegister		= teacherRegister,+			ProblemConfiguration.ProblemParameters.getTimeslotIdBounds		= timeslotIdBounds+		}++-- | Defines a concrete type for testing.+type ProblemParameters	= ProblemConfiguration.ProblemParameters.ProblemParameters Identifiers.Campus.Campus Identifiers.Level.Level Identifiers.LocationId.LocationId Identifiers.SynchronisationId.SynchronisationId Identifiers.TeacherId.TeacherId Test.Data.Teacher.TeachingRatio Identifiers.TimeslotId.TimeslotId+
+ src-test/WeekDaze/Test/QuickCheck/ProblemConfiguration/ProblemValidationSwitches.hs view
@@ -0,0 +1,93 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ProblemConfiguration.ProblemValidationSwitches.ProblemValidationSwitches'.++ [@CAVEAT@]	Actually the implementation isn't arbitrary at all, rather just a constant record of off switches; which facilitates the generation of arbitrary /ProblemParameters/.+-}++module WeekDaze.Test.QuickCheck.ProblemConfiguration.ProblemValidationSwitches() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ProblemConfiguration.ProblemValidationSwitches	as ProblemConfiguration.ProblemValidationSwitches++instance Test.QuickCheck.Arbitrary ProblemConfiguration.ProblemValidationSwitches.ProblemValidationSwitches where+	arbitrary	= return {-to Gen-monad-} ProblemConfiguration.ProblemValidationSwitches.MkProblemValidationSwitches {+		ProblemConfiguration.ProblemValidationSwitches.getCheckAvailabilityOfAnyGroupMember				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckCapacityOfLocationsForMeetings				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckCoursesForSynchronousSpecifiedTimes			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckDuplicateMeetingLocationIds				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckDuplicateOwnLocationIds					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForAlternativesToSynchronisedCourses			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForDuplicateStudentIds					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForIdleStudents						= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForIdleTeachers						= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForInvalidMeetingTimes					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForMultipleCoursesPerTeacherPerSynchronisationId		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentFacilities					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentGroupIds					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentMeetingLocationIds				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForNonExistentOwnLocationIds				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForOverloadedStudents					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSingletonSynchronisedCourses				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForStudentsRequiringMultipleSynchronisedSubjects		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForStudentsWithUnrealisableFreePeriodPreference		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithDifferentIdealTimeslots	= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithDifferentLessonsPerWeek	= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithExcessLessonsPerWeek		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithExcessSpecifiedTimes		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithExcessTimeslotRequests		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithoutSuitableLocations		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForSynchronisedCoursesWithUnavailableSpecifiedDays	= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckForTeachersWithUnrealisableFreePeriodPreference		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodiesExceedTeachers				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsCapacityOfAllLocations		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckIfStudentBodySizeExceedsLocationCapacity			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckIndependenceOfStudentTimeslotsRequestsAndMeetings	= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckIndependenceOfTeacherTimeslotsRequestsAndMeetings	= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckLocationsAvailabilityToSupportCourses			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckLocationsForSynchronousSpecifiedTimes			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckMeetingLocationsAvailability				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckMinimumConsecutiveLessons				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckNullGroupId						= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckNullLocationCatalogue					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckNullStudentBodyRegister					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckNullTeacherRegister					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckOwnLocationsAvailability					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckRequiredLessonsPerWeek					= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckSimultaneousAvailabilityOfGroupMembers			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsAvailabilityForMandatoryMeetings			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsAvailabilityForSpecifiedTimes			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsForMultipleLevelsOfSameTopic			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsForSynchronousMeetings				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsLowerWorkloadBound				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckStudentsUpperWorkloadBound				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckSubjectExistence						= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckSuitableLocationsForKnowledgeRequirements		= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckTeachersAvailabilityForMandatoryMeetings			= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckTeachersForSynchronousMeetings				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckTeachersUpperWorkloadBound				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckTeachingCapacityBySubject				= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckTimeslotIdBounds						= False,+		ProblemConfiguration.ProblemValidationSwitches.getCheckTimeslotRequests						= False+	}+
+ src-test/WeekDaze/Test/QuickCheck/ProblemConfiguration/TimetableValidationSwitches.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'ProblemConfiguration.TimetableValidationSwitches.TimetableValidationSwitches'.+-}++module WeekDaze.Test.QuickCheck.ProblemConfiguration.TimetableValidationSwitches() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.ProblemConfiguration.TimetableValidationSwitches	as ProblemConfiguration.TimetableValidationSwitches++#if !MIN_VERSION_base(4,8,0)+import	Control.Applicative((<$>), (<*>))+#endif++instance Test.QuickCheck.Arbitrary ProblemConfiguration.TimetableValidationSwitches.TimetableValidationSwitches where+	arbitrary	= ProblemConfiguration.TimetableValidationSwitches.MkTimetableValidationSwitches+		<$> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+		<*> Test.QuickCheck.arbitrary+
+ src-test/WeekDaze/Test/QuickCheck/StudentView/Lesson.hs view
@@ -0,0 +1,93 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'StudentView.Lesson.Lesson'.+-}++module WeekDaze.Test.QuickCheck.StudentView.Lesson(+-- * Types+-- ** Type-synonyms+	Lesson,+-- * Constants+	results+) where++import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	WeekDaze.Aggregate.StudentClass		as Aggregate.StudentClass+import qualified	WeekDaze.Identifiers.Level		as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId		as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.TeacherId		as Identifiers.TeacherId+import qualified	WeekDaze.LocationView.Lesson		as LocationView.Lesson+import qualified	WeekDaze.Model.Lesson			as Model.Lesson+import qualified	WeekDaze.Model.ResourceUser		as Model.ResourceUser+import qualified	WeekDaze.StudentView.Lesson		as StudentView.Lesson+import qualified	WeekDaze.StudentView.LessonResourceIds	as StudentView.LessonResourceIds+import qualified	WeekDaze.TeacherView.Lesson		as TeacherView.Lesson+import			Test.QuickCheck((==>))+import			ToolShed.Test.QuickCheck.Arbitrary.Set()+import			WeekDaze.Test.QuickCheck.Aggregate.StudentBody()+import			WeekDaze.Test.QuickCheck.Identifiers.LocationId()+import			WeekDaze.Test.QuickCheck.Identifiers.TeacherId()+import			WeekDaze.Test.QuickCheck.Model.Lesson()++instance (+	Test.QuickCheck.Arbitrary	locationId,+	Test.QuickCheck.Arbitrary	teacherId+ ) => Test.QuickCheck.Arbitrary (StudentView.LessonResourceIds.LessonResourceIds locationId teacherId) where+	arbitrary	= uncurry StudentView.LessonResourceIds.MkLessonResourceIds `fmap` Test.QuickCheck.arbitrary {-pair-}++-- | Defines a concrete type for testing.+type Lesson	= StudentView.Lesson.Lesson Identifiers.LocationId.LocationId Identifiers.TeacherId.TeacherId Identifiers.Level.Level++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_areMergeableWith,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_areMutuallyMergeable,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_areMergeable,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_alternativeView+ ] where+	prop_areMergeableWith :: Lesson -> Lesson -> Test.QuickCheck.Property+	prop_areMergeableWith l r = Test.QuickCheck.label "prop_areMergeableWith" $ Model.ResourceUser.areMergeableWith l [r] == Model.ResourceUser.areMergeableWith r [l]++	prop_areMutuallyMergeable :: Int -> Lesson -> Test.QuickCheck.Property+	prop_areMutuallyMergeable i	= Test.QuickCheck.label "prop_areMutuallyMergeable" . Model.ResourceUser.areMutuallyMergeable . replicate (i `mod` 10 {-arbitrarily-})++	prop_areMergeable :: [Lesson] -> Test.QuickCheck.Property+	prop_areMergeable l	= Test.QuickCheck.label "prop_areMergeable" $ if Model.ResourceUser.areMutuallyMergeable l'+		then all (`Model.ResourceUser.areMergeableWith` l') l'+		else any (not . (`Model.ResourceUser.areMergeableWith` l')) l'+		where+			l'	= take 3 {-arbitrarily-} l++	prop_alternativeView :: Aggregate.StudentClass.StudentClass -> Lesson -> Test.QuickCheck.Property+	prop_alternativeView studentClass lesson	= not (Data.Set.null studentClass) ==> Test.QuickCheck.label "prop_alternativeView" $ LocationView.Lesson.toStudentView (+		StudentView.LessonResourceIds.getLocationId $ Model.Lesson.getResourceIds lesson+	 ) (+		LocationView.Lesson.fromStudentView studentClass lesson+	 ) == TeacherView.Lesson.toStudentView (+		StudentView.LessonResourceIds.getTeacherId $ Model.Lesson.getResourceIds lesson+	 ) (+		TeacherView.Lesson.fromStudentView lesson studentClass+	 )+
+ src-test/WeekDaze/Test/QuickCheck/StudentView/Timetable.hs view
@@ -0,0 +1,357 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties for 'StudentView.Timetable.Timetable'.+-}++module WeekDaze.Test.QuickCheck.StudentView.Timetable(+-- * Types+-- ** Type-synonyms+--	Timetable,+-- * Constants+	results,+-- * Functions+--	removeIncompatibleLessons,+--	reindexStudentBodyRegister+) where++import			Control.Arrow((***), (&&&))+import			Data.Map((!))+import			Data.Set((\\))+import qualified	Control.Arrow+import qualified	Data.Array.IArray+import qualified	Data.Foldable+import qualified	Data.List+import qualified	Data.Map+import qualified	Data.Maybe+import qualified	Data.Set+import qualified	Data.Tuple+import qualified	Test.QuickCheck+import			Test.QuickCheck((==>))+import qualified	ToolShed.Data.List+import qualified	ToolShed.Data.List.Runlength+import			ToolShed.Test.QuickCheck.Arbitrary.Array()+import qualified	WeekDaze.Aggregate.StudentBody				as Aggregate.StudentBody+import qualified	WeekDaze.Aggregate.StudentBodyRegister			as Aggregate.StudentBodyRegister+import qualified	WeekDaze.Aggregate.StudentClass				as Aggregate.StudentClass+import qualified	WeekDaze.Data.Resource					as Data.Resource+import qualified	WeekDaze.Identifiers.Level				as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId				as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.TeacherId				as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId				as Identifiers.TimeslotId+import qualified	WeekDaze.LinearModel.Timetable				as LinearModel.Timetable+import qualified	WeekDaze.LocationView.Timetable				as LocationView.Timetable+import qualified	WeekDaze.Model.GeneralisedBooking			as Model.GeneralisedBooking+import qualified	WeekDaze.Model.Lesson					as Model.Lesson+import qualified	WeekDaze.Model.ResourceUser				as Model.ResourceUser+import qualified	WeekDaze.Model.Timetable				as Model.Timetable+import qualified	WeekDaze.Model.TimetableCoordinates			as Model.TimetableCoordinates+import qualified	WeekDaze.Model.TimetableForWeek				as Model.TimetableForWeek+import qualified	WeekDaze.StudentView.LessonResourceIds			as StudentView.LessonResourceIds+import qualified	WeekDaze.StudentView.Timetable				as StudentView.Timetable+import qualified	WeekDaze.TeacherView.Timetable				as TeacherView.Timetable+import qualified	WeekDaze.Temporal.Day					as Temporal.Day+import qualified	WeekDaze.Temporal.Time					as Temporal.Time+import qualified	WeekDaze.Test.QuickCheck.Aggregate.StudentBodyRegister	as Test.Aggregate.StudentBodyRegister+import qualified	WeekDaze.Test.QuickCheck.StudentView.Lesson		as Test.StudentView.Lesson+import qualified	WeekDaze.Test.QuickCheck.Temporal.Time			as Test.Temporal.Time++-- | Remove incompatible /lesson/s.+removeIncompatibleLessons :: (+	Data.Array.IArray.Ix	timeslotId,+	Eq			locationId,+	Eq			level,+	Eq			teacherId+ ) => StudentView.Timetable.Timetable timeslotId locationId teacherId level -> StudentView.Timetable.Timetable timeslotId locationId teacherId level+removeIncompatibleLessons studentViewTimetable	= foldr (+	\(coordinates, _) studentViewTimetable'	-> if Model.ResourceUser.areMutuallyMergeable $ Model.Timetable.extractSynchronousLessonsAt (+		Model.TimetableCoordinates.getTime coordinates+	) studentViewTimetable'+		then studentViewTimetable'+		else Model.Timetable.undefineTimeslot coordinates studentViewTimetable'+ ) studentViewTimetable {-initial value-} $ LinearModel.Timetable.fromTimetable studentViewTimetable++-- | Change the keys (/student-bodies/) of an arbitrary /studentBodyRegister/ to match those of the specified /studentViewTimetable/.+reindexStudentBodyRegister+	:: StudentView.Timetable.Timetable timeslotId locationId teacherId level+	-> Aggregate.StudentBodyRegister.StudentBodyRegister level stream teachingRatio+	-> Aggregate.StudentBodyRegister.StudentBodyRegister level stream teachingRatio+reindexStudentBodyRegister studentViewTimetable studentBodyRegister+	| Data.Map.size studentViewTimetable > Data.Map.size studentBodyRegister	= error "WeekDaze.Test.QuickCheck.StudentView.Timetable.reindexStudentBodyRegister:\tStudentBodyRegister too small."+	| otherwise	= Data.Map.fromList $ zipWith (+		\(k, _) (_, v)	-> (k, v)+	) (+		Data.Map.toList studentViewTimetable+	) (+		Data.Map.toList studentBodyRegister+	)++-- | Defines a concrete type for testing.+type Timetable	= StudentView.Timetable.Timetable Identifiers.TimeslotId.TimeslotId Identifiers.LocationId.LocationId Identifiers.TeacherId.TeacherId Identifiers.Level.Level++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results = sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_purge,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_areBookedResourcesAt,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_teacherView,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_locationView,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_breaksRoutine,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_extractStudentClassAt,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findStudentClassesByLesson,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_weightedMeanStudentBodyCombinationsPerLesson1,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findStudentClassesByLessonFor,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_countLessons,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_weightedMeanStudentBodyCombinationsPerLesson2,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_extractSynchronousLessonsAt,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findGeneralisedLessonRunlengthsByCoordinates,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findSeparatedEqualLessonsWithinAnyDayByObserverId,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_weightedMeanStudentBodyCombinationsPerLesson3,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_calculateMeanStudentClassSize,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay',+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_extractDistinctLessons+ ] where+	prop_purge, prop_areBookedResourcesAt, prop_teacherView, prop_locationView, prop_breaksRoutine, prop_extractStudentClassAt, prop_findStudentClassesByLesson, prop_weightedMeanStudentBodyCombinationsPerLesson1, prop_findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId :: Timetable -> Test.QuickCheck.Property++	prop_purge studentViewTimetable	= Test.QuickCheck.label "prop_purge" $ Model.Timetable.purge studentViewTimetable == Model.Timetable.undefineTimeslots studentViewTimetable (Model.Timetable.extractCoordinates studentViewTimetable)++	prop_areBookedResourcesAt studentViewTimetable	= Test.QuickCheck.label "prop_areBookedResourcesAt" $ all (+		($ studentViewTimetable) . StudentView.Timetable.areBookedResourcesAt . Control.Arrow.first Model.TimetableCoordinates.getTime+	 ) $ LinearModel.Timetable.fromTimetable studentViewTimetable++	prop_teacherView studentViewTimetable	= Test.QuickCheck.label "prop_teacherView" $ TeacherView.Timetable.toStudentViewTimetable (+		Model.Timetable.mkFreeTimetable (StudentView.Timetable.getStudentBodies validStudentViewTimetable) timeslotIdBounds+	 ) (+		TeacherView.Timetable.fromStudentViewTimetable True (+			Model.Timetable.mkFreeTimetable (+				Data.Set.toList . foldr (+					Data.Set.insert . StudentView.LessonResourceIds.getTeacherId . Model.Lesson.getResourceIds+				) Data.Set.empty $ Model.Timetable.extractLessons validStudentViewTimetable+			) timeslotIdBounds+		) validStudentViewTimetable+	 ) == validStudentViewTimetable where+		timeslotIdBounds		= (minBound, maxBound)+		validStudentViewTimetable	= removeIncompatibleLessons studentViewTimetable++	prop_locationView studentViewTimetable	= Test.QuickCheck.label "prop_locationView" $ LocationView.Timetable.toStudentViewTimetable (+		Model.Timetable.mkFreeTimetable (StudentView.Timetable.getStudentBodies validStudentViewTimetable) timeslotIdBounds+	 ) (+		LocationView.Timetable.fromStudentViewTimetable True (+			Model.Timetable.mkFreeTimetable (+				Data.Set.toList . foldr (+					Data.Set.insert . StudentView.LessonResourceIds.getLocationId . Model.Lesson.getResourceIds+				) Data.Set.empty $ Model.Timetable.extractLessons validStudentViewTimetable+			) timeslotIdBounds+		) validStudentViewTimetable+	 ) == validStudentViewTimetable where+		timeslotIdBounds		= (minBound, maxBound)+		validStudentViewTimetable	= removeIncompatibleLessons studentViewTimetable++	prop_breaksRoutine studentViewTimetable	= Test.QuickCheck.label "prop_breaksRoutine" . not . any (+		uncurry (StudentView.Timetable.breaksRoutine studentViewTimetable)+	 ) . map (+		Control.Arrow.first Model.TimetableCoordinates.getObserverId+	 ) $ LinearModel.Timetable.fromTimetable studentViewTimetable++	prop_extractStudentClassAt studentViewTimetable	= Test.QuickCheck.label "prop_extractStudentClassAt" . all (+		\(time, lesson) -> uncurry (&&) . (+			Data.Foldable.all (+				\studentBody -> Model.Timetable.getMaybeLesson (studentBody, time) studentViewTimetable == Just lesson+			) &&& Data.Foldable.all (+				\studentBody -> Model.Timetable.getMaybeLesson (studentBody, time) studentViewTimetable /= Just lesson+			) . (Data.Map.keysSet studentViewTimetable \\)+		) $ StudentView.Timetable.extractStudentClassAt (time, lesson) studentViewTimetable+	 ) . map (+		Control.Arrow.first Model.TimetableCoordinates.getTime+	 ) $ LinearModel.Timetable.fromTimetable studentViewTimetable++	prop_findStudentClassesByLesson studentViewTimetable	= Test.QuickCheck.label "prop_findStudentClassesByLesson" $ Data.Map.unionsWith Data.Set.union (+		map (StudentView.Timetable.findStudentClassesByLessonFor studentViewTimetable) $ StudentView.Timetable.getStudentBodies studentViewTimetable+	 ) == StudentView.Timetable.findStudentClassesByLesson studentViewTimetable++	prop_weightedMeanStudentBodyCombinationsPerLesson1 studentViewTimetable	= Test.QuickCheck.label "prop_weightedMeanStudentBodyCombinationsPerLesson1" $ StudentView.Timetable.calculateWeightedMeanStudentBodyCombinationsPerLesson studentViewTimetable == (calculateWeightedMeanStudentBodyCombinationsPerLesson' studentViewTimetable :: Rational) where+		calculateWeightedMeanStudentBodyCombinationsPerLesson' timetable+			| denominator == 0	= 1	-- (zero / zero) -> 1, at the limit of only one lesson-definition in the timetable.+			| otherwise		= fromIntegral numerator / fromIntegral denominator+			where+				(numerator, denominator)	= foldr (+					\(nStudentBodyCombinations, nStudents)	-> ((nStudentBodyCombinations * nStudents {-weighting-}) +) *** (nStudents +)+				 ) (0, 0) [+					(Data.Set.size studentBodyCombinations, Aggregate.StudentBody.getSize studentBody) |+						studentBody		<- StudentView.Timetable.getStudentBodies timetable,+						studentBodyCombinations	<- Data.Map.elems $ StudentView.Timetable.findStudentClassesByLessonFor timetable studentBody+				 ] -- List-comprehension. Scan the domain of all student-bodies & all the distinct lessons booked for them++	prop_findStudentClassesByLessonFor, prop_countLessons, prop_weightedMeanStudentBodyCombinationsPerLesson2, prop_extractSynchronousLessonsAt :: Timetable -> [(Test.Temporal.Time.Time, Test.StudentView.Lesson.Lesson)] -> Test.QuickCheck.Property+	prop_findStudentClassesByLessonFor studentViewTimetable linearTimetableForWeek	= Test.QuickCheck.label "prop_findStudentClassesByLessonFor" . (+		\studentViewTimetable'	-> all (+			Data.Foldable.all (== Data.Set.singleton (Data.Set.fromList studentBodies)) . StudentView.Timetable.findStudentClassesByLessonFor studentViewTimetable'+		) studentBodies+	 ) $ foldr Model.Timetable.defineTimeslot (+		Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+	 ) [+		((studentBody, time), Just lesson) |+			(time, lesson)	<- take Test.Temporal.Time.nTimeslotsPerWeek linearTimetableForWeek,+			studentBody	<- studentBodies+	 ] {-list-comprehension-} where+		studentBodies	= StudentView.Timetable.getStudentBodies studentViewTimetable++	prop_countLessons studentViewTimetable linearTimetableForWeek	= not (Data.Map.null studentViewTimetable) ==> Test.QuickCheck.label "prop_countLessons" $ Model.Timetable.countLessons (+		foldr Model.Timetable.defineTimeslot (Model.Timetable.purge studentViewTimetable) bookings	-- Start with a blank canvas.+	 ) == length bookings where+		bookings	= Data.List.nubBy (+			ToolShed.Data.List.equalityBy Model.GeneralisedBooking.getCoordinates	-- Ensure no bookings are overwritten.+		 ) $ zipWith (+			\studentBody (time, lesson) -> ((studentBody, time), Just lesson)+		 ) (cycle $ StudentView.Timetable.getStudentBodies studentViewTimetable) linearTimetableForWeek++	prop_weightedMeanStudentBodyCombinationsPerLesson2 studentViewTimetable linearTimetableForWeek	= Test.QuickCheck.label "prop_weightedMeanStudentBodyCombinationsPerLesson2" . (+		== (1 :: Rational)+	 ) . StudentView.Timetable.calculateWeightedMeanStudentBodyCombinationsPerLesson $ foldr Model.Timetable.defineTimeslot (+		Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+	 ) [+		((studentBody, time), Just lesson) |+			(time, lesson)	<- take Test.Temporal.Time.nTimeslotsPerWeek linearTimetableForWeek,+			studentBody	<- StudentView.Timetable.getStudentBodies studentViewTimetable+	 ] -- List-comprehension. Define lines, each using a constant lesson, through all student-bodies, at several times.++	prop_extractSynchronousLessonsAt studentViewTimetable linearTimetableForWeek	= Data.Map.size studentViewTimetable > 1 ==> Test.QuickCheck.label "prop_extractSynchronousLessonsAt" . all (+		(== 2) . length . (+			`Model.Timetable.extractSynchronousLessonsAt` (+				foldr Model.Timetable.defineTimeslot (+					Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+				) $ concatMap (+					\pair -> map ($ pair) [+						(,) studentBodyF *** Just,+						(,) studentBodyL *** Just+					] -- Construct a booking for the same lesson, for two different student-bodies.+				) linearTimetableForWeek+			)+		) -- Section.+	 ) $ map Model.TimetableForWeek.getBookedTime linearTimetableForWeek where+		(studentBodyF, studentBodyL)	= head &&& last $ StudentView.Timetable.getStudentBodies studentViewTimetable++	prop_weightedMeanStudentBodyCombinationsPerLesson3 :: Test.Temporal.Time.Time -> Test.StudentView.Lesson.Lesson -> Timetable -> Test.QuickCheck.Property+	prop_weightedMeanStudentBodyCombinationsPerLesson3 time lesson studentViewTimetable	= Data.Map.size studentViewTimetable > 1 ==> Test.QuickCheck.label "prop_weightedMeanStudentBodyCombinationsPerLesson3" . (+		== result+	 ) . StudentView.Timetable.calculateWeightedMeanStudentBodyCombinationsPerLesson . foldr Model.Timetable.defineTimeslot (+		Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+	 ) . uncurry (++) . (+		(`zip` lessons) . (`zip` repeat time) *** (`zip` lessons) . (`zip` repeat (rotate (Temporal.Time.getDay time) `Temporal.Time.mkTime` Temporal.Time.getTimeslotId time))+	 ) $ (+		init &&& tail	-- Create two classes.+	 ) studentBodies where+		rotate :: (Bounded a, Enum a, Eq a) => a -> a+		rotate x+			| x == maxBound	= minBound+			| otherwise	= succ x++		lessons :: [Maybe Test.StudentView.Lesson.Lesson]+		lessons	= repeat $ Just lesson++		studentBodies :: [Aggregate.StudentBody.StudentBody]+		studentBodies	= StudentView.Timetable.getStudentBodies studentViewTimetable++		result	= (/ fromIntegral (Aggregate.StudentClass.getSize studentBodies)) . toRational $ uncurry (+) (+			Aggregate.StudentBody.getSize . head &&& Aggregate.StudentBody.getSize . last $ studentBodies	-- Two student-bodies are members of only one class.+		 ) + (+			(* 2) . Aggregate.StudentClass.getSize . init $ tail studentBodies	-- All but two student-bodies, are members of two classes, for the single lesson-definition.+		 )++	prop_findGeneralisedLessonRunlengthsByCoordinates :: Timetable -> [Temporal.Day.Day] -> [Test.StudentView.Lesson.Lesson] -> Test.QuickCheck.Property+	prop_findGeneralisedLessonRunlengthsByCoordinates studentViewTimetable days lessons	= Test.QuickCheck.label "prop_findGeneralisedLessonRunlengthsByCoordinates" . all (+		(== Test.Temporal.Time.nTimeslotsPerDay) . ToolShed.Data.List.Runlength.getLength . snd {-runlength-code-}+	 ) $ Model.Timetable.findGeneralisedLessonRunlengthsByCoordinates (+		foldr Model.Timetable.defineTimeslot (+			Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+		) [+			((studentBody, Temporal.Time.mkTime day timeslotId), Just lesson) |+				studentBody	<- StudentView.Timetable.getStudentBodies studentViewTimetable,	-- Range over all student-bodies.+				(day, lesson)	<- Data.List.nub days `zip` lessons,				-- Assign one type of lesson to each day.+				timeslotId	<- [minBound .. maxBound]					-- Range over all timeslots.+		] -- List-comprehension. Book surfaces of constant lesson, on a variety of days.+	 )++	prop_findSeparatedEqualLessonsWithinAnyDayByObserverId :: Timetable -> [Temporal.Day.Day] -> [Test.StudentView.Lesson.Lesson] -> Test.QuickCheck.Property+	prop_findSeparatedEqualLessonsWithinAnyDayByObserverId studentViewTimetable days lessons	= not (null lessons) ==> Test.QuickCheck.label "prop_findSeparatedEqualLessonsWithinAnyDayByObserverId" . Data.Foldable.all (+		all ((== 2) . ToolShed.Data.List.Runlength.getLength)+	 ) $ Model.Timetable.findSeparatedEqualLessonsWithinAnyDayByObserverId (+		foldr Model.Timetable.defineTimeslot (+			Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+		 ) [+			((studentBody, Temporal.Time.mkTime day timeslotId), Just lesson) |+				studentBody	<- StudentView.Timetable.getStudentBodies studentViewTimetable,	-- Range over all student-bodies.+				(day, lesson)	<- Data.List.nub days `zip` cycle lessons,			-- Assign one type of lesson to each day+				timeslotId	<- [minBound, maxBound]						-- Duplicate the lesson at the beginning & the end of the day.+		 ] -- List-comprehension.+	 )++	prop_findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId studentViewTimetable	= Test.QuickCheck.label "prop_findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId" $ Data.Map.map (+		Data.Foldable.concatMap (+			map (+				Control.Arrow.first length . Data.Tuple.swap	-- Discard the startingTimeslotId & individual runlengths.+			)+		) -- Discard the 'day'.+	 ) (+		Model.Timetable.findSeparatedEqualLessonRunlengthsByStartingTimeslotIdByLessonByDayByObserverId studentViewTimetable+	 ) == Model.Timetable.findSeparatedEqualLessonsWithinAnyDayByObserverId studentViewTimetable++	prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay :: Test.StudentView.Lesson.Lesson -> Timetable -> Test.Aggregate.StudentBodyRegister.StudentBodyRegister -> Test.QuickCheck.Property+	prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay lesson studentViewTimetable studentBodyRegister	= Data.Map.size studentBodyRegister >= Data.Map.size studentViewTimetable ==> Test.QuickCheck.label "prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay" . (== (0 :: Rational)) . Model.Timetable.calculateAverageAbsoluteDeviationOfFreeLessonsPerDay (++		reindexStudentBodyRegister studentViewTimetable studentBodyRegister+	 ) . foldr Model.Timetable.defineTimeslot studentViewTimetable . zip (Model.Timetable.extractCoordinates studentViewTimetable) . map Just $ repeat lesson++	prop_calculateMeanStudentClassSize :: Test.StudentView.Lesson.Lesson -> Timetable -> Test.QuickCheck.Property+	prop_calculateMeanStudentClassSize lesson studentViewTimetable = not (Data.Map.null studentViewTimetable) ==> Test.QuickCheck.label "prop_calculateMeanStudentClassSize" . (+		== toRational (Aggregate.StudentClass.getSize $ StudentView.Timetable.getStudentBodies studentViewTimetable)+	 ) . TeacherView.Timetable.calculateMeanStudentClassSize . TeacherView.Timetable.fromStudentViewTimetable True (+		Model.Timetable.mkFreeTimetable [+			StudentView.LessonResourceIds.getTeacherId $ Model.Lesson.getResourceIds lesson+		] (minBound, maxBound)+	 ) . foldr Model.Timetable.defineTimeslot (Model.Timetable.purge studentViewTimetable) . zip (Model.Timetable.extractCoordinates studentViewTimetable) . map Just $ repeat lesson++	prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay' :: Test.StudentView.Lesson.Lesson -> Timetable -> Test.Aggregate.StudentBodyRegister.StudentBodyRegister -> Test.QuickCheck.Property+	prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay' lesson studentViewTimetable studentBodyRegister	= Data.Map.size studentBodyRegister >= Data.Map.size studentViewTimetable && not (Data.Map.null studentViewTimetable') ==> Test.QuickCheck.label "prop_calculateAverageAbsoluteDeviationOfFreeLessonsPerDay'" . (+		== (1 :: Rational)+	 ) . Model.Timetable.calculateAverageAbsoluteDeviationOfFreeLessonsPerDay studentBodyRegister' $ Data.Map.mapWithKey (+		\studentBody timetableForWeek	-> foldr Model.TimetableForWeek.defineTimeslot timetableForWeek . (+			`zip` repeat (Just lesson)	-- Construct a booking.+		) . concatMap (+			\l -> let+				(day1, day2)	= head &&& last $ l+			in Temporal.Time.mkTime day1 maxBound : map (Temporal.Time.mkTime day2) (take 3 [minBound ..])+		) . ToolShed.Data.List.chunk 2 $ filter (`Data.Resource.isAvailableOn` (studentBodyRegister' ! studentBody)) Temporal.Day.range+	 ) studentViewTimetable' where+		studentBodyRegister'	= reindexStudentBodyRegister studentViewTimetable studentBodyRegister++		studentViewTimetable'	= Data.Map.filterWithKey (+			\studentBody _ -> even . Data.Resource.countDaysPerWeekAvailable $ studentBodyRegister' ! studentBody+		 ) $ Model.Timetable.purge studentViewTimetable	-- Select student-bodies who're available on an even number of days.++	prop_extractDistinctLessons :: [Test.Temporal.Time.Time] -> [Test.StudentView.Lesson.Lesson] -> Timetable -> Test.QuickCheck.Property+	prop_extractDistinctLessons times lessons studentViewTimetable	= Test.QuickCheck.label "prop_extractDistinctLessons" . (== Data.Set.fromList (Data.Maybe.mapMaybe Model.GeneralisedBooking.getMaybeLesson generalisedBookings)) . Model.Timetable.extractDistinctLessons $ foldr Model.Timetable.defineTimeslot (+		Model.Timetable.purge studentViewTimetable	-- Start with a blank canvas.+	 ) generalisedBookings where+		generalisedBookings	= zip (zip (StudentView.Timetable.getStudentBodies studentViewTimetable) $ Data.List.nub times) . map Just $ Data.List.nub lessons+
+ src-test/WeekDaze/Test/QuickCheck/StudentView/TimetableForDay.hs view
@@ -0,0 +1,80 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties for 'StudentView.TimetableForDay.TimetableForDay'.+-}++module WeekDaze.Test.QuickCheck.StudentView.TimetableForDay(+-- * Types+-- ** Type-synonyms+--	TimetableForDay,+-- * Constants+	results+) where++import			Data.Array.IArray((!))+import qualified	Data.Array.Base+import qualified	Data.Array.IArray+import qualified	Data.List+import qualified	Test.QuickCheck+import qualified	ToolShed.Data.List.Runlength+import			ToolShed.Test.QuickCheck.Arbitrary.Array()+import qualified	WeekDaze.Identifiers.Level		as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId		as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.TeacherId		as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId		as Identifiers.TimeslotId+import qualified	WeekDaze.Model.TimetableForDay		as Model.TimetableForDay+import qualified	WeekDaze.StudentView.TimetableForDay	as StudentView.TimetableForDay+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import			WeekDaze.Test.QuickCheck.Identifiers.TimeslotId()+import			WeekDaze.Test.QuickCheck.StudentView.Lesson()++-- | Defines a concrete type for testing.+type TimetableForDay	= StudentView.TimetableForDay.TimetableForDay Identifiers.TimeslotId.TimeslotId Identifiers.LocationId.LocationId Identifiers.TeacherId.TeacherId Identifiers.Level.Level++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_countRunlengthAt,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_boundRunlengthAt,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_spanRunlengthAt,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_spanRunlengthAt',+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findGeneralisedLessonRunlengths,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findGeneralisedLessonRunlengths',+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_findGeneralisedLessonRunlengthsByTimeslotId+ ] where+	prop_countRunlengthAt, prop_boundRunlengthAt, prop_spanRunlengthAt, prop_spanRunlengthAt' :: TimetableForDay -> Identifiers.TimeslotId.TimeslotId -> Test.QuickCheck.Property+	prop_countRunlengthAt studentViewTimetableForDay timeslotId	= Test.QuickCheck.label "prop_countRunlengthAt" $ Model.TimetableForDay.countRunlengthAt timeslotId studentViewTimetableForDay >= 1+	prop_boundRunlengthAt studentViewTimetableForDay timeslotId	= Test.QuickCheck.label "prop_boundRunlengthAt" $ Model.TimetableForDay.countRunlengthAt timeslotId studentViewTimetableForDay == succ {-fence-post-} (uncurry Temporal.Time.calculateAbsoluteDistance (Model.TimetableForDay.boundRunlengthAt timeslotId studentViewTimetableForDay))+	prop_spanRunlengthAt studentViewTimetableForDay timeslotId	= Test.QuickCheck.label "prop_spanRunlengthAt" $ Model.TimetableForDay.countRunlengthAt timeslotId studentViewTimetableForDay == length (Model.TimetableForDay.spanRunlengthAt timeslotId studentViewTimetableForDay)+	prop_spanRunlengthAt' studentViewTimetableForDay		= Test.QuickCheck.label "prop_spanRunlengthAt'" . (== 1) . length . Data.List.nub . map (studentViewTimetableForDay !) . (`Model.TimetableForDay.spanRunlengthAt` studentViewTimetableForDay)++	prop_findGeneralisedLessonRunlengths, prop_findGeneralisedLessonRunlengths', prop_findGeneralisedLessonRunlengthsByTimeslotId :: TimetableForDay -> Test.QuickCheck.Property+	prop_findGeneralisedLessonRunlengths studentViewTimetableForDay	= Test.QuickCheck.label "prop_findGeneralisedLessonRunlengths" $ ToolShed.Data.List.Runlength.decode (Model.TimetableForDay.findGeneralisedLessonRunlengths studentViewTimetableForDay) == Data.Array.IArray.elems studentViewTimetableForDay++	prop_findGeneralisedLessonRunlengths' studentViewTimetableForDay	= Test.QuickCheck.label "prop_findGeneralisedLessonRunlengths'" $ sum (+		map ToolShed.Data.List.Runlength.getLength $ Model.TimetableForDay.findGeneralisedLessonRunlengths studentViewTimetableForDay+	 ) == Data.Array.Base.numElements studentViewTimetableForDay++	prop_findGeneralisedLessonRunlengthsByTimeslotId studentViewTimetableForDay	= Test.QuickCheck.label "prop_findGeneralisedLessonRunlengthsByTimeslotId" . (+		== fst {-min-} (Data.Array.IArray.bounds studentViewTimetableForDay)+	 ) . fst {-timeslotId-} . head $ Model.TimetableForDay.findGeneralisedLessonRunlengthsByTimeslotId studentViewTimetableForDay+
+ src-test/WeekDaze/Test/QuickCheck/StudentView/TimetableForWeek.hs view
@@ -0,0 +1,61 @@+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Defines /QuickCheck/-properties for 'StudentView.TimetableForWeek.TimetableForWeek'.+-}++module WeekDaze.Test.QuickCheck.StudentView.TimetableForWeek(+-- * Types+-- ** Type-synonyms+--	TimetableForWeek,+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	Test.QuickCheck+import			ToolShed.Test.QuickCheck.Arbitrary.Array()+import qualified	WeekDaze.Identifiers.Level			as Identifiers.Level+import qualified	WeekDaze.Identifiers.LocationId			as Identifiers.LocationId+import qualified	WeekDaze.Identifiers.TeacherId			as Identifiers.TeacherId+import qualified	WeekDaze.Identifiers.TimeslotId			as Identifiers.TimeslotId+import qualified	WeekDaze.Model.TimetableForWeek			as Model.TimetableForWeek+import qualified	WeekDaze.StudentView.TimetableForWeek		as StudentView.TimetableForWeek+import qualified	WeekDaze.Temporal.Day				as Temporal.Day+import			WeekDaze.Test.QuickCheck.Identifiers.TimeslotId()+import qualified	WeekDaze.Test.QuickCheck.StudentView.Lesson	as Test.StudentView.Lesson+import			WeekDaze.Test.QuickCheck.Temporal.Day()++-- | Defines a concrete type for testing.+type TimetableForWeek	= StudentView.TimetableForWeek.TimetableForWeek Identifiers.TimeslotId.TimeslotId Identifiers.LocationId.LocationId Identifiers.TeacherId.TeacherId Identifiers.Level.Level++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 1000} `mapM` [prop_isBookedOnAdjacentDay] where+	prop_isBookedOnAdjacentDay :: TimetableForWeek -> Test.StudentView.Lesson.Lesson -> Test.QuickCheck.Property+	prop_isBookedOnAdjacentDay studentViewTimetableForWeek lesson	= Test.QuickCheck.label "prop_isBookedOnAdjacentDay" $ all (+		uncurry (||) . (+			Model.TimetableForWeek.isBookedOnAdjacentDay studentViewTimetableForWeek lesson . Temporal.Day.getYesterday . Temporal.Day.getYesterday &&& Model.TimetableForWeek.isBookedOnAdjacentDay studentViewTimetableForWeek lesson . Temporal.Day.getTomorrow . Temporal.Day.getTomorrow+		)+	 ) $ filter (+		Model.TimetableForWeek.isBookedOnAdjacentDay studentViewTimetableForWeek lesson+	 ) Temporal.Day.range+
+ src-test/WeekDaze/Test/QuickCheck/Temporal/Availability.hs view
@@ -0,0 +1,75 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Temporal.Availability.Availability'.+-}++module WeekDaze.Test.QuickCheck.Temporal.Availability(+-- * Constants+	results+) where++import			Control.Arrow((&&&))+import qualified	Factory.Data.Interval+import qualified	Test.QuickCheck+import qualified	WeekDaze.Temporal.Availability	as Temporal.Availability+import qualified	WeekDaze.Temporal.Day		as Temporal.Day+import			WeekDaze.Test.QuickCheck.Temporal.Day()++instance Test.QuickCheck.Arbitrary Temporal.Availability.Availability where+	arbitrary	= fmap Temporal.Availability.mkAvailability (Test.QuickCheck.elements [1 .. Temporal.Day.nDaysPerWeek] >>= Test.QuickCheck.vector)++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [+	prop_isAvailableOn,+	prop_countDaysPerWeekAvailable,+	prop_countInternalAvailabilityGaps,+	prop_calculateAvailabilityRatio,+	prop_findUnions+#ifdef USE_HDBC+	,prop_mysql+#endif+ ] where+	prop_isAvailableOn, prop_countDaysPerWeekAvailable, prop_countInternalAvailabilityGaps, prop_calculateAvailabilityRatio, prop_findUnions	:: Temporal.Availability.Availability -> Test.QuickCheck.Property++	prop_isAvailableOn availability	= Test.QuickCheck.label "prop_isAvailableOn" . (+		if Temporal.Availability.isFulltime availability+			then id+			else not+	 ) $ all (`Temporal.Availability.isAvailableOn` availability) Temporal.Day.range++	prop_countDaysPerWeekAvailable	= Test.QuickCheck.label "prop_countDaysPerWeekAvailable" . (\r -> all ($ r) [(>= 0), (<= Temporal.Day.nDaysPerWeek)]) . Temporal.Availability.countDaysPerWeekAvailable++	prop_countInternalAvailabilityGaps	= Test.QuickCheck.label "prop_countInternalAvailabilityGaps" . (<= floor (toRational Temporal.Day.nDaysPerWeek / 2)) . Temporal.Availability.countInternalAvailabilityGaps++	prop_calculateAvailabilityRatio	= Test.QuickCheck.label "prop_calculateAvailabilityRatio" . (`Factory.Data.Interval.elem'` (Factory.Data.Interval.closedUnitInterval :: (Rational, Rational))) . Temporal.Availability.calculateAvailabilityRatio++	prop_findUnions	= Test.QuickCheck.label "prop_findUnions" . uncurry (==) . (Temporal.Availability.findUnions &&& Temporal.Availability.findIntersections) . (return {-to List-monad-} :: a -> [a])++#ifdef USE_HDBC+	prop_mysql :: Temporal.Availability.Availability -> Test.QuickCheck.Property+	prop_mysql availability	= Test.QuickCheck.label "prop_mysql" . (== availability) . Temporal.Availability.fromMySqlSet $ Temporal.Availability.toMySqlSet availability+#endif
+ src-test/WeekDaze/Test/QuickCheck/Temporal/Day.hs view
@@ -0,0 +1,44 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Temporal.Day.Day'.+-}++module WeekDaze.Test.QuickCheck.Temporal.Day(+-- * Constants+	results+) where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Temporal.Day	as Temporal.Day++instance Test.QuickCheck.Arbitrary Temporal.Day.Day where+	arbitrary	= Test.QuickCheck.elements Temporal.Day.range++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [prop_getAdjacentDays] where+	prop_getAdjacentDays :: Temporal.Day.Day -> Test.QuickCheck.Property+	prop_getAdjacentDays day	= Test.QuickCheck.label "prop_getAdjacentDays" $ Temporal.Day.getTomorrow (Temporal.Day.getYesterday day) == day+
+ src-test/WeekDaze/Test/QuickCheck/Temporal/FreePeriodPreference.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' for 'Temporal.FreePeriodPreference.FreePeriodPreference'.+-}++module WeekDaze.Test.QuickCheck.Temporal.FreePeriodPreference() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Temporal.FreePeriodPreference	as Temporal.FreePeriodPreference++instance Test.QuickCheck.Arbitrary Temporal.FreePeriodPreference.FreePeriodPreference where+	arbitrary	= Test.QuickCheck.elements [minBound .. maxBound]+
+ src-test/WeekDaze/Test/QuickCheck/Temporal/Time.hs view
@@ -0,0 +1,80 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Temporal.Time.Time'.+-}++module WeekDaze.Test.QuickCheck.Temporal.Time(+-- * Types+-- ** Type-synonyms+	Time,+-- * Constants+	nTimeslotsPerDay,+	nTimeslotsPerWeek,+	results+) where++import qualified	Test.QuickCheck+import qualified	ToolShed.Test.ReversibleIO+import qualified	WeekDaze.Identifiers.TimeslotId	as Identifiers.TimeslotId+import qualified	WeekDaze.Size			as Size+import qualified	WeekDaze.Temporal.Time		as Temporal.Time+import			WeekDaze.Test.QuickCheck.Identifiers.TimeslotId()+import			WeekDaze.Test.QuickCheck.Temporal.Day()++instance Test.QuickCheck.Arbitrary timeslotId => Test.QuickCheck.Arbitrary (Temporal.Time.Time timeslotId) where+	arbitrary	= uncurry Temporal.Time.mkTime `fmap` Test.QuickCheck.arbitrary {-pair-}++-- | Defines a concrete type for testing.+type Time	= Temporal.Time.Time Identifiers.TimeslotId.TimeslotId++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= sequence [+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readPrependedWhiteSpace,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_shift,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_read,+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256} prop_readTrailingGarbage+ ] where+	prop_readPrependedWhiteSpace :: Time -> Test.QuickCheck.Property+	prop_readPrependedWhiteSpace	= Test.QuickCheck.label "prop_readPrependedWhiteSpace" . ToolShed.Test.ReversibleIO.readPrependedWhiteSpace++	prop_shift :: Size.NTimeslots -> Identifiers.TimeslotId.TimeslotId -> Test.QuickCheck.Property+	prop_shift i timeslotId	= Test.QuickCheck.label "prop_shift" $ Temporal.Time.shift (negate i') (Temporal.Time.shift i' timeslotId) == timeslotId where+		i'	= i `mod` fromEnum (maxBound :: Identifiers.TimeslotId.TimeslotId)++	prop_read :: String -> Test.QuickCheck.Property+	prop_read garbage	= Test.QuickCheck.label "prop_read" $ case (reads garbage :: [(Time, String)]) of+		[_]	-> True+		_	-> True	-- Unless the read-implementation throws an exception.++	prop_readTrailingGarbage :: Time -> String -> Test.QuickCheck.Property+	prop_readTrailingGarbage time	= Test.QuickCheck.label "prop_readTrailingGarbage" . ToolShed.Test.ReversibleIO.readTrailingGarbage (const False) time++-- | The constant number of /time-slots/ per day.+nTimeslotsPerDay :: Size.NTimeslots+nTimeslotsPerDay	= succ {-fence-post-} $ fromEnum (maxBound :: Identifiers.TimeslotId.TimeslotId) - fromEnum (minBound :: Identifiers.TimeslotId.TimeslotId)++-- | The constant number of /time-slots/ per week.+nTimeslotsPerWeek :: Size.NTimeslots+nTimeslotsPerWeek	= Temporal.Time.calculateNTimeslotsPerWeek nTimeslotsPerDay+
+ src-test/WeekDaze/Test/QuickCheck/Temporal/TimeAxes.hs view
@@ -0,0 +1,33 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Temporal.TimeAxes.TimeAxes'.+-}++module WeekDaze.Test.QuickCheck.Temporal.TimeAxes() where++import qualified	Test.QuickCheck+import qualified	WeekDaze.Temporal.TimeAxes	as Temporal.TimeAxes++instance Test.QuickCheck.Arbitrary a => Test.QuickCheck.Arbitrary (Temporal.TimeAxes.TimeAxes a) where+	arbitrary	= uncurry Temporal.TimeAxes.mkTimeAxes `fmap` Test.QuickCheck.arbitrary {-pair-}+
+ src-test/WeekDaze/Test/QuickCheck/Temporal/TimeslotRequest.hs view
@@ -0,0 +1,77 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-+	Copyright (C) 2013-2015 Dr. Alistair Ward++	This file is part of WeekDaze.++	WeekDaze 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.++	WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.+-}+{- |+ [@AUTHOR@]	Dr. Alistair Ward++ [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines /QuickCheck/-properties for 'Temporal.TimeslotRequest.TimeslotRequest'.+-}++module WeekDaze.Test.QuickCheck.Temporal.TimeslotRequest(+-- * Types+-- ** Type-synonyms+--	TimeslotRequest,+-- * Constants+	results+) where++import qualified	Data.Foldable+import qualified	Data.Set+import qualified	Test.QuickCheck+import qualified	WeekDaze.Identifiers.TimeslotId		as Identifiers.TimeslotId+import qualified	WeekDaze.Temporal.Time			as Temporal.Time+import qualified	WeekDaze.Temporal.TimeslotRequest	as Temporal.TimeslotRequest+import			WeekDaze.Test.QuickCheck.Temporal.Time()++instance Test.QuickCheck.Arbitrary timeslotId => Test.QuickCheck.Arbitrary (Temporal.TimeslotRequest.TimeslotRequest timeslotId) where+	arbitrary	= Test.QuickCheck.oneof [+		return {-to Gen-monad-} $ Temporal.TimeslotRequest.Specifically Data.Set.empty,+		fmap Temporal.TimeslotRequest.Ideally Test.QuickCheck.arbitrary,+		fmap (Temporal.TimeslotRequest.Specifically . Data.Set.singleton) Test.QuickCheck.arbitrary+	 ]++-- | Defines a concrete type for testing.+type TimeslotRequest	= Temporal.TimeslotRequest.TimeslotRequest Identifiers.TimeslotId.TimeslotId++-- | The constant test-results for this data-type.+results :: IO [Test.QuickCheck.Result]+results	= mapM (+	Test.QuickCheck.quickCheckWithResult Test.QuickCheck.stdArgs {Test.QuickCheck.maxSuccess = 256}+ ) [+	prop_isASpecifiedTime,+	prop_isASpecifiedDay,+	prop_countSpecifiedTimes,+	prop_findDistinctRunlengthsOfSpecifiedTimes+ ] where+	prop_isASpecifiedTime, prop_isASpecifiedDay, prop_countSpecifiedTimes, prop_findDistinctRunlengthsOfSpecifiedTimes :: TimeslotRequest -> Test.QuickCheck.Property++	prop_isASpecifiedTime timeslotRequest	= Test.QuickCheck.label "prop_isASpecifiedTime" . Data.Foldable.all (+		`Temporal.TimeslotRequest.isASpecifiedTime` timeslotRequest+	 ) $ Temporal.TimeslotRequest.getSpecifiedTimes timeslotRequest++	prop_isASpecifiedDay timeslotRequest	= Test.QuickCheck.label "prop_isASpecifiedDay" . Data.Foldable.all (+		(`Temporal.TimeslotRequest.isASpecifiedDay` timeslotRequest) . Temporal.Time.getDay+	 ) $ Temporal.TimeslotRequest.getSpecifiedTimes timeslotRequest++	prop_countSpecifiedTimes timeslotRequest	= Test.QuickCheck.label "prop_countSpecifiedTimes" $ if Temporal.TimeslotRequest.countSpecifiedTimes timeslotRequest == 0+		then Temporal.TimeslotRequest.isNull timeslotRequest+		else Temporal.TimeslotRequest.isSpecific timeslotRequest++	prop_findDistinctRunlengthsOfSpecifiedTimes	= Test.QuickCheck.label "prop_findDistinctRunlengthsOfSpecifiedTimes" . Data.Set.null . Temporal.TimeslotRequest.findDistinctRunlengthsOfSpecifiedTimes+
+ weekdaze.cabal view
@@ -0,0 +1,447 @@+-- This file is part of WeekDaze.+--+-- WeekDaze 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.+--+-- WeekDaze 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 WeekDaze.  If not, see <http://www.gnu.org/licenses/>.++Name:		weekdaze+Version:	0.0.0.1+Cabal-version:	>= 1.10+Copyright:	(C) 2013-2015 Dr. Alistair Ward+License:	GPL+License-file:	LICENSE+Author:		Dr. Alistair Ward+Stability:	stable+Synopsis:	A school-timetable problem-solver.+Build-type:	Simple+Description:	An application which searches for a solution to the configured school-timetable problem.+Category:	Application, Teaching+Tested-with:	GHC == 8.0, GHC == 8.2, GHC == 8.4, GHC == 8.6+Homepage:	https://functionalley.com/WeekDaze/weekdaze.html+Maintainer:	mailto:weekdaze@functionalley.com+Bug-reports:	mailto:weekdaze@functionalley.com++-- These files can be read by the application from 'Paths_weekdaze.datadir'.+Data-files:+    css/weekdaze.css+    dtd/*.dtd+    images/*.png+    sql/MySQL/weekdazeCreate.sql+    sql/MySQL/weekdazeExamples.sql+    sql/MySQL/weekdazeTriggers.sql+    sql/MySQL/*.ini+    xhtml/*.xhtml+    xml/*.xml++-- None of these files are needed at run-time.+Extra-source-files:+    .ghci+    changelog.Debian+    changelog.markdown+    copyright+    debian/DEBIAN/control+    images/*.pdf+    man/man1/weekdaze.1+    man/man5/weekdaze.5+    README.markdown+    weekdaze.spec+    weekdaze.svg++-- Enable using: 'runhaskell Setup configure -f HDBC-mysql --verbose'.+flag HDBC-mysql+    Description:	Link with the package "HDBC-mysql" & consequently the native MySQL-interface (which will require a development package for 'mysqlclient'), which the application can use to connect to a MySQL data-server.+    Manual:		True+    Default:		False++-- Enable using: 'runhaskell Setup configure -f HDBC-odbc --verbose'.+flag HDBC-odbc+    Description:	Link with the package "HDBC-odbc", which the application can use to connect to a generic data-server.+    Manual:		True+    Default:		False++-- Enable using: 'runhaskell Setup configure -f llvm --verbose'.+flag llvm+    Description:	Whether the 'llvm' compiler-backend has been installed and is required for code-generation.+    Manual:		True+    Default:		False++-- Enable using: 'runhaskell Setup configure -f printDBQueries --verbose'.+flag printDBQueries+    Description:	Whether to print SQL-queries as the database is read. N.B.: only relevant when either of the flags 'HDBC-odbc' or 'HDBC-mysql' is True. N.B.: the output will be more readable when 'queryDBConcurrently' is off.+    Manual:		True+    Default:		False++-- Enable using: 'runhaskell Setup configure -f printDBRows --verbose'.+flag printDBRows+    Description:	Whether to print the rows read from the database. N.B.: only relevant when either of the flags 'HDBC-odbc' or 'HDBC-mysql' is True. N.B.: the output will be more readable when 'queryDBConcurrently' is off.+    Manual:		True+    Default:		False++-- Disable using: 'runhaskell Setup configure -f -queryDBConcurrently --verbose'.+flag queryDBConcurrently+    Description:	Whether database-queries should be issued concurrently.+    Manual:		True+    Default:		True++-- Enable using: 'runhaskell Setup configure -f static --verbose', which will then require a large number of archives instead of shared objects.+flag static+    Description:	Link statically, perhaps for deployment in an environment where one doesn't have root access.+    Manual:		True+    Default:		False++-- CAVEAT: 'Database.HDBC.MySQL.withRTSSignalsBlocked' requires the threaded runtime.+flag threaded+    Description:	Build for parallel runtime.+    Manual:		True+    Default:		True++-- Automatically disabled when the required package isn't available, which will typically be the case on Windows.+flag unix+    Description:	Link with package "unix" when available.+    Default:		True++Library+    Default-language:	Haskell2010+    GHC-options:	-O2 -Wall -fno-warn-tabs+    Hs-source-dirs:	src-lib++    Exposed-modules:+        WeekDaze.Aggregate.GroupCatalogue+        WeekDaze.Aggregate.LocationCatalogue+        WeekDaze.Aggregate.StudentBody+        WeekDaze.Aggregate.StudentBodyRegister+        WeekDaze.Aggregate.StudentClass+        WeekDaze.Aggregate.TeacherRegister+        WeekDaze.Colour.HTMLColour+        WeekDaze.Colour.HTMLColourCode+        WeekDaze.Colour.RGB+        WeekDaze.Configuration+        WeekDaze.Data.Course+        WeekDaze.Data.Group+        WeekDaze.Data.HumanResource+        WeekDaze.Data.Location+        WeekDaze.Data.Requirements+        WeekDaze.Data.Resource+        WeekDaze.Data.Student+        WeekDaze.Data.Subject+        WeekDaze.Data.Teacher+        WeekDaze.Enhanced.EnhancedDouble+        WeekDaze.Enhanced.EnhancedRatio+        WeekDaze.ExecutionConfiguration.Criterion+        WeekDaze.ExecutionConfiguration.CriterionWeight+        WeekDaze.ExecutionConfiguration.EvolutionStrategies+        WeekDaze.ExecutionConfiguration.ExecutionOptions+        WeekDaze.ExecutionConfiguration.LessonCriteriaWeights+        WeekDaze.ExecutionConfiguration.OptimiseLessonCriteriaWeights+        WeekDaze.ExecutionConfiguration.TimetableBreederFecundity+        WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights+        WeekDaze.Identifiers.Campus+        WeekDaze.Identifiers.Level+        WeekDaze.Identifiers.LocationId+        WeekDaze.Identifiers.Stream+        WeekDaze.Identifiers.SynchronisationId+        WeekDaze.Identifiers.TeacherId+        WeekDaze.Identifiers.TimeslotId+        WeekDaze.Input.ConfigVersion+        WeekDaze.Input.Options+        WeekDaze.LinearModel.Timetable+        WeekDaze.LinearModel.TimetableForWeek+        WeekDaze.LocationView.Lesson+        WeekDaze.LocationView.LessonResourceIds+        WeekDaze.LocationView.Timetable+        WeekDaze.Model.GeneralisedBooking+        WeekDaze.Model.GenerateLessonColourFrom+        WeekDaze.Model.Lesson+        WeekDaze.Model.Meeting+        WeekDaze.Model.ResourceUser+        WeekDaze.Model.Timetable+        WeekDaze.Model.TimetableAxis+        WeekDaze.Model.TimetableAxisTraversal+        WeekDaze.Model.TimetableAxisTriple+        WeekDaze.Model.TimetableCoordinates+        WeekDaze.Model.TimetableForDay+        WeekDaze.Model.TimetableForWeek+        WeekDaze.Model.Traverse+        WeekDaze.OutputConfiguration.FileFormat+        WeekDaze.OutputConfiguration.Format+        WeekDaze.OutputConfiguration.Options+        WeekDaze.OutputConfiguration.Style+        WeekDaze.OutputConfiguration.Verbosity+        WeekDaze.OutputConfiguration.View+        WeekDaze.ProblemConfiguration.ProblemAnalysis+        WeekDaze.ProblemConfiguration.ProblemParameters+        WeekDaze.ProblemConfiguration.ProblemValidationSwitches+        WeekDaze.ProblemConfiguration.TimetableValidationSwitches+        WeekDaze.Size+        WeekDaze.StudentView.Lesson+        WeekDaze.StudentView.LessonResourceIds+        WeekDaze.StudentView.Timetable+        WeekDaze.StudentView.TimetableCoordinates+        WeekDaze.StudentView.TimetableForDay+        WeekDaze.StudentView.TimetableForWeek+        WeekDaze.TeacherView.Lesson+        WeekDaze.TeacherView.LessonResourceIds+        WeekDaze.TeacherView.Timetable+        WeekDaze.TeacherView.TimetableForWeek+        WeekDaze.Temporal.Availability+        WeekDaze.Temporal.Day+        WeekDaze.Temporal.FreePeriodPreference+        WeekDaze.Temporal.Time+        WeekDaze.Temporal.TimeAxes+        WeekDaze.Temporal.TimeslotRequest+        WeekDaze.Text.CSS+        WeekDaze.Text.XHTML++    Other-modules:+        WeekDaze.Enhanced.EnhancedBool+        WeekDaze.Enhanced.EnhancedEither+--      WeekDaze.Enhanced.EnhancedSet+        WeekDaze.Enhanced.EnhancedTuple+        WeekDaze.ProblemConfiguration.ValidationSwitch+        WeekDaze.Temporal.Workload++    Build-depends:+        array,+        base == 4.*,+        bytestring,+        Cabal >= 1.10,+        containers >= 0.4.2.0,+        cryptohash >= 0.8.0,+        data-default,+        deepseq >= 1.1,+        extra,+        factory >= 0.3.1,+        filepath,+        hxt >= 9.0.0.0,+        mtl,+        random,+        toolshed >= 0.17,+        xhtml++    if flag(HDBC-odbc) || flag(HDBC-mysql)+        Exposed-modules:	WeekDaze.Database.Selector+        Build-depends:		convertible, HDBC+        CPP-Options:		-DUSE_HDBC++        if flag(HDBC-mysql)+            CPP-Options:	-DUSE_HDBC_MYSQL++        if flag(HDBC-odbc)+            CPP-Options:	-DUSE_HDBC_ODBC++        if flag(printDBQueries)+            CPP-Options:	-DPRINT_DB_QUERIES++        if flag(printDBRows)+            CPP-Options:	-DPRINT_DB_ROWS++        if flag(queryDBConcurrently)+            CPP-Options:	-DQUERY_DB_CONCURRENTLY++    if impl(ghc >= 7.0)+        if flag(llvm)+            GHC-options:	-fllvm++        if impl(ghc >= 7.4.1)+            GHC-prof-options:	-fprof-auto -fprof-cafs++            if impl(ghc >= 8.0)+                GHC-options:	-Wredundant-constraints+        else+            GHC-prof-options:	-auto-all -caf-all++Executable weekdaze+    Default-language:	Haskell2010+    GHC-options:	-O2 -Wall -fno-warn-tabs+    Hs-source-dirs:	src-exe+    Main-is:		Main.hs++-- Required for 'cabal sdist'.+    Other-modules:+        WeekDaze.Dynamic.HumanViewTimetable+        WeekDaze.Dynamic.LocationViewTimetableUtilities+        WeekDaze.Dynamic.StudentViewTimetableForWeekUtilities+        WeekDaze.Dynamic.StudentViewTimetableUtilities+        WeekDaze.Dynamic.TeacherViewTimetableForWeekUtilities+        WeekDaze.Dynamic.TeacherViewTimetableUtilities+        WeekDaze.Dynamic.TimetableForWeekUtilities+        WeekDaze.OutputFormat.DeterministicStudentViewTimetableSelection+        WeekDaze.OutputFormat.EvolutionStrategyStatistics+        WeekDaze.OutputFormat.XHTMLFormat+        WeekDaze.OutputFormat.XHTMLFormatLocationViewTimetable+        WeekDaze.OutputFormat.XHTMLFormatStudentViewTimetable+        WeekDaze.OutputFormat.XHTMLFormatTeacherViewTimetable+        WeekDaze.Implementation.DeterministicConstructor+        WeekDaze.Implementation.EvolutionaryAlgorithm+        WeekDaze.Implementation.QuantifiedStudentViewTimetable+        WeekDaze.Implementation.RandomConstructor+        WeekDaze.Implementation.StudentViewTimetableRandomBreeders+        WeekDaze.Implementation.TimetableFitness+        WeekDaze.Input.CommandLineOption++    Build-depends:+        array,+        base == 4.*,+        Cabal >= 1.10,+        containers >= 0.4.2.0,+        cryptohash >= 0.8.0,+        deepseq >= 1.1,+        data-default,+        directory,+        extra,+        factory >= 0.3.1,+        filepath,+        hxt >= 9.0.0.0,+        mtl,+        parallel >= 3.0,+        random,+        time,+        toolshed >= 0.17,+        weekdaze,+        xhtml++    if flag(HDBC-odbc) || flag(HDBC-mysql)+        Build-depends:	byteable, bytestring, HDBC+        CPP-Options:	-DUSE_HDBC++-- N.B.: The Haskell package 'HDBC-mysql' requires 'mysql_config', which in GNU/Linux is provided by the development-package of 'libmysqlclient'; Cygwin might provide it for Windows, though it's unlikely to be pain-free.+        if flag(HDBC-mysql)+            Build-depends:	HDBC-mysql+            Other-modules:	WeekDaze.Database.MySQL+            CPP-Options:	-DUSE_HDBC_MYSQL++-- N.B.: Building the Haskell package 'HDBC-odbc' on GNU/Linux requires the development-package of 'unixODBC' & a driver for the specific type of DBMS to which connection is to be established, e.g. 'MyODBC-unixODBC' for MySQL.+        if flag(HDBC-odbc)+            Build-depends:	HDBC-odbc+            Other-modules:	WeekDaze.Database.ODBC+            CPP-Options:	-DUSE_HDBC_ODBC++        if flag(printDBQueries)+            CPP-Options:	-DPRINT_DB_QUERIES++        if flag(printDBRows)+            CPP-Options:	-DPRINT_DB_ROWS++        if flag(queryDBConcurrently)+            CPP-Options:	-DQUERY_DB_CONCURRENTLY++    if impl(ghc >= 7.0)+        if flag(llvm)+            GHC-options:	-fllvm++        if flag(threaded)+            GHC-options:	-rtsopts "-with-rtsopts=-N -H100M"++        if impl(ghc >= 7.4.1)+            GHC-prof-options:	-fprof-auto -fprof-cafs -rtsopts -with-rtsopts=-H100M++            if impl(ghc >= 8.0)+                GHC-options:	-Wredundant-constraints+        else+            GHC-prof-options:	-auto-all -caf-all++    if flag(threaded)+        GHC-options:	-threaded++-- N.B.: requires archives for; c, crypto, dl, ffi, gmp, m, mysqlclient, pthread, rt, ssl, util, z+    if flag(static)+        ld-options:	-static++-- N.B.: The Haskell package 'unix' may be available on Windows, but building it will probably be laborious.+    if flag(unix)+        Other-modules:	WeekDaze.SignalHandlers+        Build-depends:	unix+        CPP-Options:	-DUSE_UNIX++Test-Suite test+    Default-language:	Haskell2010+    GHC-options:	-Wall -fno-warn-tabs+    Hs-source-dirs:	src-test+    Main-is:		Main.hs+    Type:		exitcode-stdio-1.0++-- Required for 'cabal sdist'.+    Other-modules:+        WeekDaze.Test.QuickCheck.Aggregate.LocationCatalogue+        WeekDaze.Test.QuickCheck.Aggregate.StudentBody+        WeekDaze.Test.QuickCheck.Aggregate.StudentBodyRegister+        WeekDaze.Test.QuickCheck.Aggregate.StudentClass+        WeekDaze.Test.QuickCheck.Aggregate.TeacherRegister+        WeekDaze.Test.QuickCheck.Colour.HTMLColour+        WeekDaze.Test.QuickCheck.Colour.RGB+        WeekDaze.Test.QuickCheck.Data.Course+        WeekDaze.Test.QuickCheck.Data.Group+        WeekDaze.Test.QuickCheck.Data.Location+        WeekDaze.Test.QuickCheck.Data.Student+        WeekDaze.Test.QuickCheck.Data.Subject+        WeekDaze.Test.QuickCheck.Data.Teacher+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.Criterion+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.CriterionWeight+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.EvolutionStrategies+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.ExecutionOptions+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.LessonCriteriaWeights+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.OptimiseLessonCriteriaWeights+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.TimetableBreederFecundity+        WeekDaze.Test.QuickCheck.ExecutionConfiguration.TimetableCriteriaWeights+        WeekDaze.Test.QuickCheck.Identifiers.Campus+        WeekDaze.Test.QuickCheck.Identifiers.Level+        WeekDaze.Test.QuickCheck.Identifiers.LocationId+        WeekDaze.Test.QuickCheck.Identifiers.Stream+        WeekDaze.Test.QuickCheck.Identifiers.SynchronisationId+        WeekDaze.Test.QuickCheck.Identifiers.TeacherId+        WeekDaze.Test.QuickCheck.Identifiers.TimeslotId+        WeekDaze.Test.QuickCheck.Input.ConfigVersion+        WeekDaze.Test.QuickCheck.Input.Options+        WeekDaze.Test.QuickCheck.Model.GenerateLessonColourFrom+        WeekDaze.Test.QuickCheck.Model.Lesson+        WeekDaze.Test.QuickCheck.Model.TimetableAxis+        WeekDaze.Test.QuickCheck.Model.TimetableAxisTraversal+        WeekDaze.Test.QuickCheck.Model.TimetableAxisTriple+        WeekDaze.Test.QuickCheck.OutputConfiguration.FileFormat+        WeekDaze.Test.QuickCheck.OutputConfiguration.Format+        WeekDaze.Test.QuickCheck.OutputConfiguration.Options+        WeekDaze.Test.QuickCheck.OutputConfiguration.Style+        WeekDaze.Test.QuickCheck.OutputConfiguration.Verbosity+        WeekDaze.Test.QuickCheck.OutputConfiguration.View+        WeekDaze.Test.QuickCheck.ProblemConfiguration.ProblemParameters+        WeekDaze.Test.QuickCheck.ProblemConfiguration.ProblemValidationSwitches+        WeekDaze.Test.QuickCheck.ProblemConfiguration.TimetableValidationSwitches+        WeekDaze.Test.QuickCheck.StudentView.Lesson+        WeekDaze.Test.QuickCheck.StudentView.Timetable+        WeekDaze.Test.QuickCheck.StudentView.TimetableForDay+        WeekDaze.Test.QuickCheck.StudentView.TimetableForWeek+        WeekDaze.Test.QuickCheck.Temporal.Availability+        WeekDaze.Test.QuickCheck.Temporal.Day+        WeekDaze.Test.QuickCheck.Temporal.FreePeriodPreference+        WeekDaze.Test.QuickCheck.Temporal.Time+        WeekDaze.Test.QuickCheck.Temporal.TimeAxes+        WeekDaze.Test.QuickCheck.Temporal.TimeslotRequest++    Build-depends:+        array,+        base == 4.*,+        Cabal >= 1.10,+        containers >= 0.4.2.0,+        factory >= 0.3.1,+        mtl,+        QuickCheck >= 2.2,+        toolshed >= 0.17,+        weekdaze++    if impl(ghc >= 7.4.1)+        GHC-prof-options:	-fprof-auto -fprof-cafs -rtsopts -with-rtsopts=-H100M++        if impl(ghc >= 8.0)+            GHC-options:	-Wredundant-constraints+    else+        GHC-prof-options:	-auto-all -caf-all+
+ weekdaze.spec view
@@ -0,0 +1,87 @@+# Copyright (C) 2015 Dr. Alistair Ward+#+# This file is part of WeekDaze.+#+# WeekDaze 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.+#+# WeekDaze 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 WeekDaze.  If not, see <https://www.gnu.org/licenses/>.++%define package		%name-%version+%define tarBall		%package.tar.gz+%define _sharedir	%prefix/share+%define _datadir	%_sharedir/%name+%define _docdir		%_sharedir/doc/%name+%define _mandir		%_sharedir/man++Summary:	Attempts to find a timetable satisfying the configured requirements.+Name:		weekdaze+Version:	0.0.0.1+Release:	1+License:	GPLv3+# From '/usr/share/doc/packages/rpm/GROUPS'.+Group:		Applications/Productivity+# Source0:	https://functionalley.com/Downloads/sdist/%tarBall+URL:		https://functionalley.com/WeekDaze/weekdaze.html+Prefix:		/usr+BuildRequires:	haskell-platform++%description+A command-line application, which searches for a school-timetable matching the requirements defined in either an XML configuration-file or a SQL-database. The process is non-interactive; if the final result is inappropriate, then the configuration must be amended and the process re-started (regrettably a solution for all the requirements can neither be guaranteed to be found nor even to exist).+The solution is evolved randomly, and so the quality of the solution depends on the available time.+The result is presented from different perspectives; the students, the teachers, and the locations; and rendered in XHTML.++%prep+# N.B.: CWD has changed to %_builddir+echo 'package="%package", prefix="%prefix", _builddir="%_builddir", buildroot="%buildroot"'+(cd $OLDPWD && cabal sdist) && tar -zxf $OLDPWD/dist/%tarBall	# Make a source-distribution & unpack it into the build-directory.+cd '%package/' && cabal configure --user --prefix='%prefix' --datadir='%_datadir' --datasubdir='' --docdir='%_docdir'	# Tell cabal to use the user's personal package-database, to generate an appropriate "Paths" module, & where to place the documentation.++%build+cd '%package/' && cabal build	# Descend into the unpacked source-distribution and build according to the previously established configuration.++%install+cd '%package/'	# Descend into the build-directory.+cabal copy --destdir=%buildroot	# Install the built package in the target-directory.+mkdir -p -- '%buildroot%_docdir' && mv 'changelog.markdown' 'copyright' 'README.markdown' '%buildroot%_docdir/'	# 'LICENSE' has already been copied by cabal.+mkdir -p -- '%buildroot%_mandir' && mv man/man[15] '%buildroot%_mandir/'+rm -rf -- '%buildroot%prefix/lib/'	# The library isn't a deliverable.++%clean+rm -rf -- '%_builddir/%package/' '%buildroot/'	# Only the '.rpm' is required.++%files+%attr(0755, root, root)		%prefix/bin/%name+%attr(0644, root, root)		%_datadir/css/%name.css+%attr(0644, root, root)		%_datadir/dtd/%name.dtd+%attr(0644, root, root)		%_datadir/dtd/locationViewTimetable.dtd+%attr(0644, root, root)		%_datadir/dtd/studentViewTimetable.dtd+%attr(0644, root, root)		%_datadir/dtd/teacherViewTimetable.dtd+%attr(0644, root, root)		%_datadir/images/*.pdf+%attr(0644, root, root)		%_datadir/images/*.png+%attr(0644, root, root)		%_datadir/sql/MySQL/%{name}Create.sql+%attr(0644, root, root)		%_datadir/sql/MySQL/%{name}Examples.sql+%attr(0644, root, root)		%_datadir/sql/MySQL/%{name}Triggers.sql+%attr(0644, root, root)		%_datadir/sql/MySQL/odbc.ini+%attr(0644, root, root)		%_datadir/sql/MySQL/odbcinst.ini+%attr(0644, root, root)		%_datadir/xhtml/*.xhtml+%attr(0644, root, root)		%_datadir/xml/*.xml+%attr(0644, root, root) %doc	%_docdir/changelog.markdown+%attr(0644, root, root)	%doc	%_docdir/copyright+%attr(0644, root, root)	%doc	%_docdir/LICENSE+%attr(0644, root, root)	%doc	%_docdir/README.markdown+%attr(0644, root, root) %doc	%_mandir/man1/%name.1.gz+%attr(0644, root, root) %doc	%_mandir/man5/%name.5.gz++%changelog+* Thu Jul 04 2013	Alistair Ward	<weekdaze@functionalley.com>	0.0.0.1-1+First cut.+
+ weekdaze.svg view
@@ -0,0 +1,1552 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+<!-- Generated by graphviz version 2.38.0 (20140413.2041)+ -->+<!-- Title: G Pages: 1 -->+<svg width="2880pt" height="1660pt"+ viewBox="0.00 0.00 2880.00 1659.93" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">+<g id="graph0" class="graph" transform="scale(0.489713 0.489713) rotate(0) translate(4 3385.6)">+<title>G</title>+<polygon fill="white" stroke="none" points="-4,4 -4,-3385.6 5877,-3385.6 5877,4 -4,4"/>+<g id="clust1" class="cluster"><title>cluster_0</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="8,-18.504 8,-3363.1 5519,-3363.1 5519,-18.504 8,-18.504"/>+<text text-anchor="middle" x="2763.5" y="-3347.9" font-family="Times,serif" font-size="14.00">WeekDaze</text>+</g>+<g id="clust2" class="cluster"><title>cluster_1</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2016,-1119.49 2016,-1676.92 2714,-1676.92 2714,-1119.49 2016,-1119.49"/>+<text text-anchor="middle" x="2365" y="-1661.72" font-family="Times,serif" font-size="14.00">Aggregate</text>+</g>+<g id="clust3" class="cluster"><title>cluster_2</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="782,-735.533 782,-1100.99 1040,-1100.99 1040,-735.533 782,-735.533"/>+<text text-anchor="middle" x="911" y="-1085.79" font-family="Times,serif" font-size="14.00">Colour</text>+</g>+<g id="clust4" class="cluster"><title>cluster_3</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2792,-543.554 2792,-1292.96 3294,-1292.96 3294,-543.554 2792,-543.554"/>+<text text-anchor="middle" x="3043" y="-1277.76" font-family="Times,serif" font-size="14.00">Data</text>+</g>+<g id="clust5" class="cluster"><title>cluster_4</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3617,-1695.43 3617,-1868.9 3717,-1868.9 3717,-1695.43 3617,-1695.43"/>+<text text-anchor="middle" x="3667" y="-1853.7" font-family="Times,serif" font-size="14.00">Database</text>+</g>+<g id="clust6" class="cluster"><title>cluster_5</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="4285,-2079.38 4285,-2759.4 5174,-2759.4 5174,-2079.38 4285,-2079.38"/>+<text text-anchor="middle" x="4729.5" y="-2744.2" font-family="Times,serif" font-size="14.00">Dynamic</text>+</g>+<g id="clust7" class="cluster"><title>cluster_6</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3982,-351.575 3982,-525.05 4595,-525.05 4595,-351.575 3982,-351.575"/>+<text text-anchor="middle" x="4288.5" y="-509.85" font-family="Times,serif" font-size="14.00">Enhanced</text>+</g>+<g id="clust8" class="cluster"><title>cluster_7</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2792,-1311.47 2792,-2060.88 3422,-2060.88 3422,-1311.47 2792,-1311.47"/>+<text text-anchor="middle" x="3107" y="-2045.68" font-family="Times,serif" font-size="14.00">ExecutionConfiguration</text>+</g>+<g id="clust9" class="cluster"><title>cluster_8</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="4699,-735.533 4699,-909.007 5499,-909.007 5499,-735.533 4699,-735.533"/>+<text text-anchor="middle" x="5099" y="-893.807" font-family="Times,serif" font-size="14.00">Identifiers</text>+</g>+<g id="clust10" class="cluster"><title>cluster_9</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3143,-2777.91 3143,-3291.39 3955,-3291.39 3955,-2777.91 3143,-2777.91"/>+<text text-anchor="middle" x="3549" y="-3276.19" font-family="Times,serif" font-size="14.00">Implementation</text>+</g>+<g id="clust11" class="cluster"><title>cluster_10</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="5214,-1887.4 5214,-2252.86 5511,-2252.86 5511,-1887.4 5214,-1887.4"/>+<text text-anchor="middle" x="5362.5" y="-2237.66" font-family="Times,serif" font-size="14.00">Input</text>+</g>+<g id="clust12" class="cluster"><title>cluster_11</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="856,-1311.47 856,-1676.92 1040,-1676.92 1040,-1311.47 856,-1311.47"/>+<text text-anchor="middle" x="948" y="-1661.72" font-family="Times,serif" font-size="14.00">LinearModel</text>+</g>+<g id="clust13" class="cluster"><title>cluster_12</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="28,-1503.45 28,-2060.88 210,-2060.88 210,-1503.45 28,-1503.45"/>+<text text-anchor="middle" x="119" y="-2045.68" font-family="Times,serif" font-size="14.00">LocationView</text>+</g>+<g id="clust14" class="cluster"><title>cluster_13</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="1048,-543.554 1048,-1484.94 2008,-1484.94 2008,-543.554 1048,-543.554"/>+<text text-anchor="middle" x="1528" y="-1469.74" font-family="Times,serif" font-size="14.00">Model</text>+</g>+<g id="clust15" class="cluster"><title>cluster_14</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="5197,-927.511 5197,-1868.9 5404,-1868.9 5404,-927.511 5197,-927.511"/>+<text text-anchor="middle" x="5300.5" y="-1853.7" font-family="Times,serif" font-size="14.00">OutputConfiguration</text>+</g>+<g id="clust16" class="cluster"><title>cluster_15</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3975,-2777.91 3975,-3117.92 5350,-3117.92 5350,-2777.91 3975,-2777.91"/>+<text text-anchor="middle" x="4662.5" y="-3102.72" font-family="Times,serif" font-size="14.00">OutputFormat</text>+</g>+<g id="clust17" class="cluster"><title>cluster_16</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="3779,-1503.45 3779,-2252.86 4277,-2252.86 4277,-1503.45 3779,-1503.45"/>+<text text-anchor="middle" x="4028" y="-2237.66" font-family="Times,serif" font-size="14.00">ProblemConfiguration</text>+</g>+<g id="clust18" class="cluster"><title>cluster_17</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="500,-1311.47 500,-1868.9 816,-1868.9 816,-1311.47 500,-1311.47"/>+<text text-anchor="middle" x="658" y="-1853.7" font-family="Times,serif" font-size="14.00">StudentView</text>+</g>+<g id="clust19" class="cluster"><title>cluster_18</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="218,-1503.45 218,-2060.88 492,-2060.88 492,-1503.45 218,-1503.45"/>+<text text-anchor="middle" x="355" y="-2045.68" font-family="Times,serif" font-size="14.00">TeacherView</text>+</g>+<g id="clust20" class="cluster"><title>cluster_19</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="2133,-185.04 2133,-717.029 2732,-717.029 2732,-185.04 2133,-185.04"/>+<text text-anchor="middle" x="2432.5" y="-701.829" font-family="Times,serif" font-size="14.00">Temporal</text>+</g>+<g id="clust21" class="cluster"><title>cluster_20</title>+<polygon fill="#000000" fill-opacity="0.058824" stroke="#000000" stroke-opacity="0.058824" points="5016,-351.575 5016,-717.029 5120,-717.029 5120,-351.575 5016,-351.575"/>+<text text-anchor="middle" x="5068" y="-701.829" font-family="Times,serif" font-size="14.00">Text</text>+</g>+<!-- u1 -->+<g id="node1" class="node"><title>u1</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2094" cy="-1179.5" rx="59.2899" ry="18"/>+<text text-anchor="middle" x="2094" y="-1175.8" font-family="Times,serif" font-size="14.00">StudentBody</text>+</g>+<!-- u2 -->+<g id="node10" class="node"><title>u2</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="2930" cy="-987.504" rx="38.1938" ry="18"/>+<text text-anchor="middle" x="2930" y="-983.804" font-family="Times,serif" font-size="14.00">Student</text>+</g>+<!-- u1&#45;&gt;u2 -->+<g id="edge14" class="edge"><title>u1&#45;&gt;u2</title>+<path fill="none" stroke="black" d="M2149.32,-1172.96C2306.73,-1156.51 2754,-1104.81 2883,-1036.5 2893.89,-1030.74 2903.8,-1021.55 2911.68,-1012.76"/>+<polygon fill="black" stroke="black" points="2914.54,-1014.8 2918.31,-1004.9 2909.19,-1010.28 2914.54,-1014.8"/>+</g>+<!-- u18 -->+<g id="node2" class="node"><title>u18</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2635" cy="-1563.5" rx="71.4873" ry="18"/>+<text text-anchor="middle" x="2635" y="-1559.8" font-family="Times,serif" font-size="14.00">GroupCatalogue</text>+</g>+<!-- u3 -->+<g id="node11" class="node"><title>u3</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="3229" cy="-603.504" rx="34.394" ry="18"/>+<text text-anchor="middle" x="3229" y="-599.804" font-family="Times,serif" font-size="14.00">Group</text>+</g>+<!-- u18&#45;&gt;u3 -->+<g id="edge15" class="edge"><title>u18&#45;&gt;u3</title>+<path fill="none" stroke="black" d="M2651.45,-1545.7C2675.81,-1520.2 2721.94,-1469.5 2753,-1420.5 2772.69,-1389.44 2762.97,-1372.46 2788,-1345.5 2860.45,-1267.51 2904.51,-1281.21 2997,-1228.5 3144.76,-1144.3 3243.12,-1183.87 3328,-1036.5 3408.12,-897.399 3291.9,-698.102 3246.14,-629.113"/>+<polygon fill="black" stroke="black" points="3248.92,-626.968 3240.43,-620.626 3243.11,-630.876 3248.92,-626.968"/>+</g>+<!-- u19 -->+<g id="node16" class="node"><title>u19</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="3242" cy="-795.504" rx="43.5923" ry="18"/>+<text text-anchor="middle" x="3242" y="-791.804" font-family="Times,serif" font-size="14.00">Location</text>+</g>+<!-- u18&#45;&gt;u19 -->+<g id="edge16" class="edge"><title>u18&#45;&gt;u19</title>+<path fill="none" stroke="black" d="M2643.04,-1545.59C2662.14,-1506.68 2713.51,-1409.27 2778,-1345.5 2846.38,-1277.89 2891.77,-1296.26 2960,-1228.5 3092.02,-1097.4 3195.47,-894.619 3229.78,-822.806"/>+<polygon fill="black" stroke="black" points="3233.04,-824.099 3234.16,-813.563 3226.72,-821.102 3233.04,-824.099"/>+</g>+<!-- u20 -->+<g id="node3" class="node"><title>u20</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2094" cy="-1371.5" rx="57.6901" ry="18"/>+<text text-anchor="middle" x="2094" y="-1367.8" font-family="Times,serif" font-size="14.00">StudentClass</text>+</g>+<!-- u20&#45;&gt;u1 -->+<g id="edge17" class="edge"><title>u20&#45;&gt;u1</title>+<path fill="none" stroke="black" d="M2094,-1353.31C2094,-1320.17 2094,-1247.25 2094,-1207.55"/>+<polygon fill="black" stroke="black" points="2097.5,-1207.52 2094,-1197.52 2090.5,-1207.52 2097.5,-1207.52"/>+</g>+<!-- u37 -->+<g id="node4" class="node"><title>u37</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2303" cy="-1563.5" rx="81.4863" ry="18"/>+<text text-anchor="middle" x="2303" y="-1559.8" font-family="Times,serif" font-size="14.00">LocationCatalogue</text>+</g>+<!-- u37&#45;&gt;u19 -->+<g id="edge18" class="edge"><title>u37&#45;&gt;u19</title>+<path fill="none" stroke="black" d="M2331.68,-1546.66C2446.52,-1483.17 2868.2,-1249.53 2893,-1228.5 2903.05,-1219.98 3150.63,-910.75 3222.57,-820.808"/>+<polygon fill="black" stroke="black" points="3225.45,-822.801 3228.97,-812.806 3219.99,-818.429 3225.45,-822.801"/>+</g>+<!-- u38 -->+<g id="node5" class="node"><title>u38</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2114" cy="-1563.5" rx="89.8845" ry="18"/>+<text text-anchor="middle" x="2114" y="-1559.8" font-family="Times,serif" font-size="14.00">StudentBodyRegister</text>+</g>+<!-- u38&#45;&gt;u20 -->+<g id="edge19" class="edge"><title>u38&#45;&gt;u20</title>+<path fill="none" stroke="black" d="M2112.19,-1545.31C2108.7,-1512.17 2101.03,-1439.25 2096.85,-1399.55"/>+<polygon fill="black" stroke="black" points="2100.32,-1399.1 2095.79,-1389.52 2093.36,-1399.84 2100.32,-1399.1"/>+</g>+<!-- u39 -->+<g id="node6" class="node"><title>u39</title>+<ellipse fill="#bbbbff" stroke="black" stroke-width="0" cx="2474" cy="-1563.5" rx="71.4873" ry="18"/>+<text text-anchor="middle" x="2474" y="-1559.8" font-family="Times,serif" font-size="14.00">TeacherRegister</text>+</g>+<!-- u25 -->+<g id="node18" class="node"><title>u25</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="2843" cy="-1179.5" rx="40.8928" ry="18"/>+<text text-anchor="middle" x="2843" y="-1175.8" font-family="Times,serif" font-size="14.00">Teacher</text>+</g>+<!-- u39&#45;&gt;u25 -->+<g id="edge20" class="edge"><title>u39&#45;&gt;u25</title>+<path fill="none" stroke="black" d="M2490.33,-1545.6C2549.42,-1484.42 2752.2,-1274.5 2820.41,-1203.89"/>+<polygon fill="black" stroke="black" points="2823.25,-1205.99 2827.68,-1196.36 2818.21,-1201.12 2823.25,-1205.99"/>+</g>+<!-- u40 -->+<g id="node105" class="node"><title>u40</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2558" cy="-603.504" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="2558" y="-599.804" font-family="Times,serif" font-size="14.00">Workload</text>+</g>+<!-- u39&#45;&gt;u40 -->+<g id="edge21" class="edge"><title>u39&#45;&gt;u40</title>+<path fill="none" stroke="black" d="M2491.59,-1545.97C2535.9,-1505.24 2657.25,-1399.52 2778,-1345.5 2994.24,-1248.77 3150.02,-1413.48 3298,-1228.5 3329.86,-1188.68 3330.88,-808.492 3298,-769.504 3099.46,-534.063 2894.32,-782.226 2615,-652.504 2602.22,-646.57 2590,-637 2580.18,-627.96"/>+<polygon fill="black" stroke="black" points="2582.48,-625.317 2572.85,-620.904 2577.62,-630.36 2582.48,-625.317"/>+</g>+<!-- u30 -->+<g id="node7" class="node"><title>u30</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="969" cy="-987.504" rx="63.0888" ry="18"/>+<text text-anchor="middle" x="969" y="-983.804" font-family="Times,serif" font-size="14.00">HTMLColour</text>+</g>+<!-- u31 -->+<g id="node8" class="node"><title>u31</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="873" cy="-795.504" rx="83.3857" ry="18"/>+<text text-anchor="middle" x="873" y="-791.804" font-family="Times,serif" font-size="14.00">HTMLColourCode</text>+</g>+<!-- u30&#45;&gt;u31 -->+<g id="edge22" class="edge"><title>u30&#45;&gt;u31</title>+<path fill="none" stroke="black" d="M960.481,-969.643C943.729,-936.488 906.391,-862.591 886.34,-822.907"/>+<polygon fill="black" stroke="black" points="889.272,-820.948 881.638,-813.601 883.024,-824.104 889.272,-820.948"/>+</g>+<!-- u32 -->+<g id="node9" class="node"><title>u32</title>+<ellipse fill="#ffbbbb" stroke="black" stroke-width="0" cx="1003" cy="-795.504" rx="29.4969" ry="18"/>+<text text-anchor="middle" x="1003" y="-791.804" font-family="Times,serif" font-size="14.00">RGB</text>+</g>+<!-- u30&#45;&gt;u32 -->+<g id="edge23" class="edge"><title>u30&#45;&gt;u32</title>+<path fill="none" stroke="black" d="M972.077,-969.308C978.007,-936.172 991.056,-863.25 998.16,-823.55"/>+<polygon fill="black" stroke="black" points="1001.64,-823.985 999.954,-813.525 994.747,-822.752 1001.64,-823.985"/>+</g>+<!-- u8 -->+<g id="node12" class="node"><title>u8</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="3108" cy="-795.504" rx="72.2875" ry="18"/>+<text text-anchor="middle" x="3108" y="-791.804" font-family="Times,serif" font-size="14.00">HumanResource</text>+</g>+<!-- u2&#45;&gt;u8 -->+<g id="edge24" class="edge"><title>u2&#45;&gt;u8</title>+<path fill="none" stroke="black" d="M2944.87,-970.631C2976.05,-937.353 3048.42,-860.101 3085.39,-820.642"/>+<polygon fill="black" stroke="black" points="3088,-822.969 3092.29,-813.278 3082.89,-818.183 3088,-822.969"/>+</g>+<!-- u12 -->+<g id="node14" class="node"><title>u12</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="2956" cy="-795.504" rx="61.99" ry="18"/>+<text text-anchor="middle" x="2956" y="-791.804" font-family="Times,serif" font-size="14.00">Requirements</text>+</g>+<!-- u2&#45;&gt;u12 -->+<g id="edge25" class="edge"><title>u2&#45;&gt;u12</title>+<path fill="none" stroke="black" d="M2932.35,-969.308C2936.89,-936.172 2946.87,-863.25 2952.3,-823.55"/>+<polygon fill="black" stroke="black" points="2955.78,-823.907 2953.67,-813.525 2948.85,-822.958 2955.78,-823.907"/>+</g>+<!-- u13 -->+<g id="node15" class="node"><title>u13</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="2838" cy="-795.504" rx="38.1938" ry="18"/>+<text text-anchor="middle" x="2838" y="-791.804" font-family="Times,serif" font-size="14.00">Subject</text>+</g>+<!-- u2&#45;&gt;u13 -->+<g id="edge26" class="edge"><title>u2&#45;&gt;u13</title>+<path fill="none" stroke="black" d="M2921.84,-969.643C2905.74,-936.404 2869.82,-862.218 2850.64,-822.607"/>+<polygon fill="black" stroke="black" points="2853.65,-820.802 2846.15,-813.327 2847.35,-823.853 2853.65,-820.802"/>+</g>+<!-- u7 -->+<g id="node27" class="node"><title>u7</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4213" cy="-411.504" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="4213" y="-407.804" font-family="Times,serif" font-size="14.00">EnhancedBool</text>+</g>+<!-- u3&#45;&gt;u7 -->+<g id="edge27" class="edge"><title>u3&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M3263.78,-602.24C3387.38,-600.245 3815.27,-584.251 4139,-460.504 4155.19,-454.314 4171.53,-444.213 4184.73,-434.87"/>+<polygon fill="black" stroke="black" points="4186.9,-437.615 4192.91,-428.888 4182.77,-431.964 4186.9,-437.615"/>+</g>+<!-- u5 -->+<g id="node99" class="node"><title>u5</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2400" cy="-411.504" rx="30.5947" ry="18"/>+<text text-anchor="middle" x="2400" y="-407.804" font-family="Times,serif" font-size="14.00">Time</text>+</g>+<!-- u3&#45;&gt;u5 -->+<g id="edge28" class="edge"><title>u3&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M3202.98,-591.431C3190.72,-586.574 3175.8,-581.158 3162,-577.504 2847.33,-494.203 2720.76,-623.503 2439,-460.504 2429.38,-454.939 2421.16,-446.028 2414.79,-437.386"/>+<polygon fill="black" stroke="black" points="2417.57,-435.255 2409.04,-428.968 2411.79,-439.201 2417.57,-435.255"/>+</g>+<!-- u8&#45;&gt;u3 -->+<g id="edge29" class="edge"><title>u8&#45;&gt;u3</title>+<path fill="none" stroke="black" d="M3118.74,-777.643C3140.1,-744.095 3188.03,-668.835 3213.07,-629.511"/>+<polygon fill="black" stroke="black" points="3216.21,-631.102 3218.63,-620.787 3210.31,-627.341 3216.21,-631.102"/>+</g>+<!-- u9 -->+<g id="node13" class="node"><title>u9</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="3108" cy="-603.504" rx="45.4919" ry="18"/>+<text text-anchor="middle" x="3108" y="-599.804" font-family="Times,serif" font-size="14.00">Resource</text>+</g>+<!-- u8&#45;&gt;u9 -->+<g id="edge30" class="edge"><title>u8&#45;&gt;u9</title>+<path fill="none" stroke="black" d="M3108,-777.308C3108,-744.172 3108,-671.25 3108,-631.55"/>+<polygon fill="black" stroke="black" points="3111.5,-631.525 3108,-621.525 3104.5,-631.525 3111.5,-631.525"/>+</g>+<!-- u11 -->+<g id="node102" class="node"><title>u11</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2234" cy="-603.504" rx="92.8835" ry="18"/>+<text text-anchor="middle" x="2234" y="-599.804" font-family="Times,serif" font-size="14.00">FreePeriodPreference</text>+</g>+<!-- u8&#45;&gt;u11 -->+<g id="edge31" class="edge"><title>u8&#45;&gt;u11</title>+<path fill="none" stroke="black" d="M3066.67,-780.598C3054.03,-776.658 3040.03,-772.603 3027,-769.504 2723.97,-697.418 2633.22,-745.679 2336,-652.504 2314.11,-645.643 2290.89,-635.003 2272.14,-625.483"/>+<polygon fill="black" stroke="black" points="2273.53,-622.266 2263.04,-620.778 2270.32,-628.482 2273.53,-622.266"/>+</g>+<!-- u10 -->+<g id="node101" class="node"><title>u10</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2502" cy="-411.504" rx="53.8905" ry="18"/>+<text text-anchor="middle" x="2502" y="-407.804" font-family="Times,serif" font-size="14.00">Availability</text>+</g>+<!-- u9&#45;&gt;u10 -->+<g id="edge32" class="edge"><title>u9&#45;&gt;u10</title>+<path fill="none" stroke="black" d="M3073.24,-591.606C2970.48,-559.388 2667.94,-464.53 2549.92,-427.528"/>+<polygon fill="black" stroke="black" points="2550.67,-424.095 2540.08,-424.443 2548.57,-430.774 2550.67,-424.095"/>+</g>+<!-- u14 -->+<g id="node106" class="node"><title>u14</title>+<ellipse fill="#bb7733" stroke="black" stroke-width="0" cx="5068" cy="-603.504" rx="43.5923" ry="18"/>+<text text-anchor="middle" x="5068" y="-599.804" font-family="Times,serif" font-size="14.00">XHTML</text>+</g>+<!-- u13&#45;&gt;u14 -->+<g id="edge33" class="edge"><title>u13&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M2859.67,-780.572C2867.37,-776.28 2876.3,-772.026 2885,-769.504 3302.83,-648.383 4719,-611.941 5013.92,-605.586"/>+<polygon fill="black" stroke="black" points="5014.41,-609.077 5024.33,-605.364 5014.26,-602.078 5014.41,-609.077"/>+</g>+<!-- u19&#45;&gt;u9 -->+<g id="edge34" class="edge"><title>u19&#45;&gt;u9</title>+<path fill="none" stroke="black" d="M3230.34,-777.975C3206.78,-744.568 3153.38,-668.847 3125.57,-629.419"/>+<polygon fill="black" stroke="black" points="3128.35,-627.285 3119.73,-621.13 3122.63,-631.319 3128.35,-627.285"/>+</g>+<!-- u21 -->+<g id="node17" class="node"><title>u21</title>+<ellipse fill="#bbffff" stroke="black" stroke-width="0" cx="2837" cy="-987.504" rx="37.0935" ry="18"/>+<text text-anchor="middle" x="2837" y="-983.804" font-family="Times,serif" font-size="14.00">Course</text>+</g>+<!-- u21&#45;&gt;u13 -->+<g id="edge35" class="edge"><title>u21&#45;&gt;u13</title>+<path fill="none" stroke="black" d="M2837.09,-969.308C2837.26,-936.172 2837.65,-863.25 2837.86,-823.55"/>+<polygon fill="black" stroke="black" points="2841.36,-823.543 2837.91,-813.525 2834.36,-823.506 2841.36,-823.543"/>+</g>+<!-- u21&#45;&gt;u19 -->+<g id="edge36" class="edge"><title>u21&#45;&gt;u19</title>+<path fill="none" stroke="black" d="M2860.1,-973.176C2867.33,-969.214 2875.4,-965.001 2883,-961.504 3015.26,-900.607 3064.91,-920.679 3189,-844.504 3199.96,-837.773 3210.74,-828.625 3219.68,-820.12"/>+<polygon fill="black" stroke="black" points="3222.35,-822.399 3227.02,-812.888 3217.44,-817.411 3222.35,-822.399"/>+</g>+<!-- u22 -->+<g id="node103" class="node"><title>u22</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2418" cy="-603.504" rx="73.387" ry="18"/>+<text text-anchor="middle" x="2418" y="-599.804" font-family="Times,serif" font-size="14.00">TimeslotRequest</text>+</g>+<!-- u21&#45;&gt;u22 -->+<g id="edge37" class="edge"><title>u21&#45;&gt;u22</title>+<path fill="none" stroke="black" d="M2820.32,-971.293C2755.72,-912.398 2521.76,-699.102 2443.62,-627.857"/>+<polygon fill="black" stroke="black" points="2445.88,-625.182 2436.13,-621.032 2441.16,-630.355 2445.88,-625.182"/>+</g>+<!-- u25&#45;&gt;u8 -->+<g id="edge38" class="edge"><title>u25&#45;&gt;u8</title>+<path fill="none" stroke="black" d="M2861.71,-1163.44C2890.37,-1139.43 2945.16,-1089.74 2977,-1036.5 2995.04,-1006.35 2986.83,-993.197 3002,-961.504 3027.12,-909.009 3065.95,-853.056 3088.99,-821.665"/>+<polygon fill="black" stroke="black" points="3091.9,-823.607 3095.04,-813.486 3086.28,-819.442 3091.9,-823.607"/>+</g>+<!-- u25&#45;&gt;u21 -->+<g id="edge39" class="edge"><title>u25&#45;&gt;u21</title>+<path fill="none" stroke="black" d="M2842.46,-1161.31C2841.41,-1128.17 2839.11,-1055.25 2837.85,-1015.55"/>+<polygon fill="black" stroke="black" points="2841.35,-1015.41 2837.54,-1005.52 2834.35,-1015.63 2841.35,-1015.41"/>+</g>+<!-- u45 -->+<g id="node19" class="node"><title>u45</title>+<ellipse fill="#ffbbff" stroke="black" stroke-width="0" cx="3667" cy="-1755.5" rx="41.6928" ry="18"/>+<text text-anchor="middle" x="3667" y="-1751.8" font-family="Times,serif" font-size="14.00">Selector</text>+</g>+<!-- u17 -->+<g id="node20" class="node"><title>u17</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="4696" cy="-2646.5" rx="124.578" ry="18"/>+<text text-anchor="middle" x="4696" y="-2642.8" font-family="Times,serif" font-size="14.00">StudentViewTimetableUtilities</text>+</g>+<!-- u23 -->+<g id="node21" class="node"><title>u23</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="5071" cy="-2479.5" rx="94.7833" ry="18"/>+<text text-anchor="middle" x="5071" y="-2475.8" font-family="Times,serif" font-size="14.00">HumanViewTimetable</text>+</g>+<!-- u17&#45;&gt;u23 -->+<g id="edge40" class="edge"><title>u17&#45;&gt;u23</title>+<path fill="none" stroke="black" d="M4732.98,-2629.23C4802.18,-2598.79 4950.98,-2533.31 5025.92,-2500.34"/>+<polygon fill="black" stroke="black" points="5027.38,-2503.52 5035.12,-2496.29 5024.56,-2497.12 5027.38,-2503.52"/>+</g>+<!-- u77 -->+<g id="node24" class="node"><title>u77</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="4798" cy="-2479.5" rx="160.572" ry="18"/>+<text text-anchor="middle" x="4798" y="-2475.8" font-family="Times,serif" font-size="14.00">StudentViewTimetableForWeekUtilities</text>+</g>+<!-- u17&#45;&gt;u77 -->+<g id="edge41" class="edge"><title>u17&#45;&gt;u77</title>+<path fill="none" stroke="black" d="M4706.53,-2628.47C4724.4,-2599.57 4760.76,-2540.75 4781.85,-2506.62"/>+<polygon fill="black" stroke="black" points="4785.09,-2508.04 4787.37,-2497.69 4779.14,-2504.36 4785.09,-2508.04"/>+</g>+<!-- u78 -->+<g id="node25" class="node"><title>u78</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="4456" cy="-2479.5" rx="163.271" ry="18"/>+<text text-anchor="middle" x="4456" y="-2475.8" font-family="Times,serif" font-size="14.00">TeacherViewTimetableForWeekUtilities</text>+</g>+<!-- u17&#45;&gt;u78 -->+<g id="edge42" class="edge"><title>u17&#45;&gt;u78</title>+<path fill="none" stroke="black" d="M4671.67,-2628.77C4628.39,-2599.02 4537.99,-2536.87 4489.09,-2503.26"/>+<polygon fill="black" stroke="black" points="4490.98,-2500.31 4480.76,-2497.52 4487.01,-2506.07 4490.98,-2500.31"/>+</g>+<!-- u24 -->+<g id="node22" class="node"><title>u24</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="4420" cy="-2312.5" rx="127.277" ry="18"/>+<text text-anchor="middle" x="4420" y="-2308.8" font-family="Times,serif" font-size="14.00">TeacherViewTimetableUtilities</text>+</g>+<!-- u23&#45;&gt;u24 -->+<g id="edge43" class="edge"><title>u23&#45;&gt;u24</title>+<path fill="none" stroke="black" d="M5016.62,-2464.72C4898.68,-2434.83 4619.54,-2364.08 4489.24,-2331.05"/>+<polygon fill="black" stroke="black" points="4489.92,-2327.61 4479.36,-2328.55 4488.2,-2334.4 4489.92,-2327.61"/>+</g>+<!-- u26 -->+<g id="node23" class="node"><title>u26</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="4406" cy="-2139.5" rx="113.18" ry="18"/>+<text text-anchor="middle" x="4406" y="-2135.8" font-family="Times,serif" font-size="14.00">TimetableForWeekUtilities</text>+</g>+<!-- u24&#45;&gt;u26 -->+<g id="edge44" class="edge"><title>u24&#45;&gt;u26</title>+<path fill="none" stroke="black" d="M4418.61,-2294.48C4416.18,-2264.85 4411.16,-2203.57 4408.24,-2167.89"/>+<polygon fill="black" stroke="black" points="4411.71,-2167.39 4407.41,-2157.71 4404.74,-2167.96 4411.71,-2167.39"/>+</g>+<!-- u46 -->+<g id="node31" class="node"><title>u46</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3337" cy="-1947.5" rx="77.1866" ry="18"/>+<text text-anchor="middle" x="3337" y="-1943.8" font-family="Times,serif" font-size="14.00">ExecutionOptions</text>+</g>+<!-- u24&#45;&gt;u46 -->+<g id="edge45" class="edge"><title>u24&#45;&gt;u46</title>+<path fill="none" stroke="black" d="M4316.84,-2301.88C4187.26,-2287.53 3959.53,-2254.79 3775,-2188.5 3613.01,-2130.32 3438.88,-2018.06 3368.84,-1970.58"/>+<polygon fill="black" stroke="black" points="3370.67,-1967.59 3360.43,-1964.85 3366.72,-1973.37 3370.67,-1967.59"/>+</g>+<!-- u63 -->+<g id="node89" class="node"><title>u63</title>+<ellipse fill="#ff77bb" stroke="black" stroke-width="0" cx="4032" cy="-2139.5" rx="74.187" ry="18"/>+<text text-anchor="middle" x="4032" y="-2135.8" font-family="Times,serif" font-size="14.00">ProblemAnalysis</text>+</g>+<!-- u24&#45;&gt;u63 -->+<g id="edge46" class="edge"><title>u24&#45;&gt;u63</title>+<path fill="none" stroke="black" d="M4383.15,-2295.26C4311.22,-2263.56 4152.46,-2193.59 4075.51,-2159.68"/>+<polygon fill="black" stroke="black" points="4076.66,-2156.36 4066.1,-2155.53 4073.84,-2162.77 4076.66,-2156.36"/>+</g>+<!-- u29 -->+<g id="node62" class="node"><title>u29</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1580" cy="-1179.5" rx="83.6854" ry="18"/>+<text text-anchor="middle" x="1580" y="-1175.8" font-family="Times,serif" font-size="14.00">TimetableForWeek</text>+</g>+<!-- u26&#45;&gt;u29 -->+<g id="edge47" class="edge"><title>u26&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M4339.81,-2124.83C4188.77,-2093.44 3827.63,-2017.33 3775,-1996.5 3618.65,-1934.63 3536.07,-1948.35 3449,-1804.5 3396.12,-1717.13 3497.03,-1418.88 3426,-1345.5 3316.35,-1232.23 2168.91,-1243.71 2012,-1228.5 1889.72,-1216.65 1748.25,-1200.46 1661.46,-1190.25"/>+<polygon fill="black" stroke="black" points="1661.75,-1186.76 1651.41,-1189.06 1660.93,-1193.71 1661.75,-1186.76"/>+</g>+<!-- u36 -->+<g id="node85" class="node"><title>u36</title>+<ellipse fill="#ff77bb" stroke="black" stroke-width="0" cx="3870" cy="-1947.5" rx="83.3857" ry="18"/>+<text text-anchor="middle" x="3870" y="-1943.8" font-family="Times,serif" font-size="14.00">ProblemParameters</text>+</g>+<!-- u26&#45;&gt;u36 -->+<g id="edge48" class="edge"><title>u26&#45;&gt;u36</title>+<path fill="none" stroke="black" d="M4361.68,-2122.79C4263.03,-2087.82 4025.8,-2003.73 3921.11,-1966.62"/>+<polygon fill="black" stroke="black" points="3922,-1963.22 3911.4,-1963.18 3919.66,-1969.82 3922,-1963.22"/>+</g>+<!-- u77&#45;&gt;u63 -->+<g id="edge49" class="edge"><title>u77&#45;&gt;u63</title>+<path fill="none" stroke="black" d="M4713.99,-2464.12C4609.27,-2444.02 4426.68,-2401.77 4284,-2330.5 4259.71,-2318.37 4122.01,-2211.16 4061.04,-2163.35"/>+<polygon fill="black" stroke="black" points="4063,-2160.43 4052.97,-2157.01 4058.68,-2165.94 4063,-2160.43"/>+</g>+<!-- u78&#45;&gt;u63 -->+<g id="edge50" class="edge"><title>u78&#45;&gt;u63</title>+<path fill="none" stroke="black" d="M4429.34,-2461.53C4388.23,-2435.03 4307.41,-2381.55 4243,-2330.5 4172.31,-2274.48 4094.87,-2201.47 4056.45,-2164.38"/>+<polygon fill="black" stroke="black" points="4058.48,-2161.48 4048.86,-2157.03 4053.61,-2166.5 4058.48,-2161.48"/>+</g>+<!-- u107 -->+<g id="node26" class="node"><title>u107</title>+<ellipse fill="#77ff77" stroke="black" stroke-width="0" cx="4423" cy="-2646.5" rx="129.977" ry="18"/>+<text text-anchor="middle" x="4423" y="-2642.8" font-family="Times,serif" font-size="14.00">LocationViewTimetableUtilities</text>+</g>+<!-- u107&#45;&gt;u46 -->+<g id="edge51" class="edge"><title>u107&#45;&gt;u46</title>+<path fill="none" stroke="black" d="M4387.7,-2629.04C4271.5,-2574.15 3892.15,-2389.49 3609,-2188.5 3510.21,-2118.38 3406.3,-2018.12 3360.75,-1972.62"/>+<polygon fill="black" stroke="black" points="3362.98,-1969.9 3353.44,-1965.29 3358.02,-1974.84 3362.98,-1969.9"/>+</g>+<!-- u107&#45;&gt;u63 -->+<g id="edge52" class="edge"><title>u107&#45;&gt;u63</title>+<path fill="none" stroke="black" d="M4405.49,-2628.46C4378.29,-2601.64 4324.78,-2547.49 4284,-2497.5 4187.29,-2378.97 4086.58,-2225.67 4048.18,-2165.92"/>+<polygon fill="black" stroke="black" points="4051.11,-2164 4042.76,-2157.47 4045.21,-2167.78 4051.11,-2164"/>+</g>+<!-- u42 -->+<g id="node28" class="node"><title>u42</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4366" cy="-411.504" rx="68.7879" ry="18"/>+<text text-anchor="middle" x="4366" y="-407.804" font-family="Times,serif" font-size="14.00">EnhancedTuple</text>+</g>+<!-- u47 -->+<g id="node29" class="node"><title>u47</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4060" cy="-411.504" rx="69.5877" ry="18"/>+<text text-anchor="middle" x="4060" y="-407.804" font-family="Times,serif" font-size="14.00">EnhancedEither</text>+</g>+<!-- u79 -->+<g id="node30" class="node"><title>u79</title>+<ellipse fill="#ffff77" stroke="black" stroke-width="0" cx="4520" cy="-411.504" rx="66.8882" ry="18"/>+<text text-anchor="middle" x="4520" y="-407.804" font-family="Times,serif" font-size="14.00">EnhancedRatio</text>+</g>+<!-- u46&#45;&gt;u47 -->+<g id="edge54" class="edge"><title>u46&#45;&gt;u47</title>+<path fill="none" stroke="black" d="M3349.44,-1929.67C3367.52,-1904.14 3400.37,-1853.4 3414,-1804.5 3429.94,-1747.32 3454.48,-1587.84 3423,-1537.5 3402.19,-1504.24 2808.81,-1261.77 2788,-1228.5 2768.82,-1197.84 2764.13,-604.673 2788,-577.504 2867.37,-487.176 3718.28,-431.815 3982.32,-416.716"/>+<polygon fill="black" stroke="black" points="3982.8,-420.195 3992.58,-416.133 3982.4,-413.206 3982.8,-420.195"/>+</g>+<!-- u49 -->+<g id="node33" class="node"><title>u49</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="2883" cy="-1755.5" rx="83.3857" ry="18"/>+<text text-anchor="middle" x="2883" y="-1751.8" font-family="Times,serif" font-size="14.00">EvolutionStrategies</text>+</g>+<!-- u46&#45;&gt;u49 -->+<g id="edge55" class="edge"><title>u46&#45;&gt;u49</title>+<path fill="none" stroke="black" d="M3296.24,-1932.13C3228.59,-1907.93 3089.27,-1856.55 2975,-1804.5 2956.74,-1796.19 2936.95,-1786.02 2920.43,-1777.19"/>+<polygon fill="black" stroke="black" points="2922.08,-1774.1 2911.61,-1772.44 2918.76,-1780.27 2922.08,-1774.1"/>+</g>+<!-- u51 -->+<g id="node35" class="node"><title>u51</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3310" cy="-1755.5" rx="94.7833" ry="18"/>+<text text-anchor="middle" x="3310" y="-1751.8" font-family="Times,serif" font-size="14.00">LessonCriteriaWeights</text>+</g>+<!-- u46&#45;&gt;u51 -->+<g id="edge56" class="edge"><title>u46&#45;&gt;u51</title>+<path fill="none" stroke="black" d="M3334.56,-1929.31C3329.85,-1896.17 3319.48,-1823.25 3313.84,-1783.55"/>+<polygon fill="black" stroke="black" points="3317.29,-1782.93 3312.42,-1773.52 3310.36,-1783.92 3317.29,-1782.93"/>+</g>+<!-- u54 -->+<g id="node38" class="node"><title>u54</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3091" cy="-1755.5" rx="106.681" ry="18"/>+<text text-anchor="middle" x="3091" y="-1751.8" font-family="Times,serif" font-size="14.00">TimetableCriteriaWeights</text>+</g>+<!-- u46&#45;&gt;u54 -->+<g id="edge57" class="edge"><title>u46&#45;&gt;u54</title>+<path fill="none" stroke="black" d="M3315.6,-1929.98C3271.73,-1896.09 3171.5,-1818.68 3121.1,-1779.76"/>+<polygon fill="black" stroke="black" points="3122.93,-1776.75 3112.88,-1773.4 3118.65,-1782.29 3122.93,-1776.75"/>+</g>+<!-- u55 -->+<g id="node65" class="node"><title>u55</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1388" cy="-987.504" rx="87.9851" ry="18"/>+<text text-anchor="middle" x="1388" y="-983.804" font-family="Times,serif" font-size="14.00">TimetableAxisTriple</text>+</g>+<!-- u46&#45;&gt;u55 -->+<g id="edge58" class="edge"><title>u46&#45;&gt;u55</title>+<path fill="none" stroke="black" d="M3271.3,-1937.77C3141.51,-1919.23 2858.87,-1872.03 2791,-1804.5 2728.41,-1742.23 2753.52,-1699.75 2740,-1612.5 2736.09,-1587.28 2735.63,-1171.97 2718,-1153.5 2527.82,-954.241 1748.79,-1112.39 1484,-1036.5 1462.64,-1030.38 1440.36,-1019.55 1422.64,-1009.73"/>+<polygon fill="black" stroke="black" points="1424.25,-1006.61 1413.82,-1004.71 1420.78,-1012.7 1424.25,-1006.61"/>+</g>+<!-- u16 -->+<g id="node109" class="node"><title>u16</title>+<ellipse fill="#ffffbb" stroke="black" stroke-width="0" cx="3525" cy="-1755.5" rx="61.99" ry="18"/>+<text text-anchor="middle" x="3525" y="-1751.8" font-family="Times,serif" font-size="14.00">Configuration</text>+</g>+<!-- u46&#45;&gt;u16 -->+<g id="edge53" class="edge"><title>u46&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3353.68,-1929.64C3387.21,-1895.76 3462.86,-1819.31 3501.43,-1780.33"/>+<polygon fill="black" stroke="black" points="3504.08,-1782.63 3508.62,-1773.06 3499.1,-1777.7 3504.08,-1782.63"/>+</g>+<!-- u48 -->+<g id="node32" class="node"><title>u48</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="2873" cy="-1371.5" rx="71.4873" ry="18"/>+<text text-anchor="middle" x="2873" y="-1367.8" font-family="Times,serif" font-size="14.00">CriterionWeight</text>+</g>+<!-- u50 -->+<g id="node34" class="node"><title>u50</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="2916" cy="-1563.5" rx="115.88" ry="18"/>+<text text-anchor="middle" x="2916" y="-1559.8" font-family="Times,serif" font-size="14.00">TimetableBreederFecundity</text>+</g>+<!-- u49&#45;&gt;u50 -->+<g id="edge59" class="edge"><title>u49&#45;&gt;u50</title>+<path fill="none" stroke="black" d="M2885.99,-1737.31C2891.74,-1704.17 2904.41,-1631.25 2911.3,-1591.55"/>+<polygon fill="black" stroke="black" points="2914.78,-1591.98 2913.04,-1581.52 2907.88,-1590.78 2914.78,-1591.98"/>+</g>+<!-- u6 -->+<g id="node100" class="node"><title>u6</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2502" cy="-245.504" rx="27" ry="18"/>+<text text-anchor="middle" x="2502" y="-241.804" font-family="Times,serif" font-size="14.00">Day</text>+</g>+<!-- u49&#45;&gt;u6 -->+<g id="edge60" class="edge"><title>u49&#45;&gt;u6</title>+<path fill="none" stroke="black" d="M2868.34,-1737.5C2847.38,-1712.15 2809.36,-1662.09 2791,-1612.5 2719.53,-1419.46 2828.31,-1333.82 2729,-1153.5 2561.89,-850.095 2278.38,-966.439 2132,-652.504 2045.23,-466.413 2366.13,-306.16 2470.34,-259.913"/>+<polygon fill="black" stroke="black" points="2471.98,-263.018 2479.73,-255.797 2469.17,-256.607 2471.98,-263.018"/>+</g>+<!-- u52 -->+<g id="node36" class="node"><title>u52</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3094" cy="-1563.5" rx="44.393" ry="18"/>+<text text-anchor="middle" x="3094" y="-1559.8" font-family="Times,serif" font-size="14.00">Criterion</text>+</g>+<!-- u51&#45;&gt;u52 -->+<g id="edge61" class="edge"><title>u51&#45;&gt;u52</title>+<path fill="none" stroke="black" d="M3290.57,-1737.79C3259.91,-1711.37 3198.49,-1658.24 3147,-1612.5 3137.67,-1604.21 3127.49,-1595.03 3118.57,-1586.94"/>+<polygon fill="black" stroke="black" points="3120.86,-1584.29 3111.11,-1580.15 3116.15,-1589.47 3120.86,-1584.29"/>+</g>+<!-- u53 -->+<g id="node37" class="node"><title>u53</title>+<ellipse fill="#7777ff" stroke="black" stroke-width="0" cx="3285" cy="-1563.5" rx="128.877" ry="18"/>+<text text-anchor="middle" x="3285" y="-1559.8" font-family="Times,serif" font-size="14.00">OptimiseLessonCriteriaWeights</text>+</g>+<!-- u51&#45;&gt;u53 -->+<g id="edge62" class="edge"><title>u51&#45;&gt;u53</title>+<path fill="none" stroke="black" d="M3307.74,-1737.31C3303.38,-1704.17 3293.78,-1631.25 3288.56,-1591.55"/>+<polygon fill="black" stroke="black" points="3292.01,-1590.98 3287.24,-1581.52 3285.07,-1591.9 3292.01,-1590.98"/>+</g>+<!-- u52&#45;&gt;u48 -->+<g id="edge63" class="edge"><title>u52&#45;&gt;u48</title>+<path fill="none" stroke="black" d="M3075.91,-1546.96C3037.11,-1513.6 2945.7,-1435 2899.99,-1395.71"/>+<polygon fill="black" stroke="black" points="2902.14,-1392.94 2892.28,-1389.08 2897.58,-1398.25 2902.14,-1392.94"/>+</g>+<!-- u53&#45;&gt;u7 -->+<g id="edge64" class="edge"><title>u53&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M3259.26,-1545.66C3156.32,-1478.3 2779.73,-1231.71 2778,-1228.5 2772.59,-1218.45 2747.28,-621.139 2788,-577.504 2993.6,-357.194 3854,-558.411 4139,-460.504 4155.63,-454.79 4172.23,-444.543 4185.49,-434.98"/>+<polygon fill="black" stroke="black" points="4187.77,-437.643 4193.68,-428.848 4183.57,-432.039 4187.77,-437.643"/>+</g>+<!-- u54&#45;&gt;u52 -->+<g id="edge65" class="edge"><title>u54&#45;&gt;u52</title>+<path fill="none" stroke="black" d="M3091.27,-1737.31C3091.79,-1704.17 3092.95,-1631.25 3093.57,-1591.55"/>+<polygon fill="black" stroke="black" points="3097.07,-1591.58 3093.73,-1581.52 3090.07,-1591.47 3097.07,-1591.58"/>+</g>+<!-- u80 -->+<g id="node39" class="node"><title>u80</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="5369" cy="-795.504" rx="40.0939" ry="18"/>+<text text-anchor="middle" x="5369" y="-791.804" font-family="Times,serif" font-size="14.00">Campus</text>+</g>+<!-- u80&#45;&gt;u14 -->+<g id="edge66" class="edge"><title>u80&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M5346.38,-780.223C5293.32,-746.731 5160.76,-663.058 5099.7,-624.516"/>+<polygon fill="black" stroke="black" points="5101.21,-621.329 5090.89,-618.951 5097.47,-627.248 5101.21,-621.329"/>+</g>+<!-- u81 -->+<g id="node40" class="node"><title>u81</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="5459" cy="-795.504" rx="31.6951" ry="18"/>+<text text-anchor="middle" x="5459" y="-791.804" font-family="Times,serif" font-size="14.00">Level</text>+</g>+<!-- u81&#45;&gt;u14 -->+<g id="edge67" class="edge"><title>u81&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M5438.39,-781.348C5431.95,-777.393 5424.75,-773.141 5418,-769.504 5307.46,-709.965 5171.76,-649.412 5106.57,-621.063"/>+<polygon fill="black" stroke="black" points="5107.66,-617.724 5097.1,-616.956 5104.88,-624.146 5107.66,-617.724"/>+</g>+<!-- u82 -->+<g id="node41" class="node"><title>u82</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4758" cy="-795.504" rx="51.1914" ry="18"/>+<text text-anchor="middle" x="4758" y="-791.804" font-family="Times,serif" font-size="14.00">LocationId</text>+</g>+<!-- u82&#45;&gt;u14 -->+<g id="edge68" class="edge"><title>u82&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M4782.33,-779.595C4837.83,-745.575 4973.82,-662.228 5036.01,-624.108"/>+<polygon fill="black" stroke="black" points="5037.94,-627.034 5044.64,-618.824 5034.28,-621.065 5037.94,-627.034"/>+</g>+<!-- u83 -->+<g id="node42" class="node"><title>u83</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4864" cy="-795.504" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="4864" y="-791.804" font-family="Times,serif" font-size="14.00">Stream</text>+</g>+<!-- u83&#45;&gt;u14 -->+<g id="edge69" class="edge"><title>u83&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M4880.35,-779.277C4916.13,-745.951 5001.54,-666.405 5043.66,-627.173"/>+<polygon fill="black" stroke="black" points="5046.07,-629.714 5051,-620.337 5041.3,-624.591 5046.07,-629.714"/>+</g>+<!-- u84 -->+<g id="node43" class="node"><title>u84</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="4996" cy="-795.504" rx="77.1866" ry="18"/>+<text text-anchor="middle" x="4996" y="-791.804" font-family="Times,serif" font-size="14.00">SynchronisationId</text>+</g>+<!-- u84&#45;&gt;u14 -->+<g id="edge70" class="edge"><title>u84&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M5002.52,-777.308C5015.13,-744.031 5042.94,-670.628 5057.94,-631.044"/>+<polygon fill="black" stroke="black" points="5061.28,-632.116 5061.55,-621.525 5054.73,-629.635 5061.28,-632.116"/>+</g>+<!-- u85 -->+<g id="node44" class="node"><title>u85</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="5140" cy="-795.504" rx="48.9926" ry="18"/>+<text text-anchor="middle" x="5140" y="-791.804" font-family="Times,serif" font-size="14.00">TeacherId</text>+</g>+<!-- u85&#45;&gt;u14 -->+<g id="edge71" class="edge"><title>u85&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M5133.61,-777.643C5121.04,-744.474 5093.02,-670.532 5077.99,-630.859"/>+<polygon fill="black" stroke="black" points="5081.19,-629.438 5074.38,-621.327 5074.65,-631.919 5081.19,-629.438"/>+</g>+<!-- u86 -->+<g id="node45" class="node"><title>u86</title>+<ellipse fill="#ff7777" stroke="black" stroke-width="0" cx="5259" cy="-795.504" rx="51.9908" ry="18"/>+<text text-anchor="middle" x="5259" y="-791.804" font-family="Times,serif" font-size="14.00">TimeslotId</text>+</g>+<!-- u86&#45;&gt;u14 -->+<g id="edge72" class="edge"><title>u86&#45;&gt;u14</title>+<path fill="none" stroke="black" d="M5242.72,-778.305C5208.8,-744.568 5130.5,-666.673 5091.27,-627.655"/>+<polygon fill="black" stroke="black" points="5093.53,-624.965 5083.97,-620.394 5088.6,-629.928 5093.53,-624.965"/>+</g>+<!-- u87 -->+<g id="node46" class="node"><title>u87</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="3574" cy="-3178.5" rx="96.6831" ry="18"/>+<text text-anchor="middle" x="3574" y="-3174.8" font-family="Times,serif" font-size="14.00">EvolutionaryAlgorithm</text>+</g>+<!-- u89 -->+<g id="node48" class="node"><title>u89</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="3286" cy="-3004.5" rx="134.576" ry="18"/>+<text text-anchor="middle" x="3286" y="-3000.8" font-family="Times,serif" font-size="14.00">QuantifiedStudentViewTimetable</text>+</g>+<!-- u87&#45;&gt;u89 -->+<g id="edge73" class="edge"><title>u87&#45;&gt;u89</title>+<path fill="none" stroke="black" d="M3546.65,-3161.17C3494.67,-3130.12 3381.59,-3062.59 3322.94,-3027.57"/>+<polygon fill="black" stroke="black" points="3324.4,-3024.36 3314.02,-3022.24 3320.81,-3030.37 3324.4,-3024.36"/>+</g>+<!-- u91 -->+<g id="node50" class="node"><title>u91</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="3524" cy="-3004.5" rx="85.2851" ry="18"/>+<text text-anchor="middle" x="3524" y="-3000.8" font-family="Times,serif" font-size="14.00">RandomConstructor</text>+</g>+<!-- u87&#45;&gt;u91 -->+<g id="edge74" class="edge"><title>u87&#45;&gt;u91</title>+<path fill="none" stroke="black" d="M3569.02,-3160.38C3560.3,-3130.38 3542.19,-3068.08 3531.79,-3032.32"/>+<polygon fill="black" stroke="black" points="3535.11,-3031.18 3528.96,-3022.56 3528.39,-3033.14 3535.11,-3031.18"/>+</g>+<!-- u92 -->+<g id="node51" class="node"><title>u92</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="3787" cy="-3004.5" rx="159.772" ry="18"/>+<text text-anchor="middle" x="3787" y="-3000.8" font-family="Times,serif" font-size="14.00">StudentViewTimetableRandomBreeders</text>+</g>+<!-- u87&#45;&gt;u92 -->+<g id="edge75" class="edge"><title>u87&#45;&gt;u92</title>+<path fill="none" stroke="black" d="M3594.81,-3160.7C3633.07,-3129.81 3714.62,-3063.95 3758.18,-3028.78"/>+<polygon fill="black" stroke="black" points="3760.52,-3031.38 3766.1,-3022.38 3756.13,-3025.94 3760.52,-3031.38"/>+</g>+<!-- u93 -->+<g id="node72" class="node"><title>u93</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1435" cy="-1179.5" rx="42.7926" ry="18"/>+<text text-anchor="middle" x="1435" y="-1175.8" font-family="Times,serif" font-size="14.00">Traverse</text>+</g>+<!-- u87&#45;&gt;u93 -->+<g id="edge76" class="edge"><title>u87&#45;&gt;u93</title>+<path fill="none" stroke="black" d="M3480.69,-3173.67C2919.47,-3149.98 17,-3018.81 17,-2839.5 17,-2839.5 17,-2839.5 17,-1562.5 17,-1328.79 270.064,-1405.3 496,-1345.5 880.401,-1243.76 1022.95,-1397.26 1383,-1228.5 1394.99,-1222.88 1406.11,-1213.48 1414.96,-1204.48"/>+<polygon fill="black" stroke="black" points="1417.57,-1206.81 1421.83,-1197.11 1412.45,-1202.04 1417.57,-1206.81"/>+</g>+<!-- u95 -->+<g id="node80" class="node"><title>u95</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="4163" cy="-3004.5" rx="109.681" ry="18"/>+<text text-anchor="middle" x="4163" y="-3000.8" font-family="Times,serif" font-size="14.00">EvolutionStrategyStatistics</text>+</g>+<!-- u87&#45;&gt;u95 -->+<g id="edge77" class="edge"><title>u87&#45;&gt;u95</title>+<path fill="none" stroke="black" d="M3623.71,-3162.99C3731.1,-3131.63 3984.51,-3057.63 4101.65,-3023.42"/>+<polygon fill="black" stroke="black" points="4102.92,-3026.69 4111.54,-3020.53 4100.96,-3019.98 4102.92,-3026.69"/>+</g>+<!-- u88 -->+<g id="node47" class="node"><title>u88</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="3843" cy="-3178.5" rx="103.982" ry="18"/>+<text text-anchor="middle" x="3843" y="-3174.8" font-family="Times,serif" font-size="14.00">DeterministicConstructor</text>+</g>+<!-- u88&#45;&gt;u17 -->+<g id="edge78" class="edge"><title>u88&#45;&gt;u17</title>+<path fill="none" stroke="black" d="M3865.68,-3160.74C3892.68,-3139.29 3936.58,-3099.37 3956,-3053.5 3997.85,-2954.68 3900.34,-2893.27 3971,-2812.5 4147.31,-2610.98 4303.92,-2766.85 4562,-2695.5 4590.39,-2687.66 4621.38,-2676.71 4646.41,-2667.26"/>+<polygon fill="black" stroke="black" points="4647.95,-2670.42 4656.04,-2663.58 4645.45,-2663.88 4647.95,-2670.42"/>+</g>+<!-- u90 -->+<g id="node49" class="node"><title>u90</title>+<ellipse fill="#77ffff" stroke="black" stroke-width="0" cx="3438" cy="-2838.5" rx="74.187" ry="18"/>+<text text-anchor="middle" x="3438" y="-2834.8" font-family="Times,serif" font-size="14.00">TimetableFitness</text>+</g>+<!-- u89&#45;&gt;u90 -->+<g id="edge79" class="edge"><title>u89&#45;&gt;u90</title>+<path fill="none" stroke="black" d="M3301.69,-2986.57C3328.66,-2957.48 3383.89,-2897.88 3415.14,-2864.17"/>+<polygon fill="black" stroke="black" points="3417.93,-2866.3 3422.16,-2856.59 3412.8,-2861.55 3417.93,-2866.3"/>+</g>+<!-- u90&#45;&gt;u17 -->+<g id="edge80" class="edge"><title>u90&#45;&gt;u17</title>+<path fill="none" stroke="black" d="M3503.79,-2830.04C3728.68,-2804.42 4458.64,-2720.23 4562,-2695.5 4591.3,-2688.49 4623.09,-2677.27 4648.35,-2667.44"/>+<polygon fill="black" stroke="black" points="4649.67,-2670.68 4657.69,-2663.76 4647.1,-2664.17 4649.67,-2670.68"/>+</g>+<!-- u91&#45;&gt;u17 -->+<g id="edge81" class="edge"><title>u91&#45;&gt;u17</title>+<path fill="none" stroke="black" d="M3549.21,-2987.3C3607.98,-2950.27 3759.73,-2859.1 3899,-2812.5 4182.76,-2717.56 4272.78,-2772.23 4562,-2695.5 4590.57,-2687.92 4621.7,-2676.95 4646.76,-2667.4"/>+<polygon fill="black" stroke="black" points="4648.32,-2670.55 4656.39,-2663.69 4645.8,-2664.02 4648.32,-2670.55"/>+</g>+<!-- u92&#45;&gt;u17 -->+<g id="edge82" class="edge"><title>u92&#45;&gt;u17</title>+<path fill="none" stroke="black" d="M3796.94,-2986.39C3820.03,-2948.3 3881.31,-2856.44 3959,-2812.5 4196.63,-2678.12 4298.73,-2767.74 4562,-2695.5 4590.4,-2687.71 4621.4,-2676.77 4646.42,-2667.3"/>+<polygon fill="black" stroke="black" points="4647.96,-2670.46 4656.05,-2663.62 4645.46,-2663.92 4647.96,-2670.46"/>+</g>+<!-- u101 -->+<g id="node52" class="node"><title>u101</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="5314" cy="-2139.5" rx="91.784" ry="18"/>+<text text-anchor="middle" x="5314" y="-2135.8" font-family="Times,serif" font-size="14.00">CommandLineOption</text>+</g>+<!-- u102 -->+<g id="node53" class="node"><title>u102</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="5437" cy="-1947.5" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="5437" y="-1943.8" font-family="Times,serif" font-size="14.00">ConfigVersion</text>+</g>+<!-- u103 -->+<g id="node54" class="node"><title>u103</title>+<ellipse fill="#ff77ff" stroke="black" stroke-width="0" cx="5463" cy="-2139.5" rx="39.7935" ry="18"/>+<text text-anchor="middle" x="5463" y="-2135.8" font-family="Times,serif" font-size="14.00">Options</text>+</g>+<!-- u103&#45;&gt;u46 -->+<g id="edge83" class="edge"><title>u103&#45;&gt;u46</title>+<path fill="none" stroke="black" d="M5440.84,-2124.55C5432.97,-2120.26 5423.86,-2116.01 5415,-2113.5 4711.85,-1914.58 4502.77,-2062.32 3775,-1996.5 3648.4,-1985.06 3501.61,-1968.25 3414.18,-1957.86"/>+<polygon fill="black" stroke="black" points="3414.42,-1954.36 3404.08,-1956.65 3413.59,-1961.31 3414.42,-1954.36"/>+</g>+<!-- u103&#45;&gt;u102 -->+<g id="edge84" class="edge"><title>u103&#45;&gt;u102</title>+<path fill="none" stroke="black" d="M5460.65,-2121.31C5456.11,-2088.17 5446.13,-2015.25 5440.7,-1975.55"/>+<polygon fill="black" stroke="black" points="5444.15,-1974.96 5439.33,-1965.52 5437.22,-1975.91 5444.15,-1974.96"/>+</g>+<!-- u96 -->+<g id="node73" class="node"><title>u96</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="5245" cy="-1755.5" rx="39.7935" ry="18"/>+<text text-anchor="middle" x="5245" y="-1751.8" font-family="Times,serif" font-size="14.00">Options</text>+</g>+<!-- u103&#45;&gt;u96 -->+<g id="edge85" class="edge"><title>u103&#45;&gt;u96</title>+<path fill="none" stroke="black" d="M5449.94,-2122.06C5429.73,-2096.21 5390.27,-2044.1 5362,-1996.5 5317.55,-1921.66 5275.35,-1827.47 5256.02,-1782.59"/>+<polygon fill="black" stroke="black" points="5259.19,-1781.1 5252.04,-1773.29 5252.76,-1783.86 5259.19,-1781.1"/>+</g>+<!-- u103&#45;&gt;u36 -->+<g id="edge86" class="edge"><title>u103&#45;&gt;u36</title>+<path fill="none" stroke="black" d="M5440.31,-2124.47C5432.54,-2120.28 5423.63,-2116.11 5415,-2113.5 5139.03,-2030.16 4246.93,-1970.97 3959.87,-1953.7"/>+<polygon fill="black" stroke="black" points="3959.7,-1950.18 3949.51,-1953.08 3959.28,-1957.17 3959.7,-1950.18"/>+</g>+<!-- u58 -->+<g id="node55" class="node"><title>u58</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="948" cy="-1371.5" rx="83.6854" ry="18"/>+<text text-anchor="middle" x="948" y="-1367.8" font-family="Times,serif" font-size="14.00">TimetableForWeek</text>+</g>+<!-- u58&#45;&gt;u29 -->+<g id="edge87" class="edge"><title>u58&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M999.355,-1357.13C1131.78,-1322.63 1475.34,-1232.99 1487,-1228.5 1506.32,-1221.08 1526.86,-1210.76 1543.71,-1201.59"/>+<polygon fill="black" stroke="black" points="1545.6,-1204.54 1552.66,-1196.64 1542.21,-1198.41 1545.6,-1204.54"/>+</g>+<!-- u70 -->+<g id="node56" class="node"><title>u70</title>+<ellipse fill="#33ff33" stroke="black" stroke-width="0" cx="948" cy="-1563.5" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="948" y="-1559.8" font-family="Times,serif" font-size="14.00">Timetable</text>+</g>+<!-- u70&#45;&gt;u58 -->+<g id="edge88" class="edge"><title>u70&#45;&gt;u58</title>+<path fill="none" stroke="black" d="M948,-1545.31C948,-1512.17 948,-1439.25 948,-1399.55"/>+<polygon fill="black" stroke="black" points="951.5,-1399.52 948,-1389.52 944.5,-1399.52 951.5,-1399.52"/>+</g>+<!-- u59 -->+<g id="node68" class="node"><title>u59</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1203" cy="-1371.5" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="1203" y="-1367.8" font-family="Times,serif" font-size="14.00">Timetable</text>+</g>+<!-- u70&#45;&gt;u59 -->+<g id="edge89" class="edge"><title>u70&#45;&gt;u59</title>+<path fill="none" stroke="black" d="M968.868,-1546.96C1014.28,-1513.12 1122.13,-1432.76 1174.07,-1394.06"/>+<polygon fill="black" stroke="black" points="1176.27,-1396.78 1182.2,-1388 1172.09,-1391.17 1176.27,-1396.78"/>+</g>+<!-- u64 -->+<g id="node57" class="node"><title>u64</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="154" cy="-1755.5" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="154" y="-1751.8" font-family="Times,serif" font-size="14.00">Lesson</text>+</g>+<!-- u65 -->+<g id="node58" class="node"><title>u65</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="119" cy="-1563.5" rx="82.5854" ry="18"/>+<text text-anchor="middle" x="119" y="-1559.8" font-family="Times,serif" font-size="14.00">LessonResourceIds</text>+</g>+<!-- u64&#45;&gt;u65 -->+<g id="edge90" class="edge"><title>u64&#45;&gt;u65</title>+<path fill="none" stroke="black" d="M150.832,-1737.31C144.728,-1704.17 131.295,-1631.25 123.982,-1591.55"/>+<polygon fill="black" stroke="black" points="127.389,-1590.72 122.135,-1581.52 120.505,-1591.99 127.389,-1590.72"/>+</g>+<!-- u67 -->+<g id="node91" class="node"><title>u67</title>+<ellipse fill="#33bb77" stroke="black" stroke-width="0" cx="544" cy="-1563.5" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="544" y="-1559.8" font-family="Times,serif" font-size="14.00">Lesson</text>+</g>+<!-- u64&#45;&gt;u67 -->+<g id="edge91" class="edge"><title>u64&#45;&gt;u67</title>+<path fill="none" stroke="black" d="M180.877,-1743.29C191.229,-1738.98 203.163,-1734.01 214,-1729.5 339.294,-1677.41 383.198,-1687.92 496,-1612.5 506.201,-1605.68 516.045,-1596.47 524.134,-1587.94"/>+<polygon fill="black" stroke="black" points="526.873,-1590.13 531.03,-1580.38 521.703,-1585.41 526.873,-1590.13"/>+</g>+<!-- u65&#45;&gt;u20 -->+<g id="edge92" class="edge"><title>u65&#45;&gt;u20</title>+<path fill="none" stroke="black" d="M165.004,-1548.49C180.44,-1544.3 197.84,-1540.13 214,-1537.5 1004.43,-1409.01 1246.33,-1655.08 2012,-1420.5 2030.72,-1414.77 2049.71,-1404.03 2064.7,-1394.16"/>+<polygon fill="black" stroke="black" points="2066.72,-1397.02 2073.02,-1388.5 2062.79,-1391.23 2066.72,-1397.02"/>+</g>+<!-- u66 -->+<g id="node90" class="node"><title>u66</title>+<ellipse fill="#33bb77" stroke="black" stroke-width="0" cx="591" cy="-1371.5" rx="82.5854" ry="18"/>+<text text-anchor="middle" x="591" y="-1367.8" font-family="Times,serif" font-size="14.00">LessonResourceIds</text>+</g>+<!-- u65&#45;&gt;u66 -->+<g id="edge93" class="edge"><title>u65&#45;&gt;u66</title>+<path fill="none" stroke="black" d="M156.432,-1547.44C241.721,-1513.1 450.334,-1429.13 544.056,-1391.4"/>+<polygon fill="black" stroke="black" points="545.595,-1394.55 553.565,-1387.57 542.981,-1388.06 545.595,-1394.55"/>+</g>+<!-- u68 -->+<g id="node59" class="node"><title>u68</title>+<ellipse fill="#bbff77" stroke="black" stroke-width="0" cx="154" cy="-1947.5" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="154" y="-1943.8" font-family="Times,serif" font-size="14.00">Timetable</text>+</g>+<!-- u68&#45;&gt;u37 -->+<g id="edge94" class="edge"><title>u68&#45;&gt;u37</title>+<path fill="none" stroke="black" d="M182.49,-1932.98C192.296,-1928.77 203.462,-1924.47 214,-1921.5 430.36,-1860.67 1999.78,-1683.56 2213,-1612.5 2232.56,-1605.99 2252.95,-1595.47 2269.36,-1585.93"/>+<polygon fill="black" stroke="black" points="2271.23,-1588.89 2278.04,-1580.77 2267.66,-1582.88 2271.23,-1588.89"/>+</g>+<!-- u68&#45;&gt;u64 -->+<g id="edge95" class="edge"><title>u68&#45;&gt;u64</title>+<path fill="none" stroke="black" d="M154,-1929.31C154,-1896.17 154,-1823.25 154,-1783.55"/>+<polygon fill="black" stroke="black" points="157.5,-1783.52 154,-1773.52 150.5,-1783.52 157.5,-1783.52"/>+</g>+<!-- u69 -->+<g id="node92" class="node"><title>u69</title>+<ellipse fill="#33bb77" stroke="black" stroke-width="0" cx="556" cy="-1755.5" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="556" y="-1751.8" font-family="Times,serif" font-size="14.00">Timetable</text>+</g>+<!-- u68&#45;&gt;u69 -->+<g id="edge96" class="edge"><title>u68&#45;&gt;u69</title>+<path fill="none" stroke="black" d="M184.828,-1933.65C194.195,-1929.75 204.518,-1925.45 214,-1921.5 339.294,-1869.41 379.2,-1873.57 496,-1804.5 508.232,-1797.27 520.673,-1787.75 531.031,-1779.09"/>+<polygon fill="black" stroke="black" points="533.53,-1781.56 538.848,-1772.39 528.976,-1776.24 533.53,-1781.56"/>+</g>+<!-- u27 -->+<g id="node60" class="node"><title>u27</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1254" cy="-795.504" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="1254" y="-791.804" font-family="Times,serif" font-size="14.00">Lesson</text>+</g>+<!-- u27&#45;&gt;u13 -->+<g id="edge97" class="edge"><title>u27&#45;&gt;u13</title>+<path fill="none" stroke="black" d="M1269.35,-811.947C1294.28,-837.314 1346.43,-884.951 1402,-903.004 1547.3,-950.206 2644.98,-979.886 2777,-903.004 2806.3,-885.94 2822.67,-848.981 2830.91,-823.191"/>+<polygon fill="black" stroke="black" points="2834.27,-824.167 2833.77,-813.584 2827.56,-822.168 2834.27,-824.167"/>+</g>+<!-- u28 -->+<g id="node61" class="node"><title>u28</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1570" cy="-987.504" rx="76.8869" ry="18"/>+<text text-anchor="middle" x="1570" y="-983.804" font-family="Times,serif" font-size="14.00">TimetableForDay</text>+</g>+<!-- u28&#45;&gt;u27 -->+<g id="edge98" class="edge"><title>u28&#45;&gt;u27</title>+<path fill="none" stroke="black" d="M1543.33,-970.468C1485.16,-935.493 1347.14,-852.508 1285.12,-815.218"/>+<polygon fill="black" stroke="black" points="1286.57,-812.003 1276.2,-809.849 1282.96,-818.002 1286.57,-812.003"/>+</g>+<!-- u28&#45;&gt;u5 -->+<g id="edge99" class="edge"><title>u28&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M1586.97,-969.93C1626.1,-932.14 1726.37,-837.601 1819,-769.504 2018.71,-622.69 2280.38,-477.228 2369.07,-429.109"/>+<polygon fill="black" stroke="black" points="2370.94,-432.079 2378.07,-424.241 2367.61,-425.923 2370.94,-432.079"/>+</g>+<!-- u28&#45;&gt;u11 -->+<g id="edge100" class="edge"><title>u28&#45;&gt;u11</title>+<path fill="none" stroke="black" d="M1597.69,-970.576C1702.82,-910.093 2077.4,-694.595 2197.01,-625.786"/>+<polygon fill="black" stroke="black" points="2198.9,-628.733 2205.83,-620.713 2195.41,-622.665 2198.9,-628.733"/>+</g>+<!-- u29&#45;&gt;u30 -->+<g id="edge101" class="edge"><title>u29&#45;&gt;u30</title>+<path fill="none" stroke="black" d="M1529.81,-1164.97C1515.95,-1161.24 1500.89,-1157.21 1487,-1153.5 1290.23,-1101.07 1230.46,-1118.38 1044,-1036.5 1028.21,-1029.57 1011.94,-1019.56 998.603,-1010.48"/>+<polygon fill="black" stroke="black" points="1000.5,-1007.54 990.3,-1004.68 996.497,-1013.28 1000.5,-1007.54"/>+</g>+<!-- u29&#45;&gt;u21 -->+<g id="edge102" class="edge"><title>u29&#45;&gt;u21</title>+<path fill="none" stroke="black" d="M1646.69,-1168.42C1872.23,-1134.33 2602.83,-1023.9 2791.96,-995.312"/>+<polygon fill="black" stroke="black" points="2792.74,-998.734 2802.1,-993.779 2791.69,-991.813 2792.74,-998.734"/>+</g>+<!-- u29&#45;&gt;u28 -->+<g id="edge103" class="edge"><title>u29&#45;&gt;u28</title>+<path fill="none" stroke="black" d="M1579.09,-1161.31C1577.35,-1128.17 1573.51,-1055.25 1571.42,-1015.55"/>+<polygon fill="black" stroke="black" points="1574.92,-1015.33 1570.9,-1005.52 1567.93,-1015.69 1574.92,-1015.33"/>+</g>+<!-- u33 -->+<g id="node63" class="node"><title>u33</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1884" cy="-987.504" rx="116.18" ry="18"/>+<text text-anchor="middle" x="1884" y="-983.804" font-family="Times,serif" font-size="14.00">GenerateLessonColourFrom</text>+</g>+<!-- u29&#45;&gt;u33 -->+<g id="edge104" class="edge"><title>u29&#45;&gt;u33</title>+<path fill="none" stroke="black" d="M1605.92,-1162.3C1660.39,-1128.26 1786.79,-1049.26 1848.64,-1010.6"/>+<polygon fill="black" stroke="black" points="1850.66,-1013.47 1857.28,-1005.2 1846.95,-1007.54 1850.66,-1013.47"/>+</g>+<!-- u34 -->+<g id="node64" class="node"><title>u34</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1707" cy="-987.504" rx="42.4939" ry="18"/>+<text text-anchor="middle" x="1707" y="-983.804" font-family="Times,serif" font-size="14.00">Meeting</text>+</g>+<!-- u29&#45;&gt;u34 -->+<g id="edge105" class="edge"><title>u29&#45;&gt;u34</title>+<path fill="none" stroke="black" d="M1591.27,-1161.64C1613.64,-1128.18 1663.75,-1053.21 1690.09,-1013.81"/>+<polygon fill="black" stroke="black" points="1693.29,-1015.31 1695.94,-1005.06 1687.47,-1011.42 1693.29,-1015.31"/>+</g>+<!-- u35 -->+<g id="node104" class="node"><title>u35</title>+<ellipse fill="#7733bb" stroke="black" stroke-width="0" cx="2674" cy="-603.504" rx="50.0912" ry="18"/>+<text text-anchor="middle" x="2674" y="-599.804" font-family="Times,serif" font-size="14.00">TimeAxes</text>+</g>+<!-- u29&#45;&gt;u35 -->+<g id="edge106" class="edge"><title>u29&#45;&gt;u35</title>+<path fill="none" stroke="black" d="M1633.1,-1165.44C1715.78,-1144.11 1879.24,-1097.95 2009,-1036.5 2297.18,-900.049 2356.21,-838.774 2615,-652.504 2626.08,-644.53 2637.83,-635.17 2647.9,-626.843"/>+<polygon fill="black" stroke="black" points="2650.15,-629.529 2655.58,-620.432 2645.66,-624.157 2650.15,-629.529"/>+</g>+<!-- u34&#45;&gt;u20 -->+<g id="edge107" class="edge"><title>u34&#45;&gt;u20</title>+<path fill="none" stroke="black" d="M1723.14,-1004.43C1783.73,-1064.24 1997.9,-1275.65 2070.06,-1346.88"/>+<polygon fill="black" stroke="black" points="2067.8,-1349.56 2077.37,-1354.09 2072.71,-1344.57 2067.8,-1349.56"/>+</g>+<!-- u57 -->+<g id="node67" class="node"><title>u57</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1501" cy="-795.504" rx="99.3824" ry="18"/>+<text text-anchor="middle" x="1501" y="-791.804" font-family="Times,serif" font-size="14.00">TimetableAxisTraversal</text>+</g>+<!-- u55&#45;&gt;u57 -->+<g id="edge108" class="edge"><title>u55&#45;&gt;u57</title>+<path fill="none" stroke="black" d="M1398.23,-969.308C1418.14,-935.819 1462.23,-861.691 1485.66,-822.292"/>+<polygon fill="black" stroke="black" points="1488.77,-823.908 1490.88,-813.525 1482.76,-820.33 1488.77,-823.908"/>+</g>+<!-- u56 -->+<g id="node66" class="node"><title>u56</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1501" cy="-603.504" rx="65.7887" ry="18"/>+<text text-anchor="middle" x="1501" y="-599.804" font-family="Times,serif" font-size="14.00">TimetableAxis</text>+</g>+<!-- u57&#45;&gt;u7 -->+<g id="edge109" class="edge"><title>u57&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M1600.39,-794.485C1859.86,-792.677 2550.4,-776.073 2736,-652.504 2767.8,-631.332 2745.9,-598.218 2778,-577.504 3033.07,-412.919 3851.88,-559.04 4139,-460.504 4155.63,-454.795 4172.24,-444.549 4185.49,-434.984"/>+<polygon fill="black" stroke="black" points="4187.77,-437.647 4193.68,-428.852 4183.58,-432.044 4187.77,-437.647"/>+</g>+<!-- u57&#45;&gt;u56 -->+<g id="edge110" class="edge"><title>u57&#45;&gt;u56</title>+<path fill="none" stroke="black" d="M1501,-777.308C1501,-744.172 1501,-671.25 1501,-631.55"/>+<polygon fill="black" stroke="black" points="1504.5,-631.525 1501,-621.525 1497.5,-631.525 1504.5,-631.525"/>+</g>+<!-- u59&#45;&gt;u29 -->+<g id="edge111" class="edge"><title>u59&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M1230.87,-1356.71C1281.83,-1331.48 1393.38,-1276.07 1487,-1228.5 1504.47,-1219.63 1523.72,-1209.71 1540.16,-1201.21"/>+<polygon fill="black" stroke="black" points="1542.2,-1204.09 1549.47,-1196.38 1538.98,-1197.88 1542.2,-1204.09"/>+</g>+<!-- u60 -->+<g id="node69" class="node"><title>u60</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1287" cy="-1179.5" rx="87.1846" ry="18"/>+<text text-anchor="middle" x="1287" y="-1175.8" font-family="Times,serif" font-size="14.00">GeneralisedBooking</text>+</g>+<!-- u59&#45;&gt;u60 -->+<g id="edge112" class="edge"><title>u59&#45;&gt;u60</title>+<path fill="none" stroke="black" d="M1210.45,-1353.64C1225.11,-1320.49 1257.78,-1246.59 1275.33,-1206.91"/>+<polygon fill="black" stroke="black" points="1278.6,-1208.16 1279.44,-1197.6 1272.2,-1205.33 1278.6,-1208.16"/>+</g>+<!-- u62 -->+<g id="node71" class="node"><title>u62</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1119" cy="-1179.5" rx="63.0888" ry="18"/>+<text text-anchor="middle" x="1119" y="-1175.8" font-family="Times,serif" font-size="14.00">ResourceUser</text>+</g>+<!-- u59&#45;&gt;u62 -->+<g id="edge113" class="edge"><title>u59&#45;&gt;u62</title>+<path fill="none" stroke="black" d="M1195.55,-1353.64C1180.89,-1320.49 1148.22,-1246.59 1130.67,-1206.91"/>+<polygon fill="black" stroke="black" points="1133.8,-1205.33 1126.56,-1197.6 1127.4,-1208.16 1133.8,-1205.33"/>+</g>+<!-- u60&#45;&gt;u27 -->+<g id="edge114" class="edge"><title>u60&#45;&gt;u27</title>+<path fill="none" stroke="black" d="M1246.97,-1163.51C1198.88,-1143.07 1120.51,-1101.39 1087,-1036.5 1041.47,-948.345 1162.83,-854.894 1222.77,-815.628"/>+<polygon fill="black" stroke="black" points="1224.97,-818.373 1231.48,-810.017 1221.18,-812.488 1224.97,-818.373"/>+</g>+<!-- u61 -->+<g id="node70" class="node"><title>u61</title>+<ellipse fill="#3333ff" stroke="black" stroke-width="0" cx="1189" cy="-987.504" rx="92.8835" ry="18"/>+<text text-anchor="middle" x="1189" y="-983.804" font-family="Times,serif" font-size="14.00">TimetableCoordinates</text>+</g>+<!-- u60&#45;&gt;u61 -->+<g id="edge115" class="edge"><title>u60&#45;&gt;u61</title>+<path fill="none" stroke="black" d="M1278.13,-1161.31C1260.93,-1127.96 1222.95,-1054.32 1202.56,-1014.79"/>+<polygon fill="black" stroke="black" points="1205.47,-1012.81 1197.78,-1005.52 1199.25,-1016.02 1205.47,-1012.81"/>+</g>+<!-- u61&#45;&gt;u5 -->+<g id="edge116" class="edge"><title>u61&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M1244.68,-973.071C1327.04,-952.022 1484.97,-907.104 1609,-844.504 1701.62,-797.756 1900.78,-626.931 1992,-577.504 2123.21,-506.411 2291.7,-447.754 2364.21,-423.939"/>+<polygon fill="black" stroke="black" points="2365.37,-427.243 2373.79,-420.813 2363.2,-420.588 2365.37,-427.243"/>+</g>+<!-- u62&#45;&gt;u27 -->+<g id="edge117" class="edge"><title>u62&#45;&gt;u27</title>+<path fill="none" stroke="black" d="M1108.88,-1161.73C1087.69,-1124.3 1043.09,-1031.76 1074,-961.504 1104.2,-892.853 1178.62,-840.286 1221.73,-814.36"/>+<polygon fill="black" stroke="black" points="1223.58,-817.328 1230.42,-809.235 1220.03,-811.298 1223.58,-817.328"/>+</g>+<!-- u93&#45;&gt;u55 -->+<g id="edge118" class="edge"><title>u93&#45;&gt;u55</title>+<path fill="none" stroke="black" d="M1430.75,-1161.31C1422.53,-1128.1 1404.43,-1054.94 1394.63,-1015.3"/>+<polygon fill="black" stroke="black" points="1398.01,-1014.39 1392.21,-1005.52 1391.21,-1016.07 1398.01,-1014.39"/>+</g>+<!-- u93&#45;&gt;u61 -->+<g id="edge119" class="edge"><title>u93&#45;&gt;u61</title>+<path fill="none" stroke="black" d="M1415.28,-1163.28C1372.19,-1129.99 1269.41,-1050.61 1218.55,-1011.32"/>+<polygon fill="black" stroke="black" points="1220.61,-1008.49 1210.55,-1005.15 1216.33,-1014.03 1220.61,-1008.49"/>+</g>+<!-- u96&#45;&gt;u20 -->+<g id="edge120" class="edge"><title>u96&#45;&gt;u20</title>+<path fill="none" stroke="black" d="M5212.03,-1745.23C5089.86,-1711.27 4650.87,-1592.78 4281,-1537.5 4173.35,-1521.42 2512.87,-1402.41 2159.72,-1377.19"/>+<polygon fill="black" stroke="black" points="2159.88,-1373.69 2149.65,-1376.47 2159.38,-1380.67 2159.88,-1373.69"/>+</g>+<!-- u97 -->+<g id="node74" class="node"><title>u97</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="5257" cy="-1563.5" rx="51.9908" ry="18"/>+<text text-anchor="middle" x="5257" y="-1559.8" font-family="Times,serif" font-size="14.00">FileFormat</text>+</g>+<!-- u96&#45;&gt;u97 -->+<g id="edge121" class="edge"><title>u96&#45;&gt;u97</title>+<path fill="none" stroke="black" d="M5246.09,-1737.31C5248.18,-1704.17 5252.78,-1631.25 5255.29,-1591.55"/>+<polygon fill="black" stroke="black" points="5258.79,-1591.73 5255.93,-1581.52 5251.8,-1591.28 5258.79,-1591.73"/>+</g>+<!-- u98 -->+<g id="node75" class="node"><title>u98</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="5250" cy="-1371.5" rx="37.8943" ry="18"/>+<text text-anchor="middle" x="5250" y="-1367.8" font-family="Times,serif" font-size="14.00">Format</text>+</g>+<!-- u97&#45;&gt;u98 -->+<g id="edge122" class="edge"><title>u97&#45;&gt;u98</title>+<path fill="none" stroke="black" d="M5256.37,-1545.31C5255.15,-1512.17 5252.46,-1439.25 5251,-1399.55"/>+<polygon fill="black" stroke="black" points="5254.49,-1399.39 5250.63,-1389.52 5247.5,-1399.65 5254.49,-1399.39"/>+</g>+<!-- u99 -->+<g id="node76" class="node"><title>u99</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="5242" cy="-1179.5" rx="29.795" ry="18"/>+<text text-anchor="middle" x="5242" y="-1175.8" font-family="Times,serif" font-size="14.00">Style</text>+</g>+<!-- u98&#45;&gt;u99 -->+<g id="edge123" class="edge"><title>u98&#45;&gt;u99</title>+<path fill="none" stroke="black" d="M5249.28,-1353.31C5247.88,-1320.17 5244.81,-1247.25 5243.14,-1207.55"/>+<polygon fill="black" stroke="black" points="5246.63,-1207.37 5242.72,-1197.52 5239.64,-1207.66 5246.63,-1207.37"/>+</g>+<!-- u99&#45;&gt;u7 -->+<g id="edge124" class="edge"><title>u99&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M5220.23,-1167.09C5144.68,-1127.1 4887.85,-987.931 4695,-844.504 4506.16,-704.062 4303.71,-504.287 4236.3,-436.249"/>+<polygon fill="black" stroke="black" points="4238.64,-433.633 4229.12,-428.981 4233.66,-438.554 4238.64,-433.633"/>+</g>+<!-- u99&#45;&gt;u33 -->+<g id="edge125" class="edge"><title>u99&#45;&gt;u33</title>+<path fill="none" stroke="black" d="M5212.2,-1176.82C4919.53,-1160.26 2557.71,-1026.62 2001.16,-995.133"/>+<polygon fill="black" stroke="black" points="2001.3,-991.635 1991.12,-994.565 2000.9,-998.624 2001.3,-991.635"/>+</g>+<!-- u100 -->+<g id="node77" class="node"><title>u100</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="5365" cy="-987.504" rx="30.5947" ry="18"/>+<text text-anchor="middle" x="5365" y="-983.804" font-family="Times,serif" font-size="14.00">View</text>+</g>+<!-- u99&#45;&gt;u100 -->+<g id="edge126" class="edge"><title>u99&#45;&gt;u100</title>+<path fill="none" stroke="black" d="M5252.49,-1162.3C5274,-1129.07 5323.25,-1052.99 5348.86,-1013.43"/>+<polygon fill="black" stroke="black" points="5352.04,-1014.96 5354.54,-1004.66 5346.17,-1011.15 5352.04,-1014.96"/>+</g>+<!-- u99&#45;&gt;u6 -->+<g id="edge127" class="edge"><title>u99&#45;&gt;u6</title>+<path fill="none" stroke="black" d="M5244.81,-1161.51C5252,-1122.42 5274.19,-1024.68 5325,-961.504 5384.33,-887.731 5458.06,-927.827 5503,-844.504 5518.82,-815.166 5515.66,-800.342 5503,-769.504 5411.96,-547.665 5342.71,-483.82 5124,-385.504 4877.72,-274.794 2841.22,-249.946 2539.34,-246.86"/>+<polygon fill="black" stroke="black" points="2539.38,-243.36 2529.34,-246.759 2539.3,-250.36 2539.38,-243.36"/>+</g>+<!-- u99&#45;&gt;u35 -->+<g id="edge128" class="edge"><title>u99&#45;&gt;u35</title>+<path fill="none" stroke="black" d="M5212.86,-1174.57C5103.2,-1159.59 4705.17,-1103.53 4381,-1036.5 3900.59,-937.175 3787.38,-882.492 3310,-769.504 3078.64,-714.744 3014.46,-724.922 2788,-652.504 2762.16,-644.242 2734.07,-632.448 2712.24,-622.618"/>+<polygon fill="black" stroke="black" points="2713.53,-619.363 2702.98,-618.402 2710.63,-625.733 2713.53,-619.363"/>+</g>+<!-- u104 -->+<g id="node78" class="node"><title>u104</title>+<ellipse fill="#ff3333" stroke="black" stroke-width="0" cx="5349" cy="-1755.5" rx="46.5926" ry="18"/>+<text text-anchor="middle" x="5349" y="-1751.8" font-family="Times,serif" font-size="14.00">Verbosity</text>+</g>+<!-- u94 -->+<g id="node79" class="node"><title>u94</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="4163" cy="-2838.5" rx="180.068" ry="18"/>+<text text-anchor="middle" x="4163" y="-2834.8" font-family="Times,serif" font-size="14.00">DeterministicStudentViewTimetableSelection</text>+</g>+<!-- u94&#45;&gt;u88 -->+<g id="edge129" class="edge"><title>u94&#45;&gt;u88</title>+<path fill="none" stroke="black" d="M4148.45,-2856.52C4116.91,-2893.22 4039.53,-2982.3 3971,-3053.5 3936.58,-3089.26 3895.04,-3128.89 3868.82,-3153.5"/>+<polygon fill="black" stroke="black" points="3866.1,-3151.25 3861.2,-3160.64 3870.89,-3156.36 3866.1,-3151.25"/>+</g>+<!-- u95&#45;&gt;u96 -->+<g id="edge130" class="edge"><title>u95&#45;&gt;u96</title>+<path fill="none" stroke="black" d="M4266.58,-2998.4C4542.56,-2983.74 5279.56,-2937.33 5351,-2856.5 5363.95,-2841.85 5353.17,-2831.94 5351,-2812.5 5319.47,-2529.93 5241.53,-2471.08 5210,-2188.5 5196.84,-2070.57 5197.62,-2039.52 5210,-1921.5 5215.16,-1872.31 5228.75,-1816.2 5237.4,-1783.72"/>+<polygon fill="black" stroke="black" points="5240.89,-1784.22 5240.12,-1773.66 5234.13,-1782.39 5240.89,-1784.22"/>+</g>+<!-- u95&#45;&gt;u94 -->+<g id="edge131" class="edge"><title>u95&#45;&gt;u94</title>+<path fill="none" stroke="black" d="M4163,-2986.26C4163,-2957.77 4163,-2900.63 4163,-2866.66"/>+<polygon fill="black" stroke="black" points="4166.5,-2866.51 4163,-2856.51 4159.5,-2866.51 4166.5,-2866.51"/>+</g>+<!-- u105 -->+<g id="node81" class="node"><title>u105</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="5019" cy="-3004.5" rx="70.3881" ry="18"/>+<text text-anchor="middle" x="5019" y="-3000.8" font-family="Times,serif" font-size="14.00">XHTMLFormat</text>+</g>+<!-- u106 -->+<g id="node82" class="node"><title>u106</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="4521" cy="-2838.5" rx="159.772" ry="18"/>+<text text-anchor="middle" x="4521" y="-2834.8" font-family="Times,serif" font-size="14.00">XHTMLFormatLocationViewTimetable</text>+</g>+<!-- u105&#45;&gt;u106 -->+<g id="edge132" class="edge"><title>u105&#45;&gt;u106</title>+<path fill="none" stroke="black" d="M4977.4,-2989.8C4888.85,-2960.64 4681.53,-2892.37 4579.63,-2858.81"/>+<polygon fill="black" stroke="black" points="4580.7,-2855.48 4570.11,-2855.68 4578.51,-2862.13 4580.7,-2855.48"/>+</g>+<!-- u108 -->+<g id="node83" class="node"><title>u108</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="4854" cy="-2838.5" rx="155.173" ry="18"/>+<text text-anchor="middle" x="4854" y="-2834.8" font-family="Times,serif" font-size="14.00">XHTMLFormatStudentViewTimetable</text>+</g>+<!-- u105&#45;&gt;u108 -->+<g id="edge133" class="edge"><title>u105&#45;&gt;u108</title>+<path fill="none" stroke="black" d="M5002.27,-2986.88C4973.02,-2957.8 4912.48,-2897.63 4878.5,-2863.85"/>+<polygon fill="black" stroke="black" points="4880.83,-2861.23 4871.27,-2856.67 4875.89,-2866.2 4880.83,-2861.23"/>+</g>+<!-- u109 -->+<g id="node84" class="node"><title>u109</title>+<ellipse fill="#77bbff" stroke="black" stroke-width="0" cx="5185" cy="-2838.5" rx="157.072" ry="18"/>+<text text-anchor="middle" x="5185" y="-2834.8" font-family="Times,serif" font-size="14.00">XHTMLFormatTeacherViewTimetable</text>+</g>+<!-- u105&#45;&gt;u109 -->+<g id="edge134" class="edge"><title>u105&#45;&gt;u109</title>+<path fill="none" stroke="black" d="M5035.83,-2986.88C5065.26,-2957.8 5126.17,-2897.63 5160.35,-2863.85"/>+<polygon fill="black" stroke="black" points="5162.97,-2866.19 5167.63,-2856.67 5158.05,-2861.21 5162.97,-2866.19"/>+</g>+<!-- u106&#45;&gt;u107 -->+<g id="edge135" class="edge"><title>u106&#45;&gt;u107</title>+<path fill="none" stroke="black" d="M4512.13,-2820.31C4494.93,-2786.96 4456.95,-2713.32 4436.56,-2673.79"/>+<polygon fill="black" stroke="black" points="4439.47,-2671.81 4431.78,-2664.52 4433.25,-2675.02 4439.47,-2671.81"/>+</g>+<!-- u108&#45;&gt;u17 -->+<g id="edge136" class="edge"><title>u108&#45;&gt;u17</title>+<path fill="none" stroke="black" d="M4839.7,-2820.31C4811.62,-2786.54 4749.17,-2711.44 4716.62,-2672.3"/>+<polygon fill="black" stroke="black" points="4719.24,-2669.98 4710.15,-2664.52 4713.86,-2674.45 4719.24,-2669.98"/>+</g>+<!-- u109&#45;&gt;u24 -->+<g id="edge137" class="edge"><title>u109&#45;&gt;u24</title>+<path fill="none" stroke="black" d="M5185.78,-2820.36C5188.78,-2750.43 5198.35,-2489.12 5175,-2461.5 5095.89,-2367.94 4742.39,-2332.47 4548.43,-2319.88"/>+<polygon fill="black" stroke="black" points="4548.38,-2316.37 4538.17,-2319.23 4547.93,-2323.36 4548.38,-2316.37"/>+</g>+<!-- u109&#45;&gt;u96 -->+<g id="edge138" class="edge"><title>u109&#45;&gt;u96</title>+<path fill="none" stroke="black" d="M5186.57,-2820.47C5188.93,-2793.84 5193.32,-2740.7 5195,-2695.5 5207.76,-2351.74 5149.76,-2262.11 5198,-1921.5 5205.09,-1871.48 5223.42,-1815.3 5234.98,-1783.09"/>+<polygon fill="black" stroke="black" points="5238.34,-1784.1 5238.48,-1773.51 5231.76,-1781.7 5238.34,-1784.1"/>+</g>+<!-- u36&#45;&gt;u18 -->+<g id="edge140" class="edge"><title>u36&#45;&gt;u18</title>+<path fill="none" stroke="black" d="M3856.87,-1929.42C3837.49,-1903.56 3801.05,-1852.42 3778,-1804.5 3762.77,-1772.84 3780.21,-1751.73 3753,-1729.5 3585.69,-1592.86 2999.16,-1658.03 2788,-1612.5 2752.3,-1604.81 2713.02,-1592.4 2683.19,-1582.12"/>+<polygon fill="black" stroke="black" points="2684.06,-1578.72 2673.46,-1578.73 2681.75,-1585.33 2684.06,-1578.72"/>+</g>+<!-- u36&#45;&gt;u37 -->+<g id="edge141" class="edge"><title>u36&#45;&gt;u37</title>+<path fill="none" stroke="black" d="M3819.34,-1933.2C3759.8,-1914.77 3662.81,-1875.42 3613,-1804.5 3593.6,-1776.88 3625.6,-1752.62 3601,-1729.5 3404.63,-1544.95 2652.15,-1689.82 2394,-1612.5 2373.79,-1606.45 2352.85,-1595.76 2336.17,-1586.01"/>+<polygon fill="black" stroke="black" points="2337.74,-1582.87 2327.36,-1580.72 2334.13,-1588.87 2337.74,-1582.87"/>+</g>+<!-- u36&#45;&gt;u38 -->+<g id="edge142" class="edge"><title>u36&#45;&gt;u38</title>+<path fill="none" stroke="black" d="M3847.18,-1930.18C3815.83,-1906.4 3760.24,-1859.06 3733,-1804.5 3717.92,-1774.3 3745.82,-1752.39 3721,-1729.5 3473.87,-1501.68 2537.43,-1700.36 2213,-1612.5 2190.92,-1606.52 2167.83,-1595.63 2149.51,-1585.74"/>+<polygon fill="black" stroke="black" points="2151.1,-1582.62 2140.66,-1580.83 2147.71,-1588.74 2151.1,-1582.62"/>+</g>+<!-- u36&#45;&gt;u39 -->+<g id="edge143" class="edge"><title>u36&#45;&gt;u39</title>+<path fill="none" stroke="black" d="M3852.14,-1929.91C3826.45,-1905.07 3779.29,-1855.64 3753,-1804.5 3737.23,-1773.82 3759.28,-1751.85 3733,-1729.5 3532.58,-1559.11 2804.96,-1694.5 2555,-1612.5 2536.99,-1606.6 2518.68,-1596.2 2504.04,-1586.58"/>+<polygon fill="black" stroke="black" points="2505.67,-1583.46 2495.43,-1580.75 2501.74,-1589.25 2505.67,-1583.46"/>+</g>+<!-- u36&#45;&gt;u45 -->+<g id="edge144" class="edge"><title>u36&#45;&gt;u45</title>+<path fill="none" stroke="black" d="M3851.99,-1929.64C3815.43,-1895.43 3732.52,-1817.83 3691.26,-1779.21"/>+<polygon fill="black" stroke="black" points="3693.52,-1776.53 3683.83,-1772.25 3688.74,-1781.64 3693.52,-1776.53"/>+</g>+<!-- u41 -->+<g id="node86" class="node"><title>u41</title>+<ellipse fill="#ff77bb" stroke="black" stroke-width="0" cx="4156" cy="-1755.5" rx="113.18" ry="18"/>+<text text-anchor="middle" x="4156" y="-1751.8" font-family="Times,serif" font-size="14.00">ProblemValidationSwitches</text>+</g>+<!-- u36&#45;&gt;u41 -->+<g id="edge145" class="edge"><title>u36&#45;&gt;u41</title>+<path fill="none" stroke="black" d="M3894.63,-1930.14C3945.93,-1896.06 4064.26,-1817.45 4122.45,-1778.79"/>+<polygon fill="black" stroke="black" points="4124.53,-1781.62 4130.92,-1773.17 4120.65,-1775.79 4124.53,-1781.62"/>+</g>+<!-- u44 -->+<g id="node88" class="node"><title>u44</title>+<ellipse fill="#ff77bb" stroke="black" stroke-width="0" cx="3906" cy="-1755.5" rx="118.879" ry="18"/>+<text text-anchor="middle" x="3906" y="-1751.8" font-family="Times,serif" font-size="14.00">TimetableValidationSwitches</text>+</g>+<!-- u36&#45;&gt;u44 -->+<g id="edge146" class="edge"><title>u36&#45;&gt;u44</title>+<path fill="none" stroke="black" d="M3873.26,-1929.31C3879.54,-1896.17 3893.35,-1823.25 3900.88,-1783.55"/>+<polygon fill="black" stroke="black" points="3904.35,-1784 3902.78,-1773.52 3897.47,-1782.7 3904.35,-1784"/>+</g>+<!-- u36&#45;&gt;u16 -->+<g id="edge139" class="edge"><title>u36&#45;&gt;u16</title>+<path fill="none" stroke="black" d="M3838.09,-1930.67C3787.28,-1905.23 3685.11,-1853.16 3601,-1804.5 3586.62,-1796.19 3571.06,-1786.49 3557.79,-1777.99"/>+<polygon fill="black" stroke="black" points="3559.31,-1774.81 3549.01,-1772.34 3555.52,-1780.69 3559.31,-1774.81"/>+</g>+<!-- u41&#45;&gt;u7 -->+<g id="edge147" class="edge"><title>u41&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M4184.78,-1737.96C4221.5,-1715.07 4283.54,-1669.96 4311,-1612.5 4357.08,-1516.07 4326,-1479.38 4326,-1372.5 4326,-1372.5 4326,-1372.5 4326,-794.504 4326,-697.829 4339.8,-669.79 4311,-577.504 4294.13,-523.431 4256.44,-468.405 4233.03,-437.542"/>+<polygon fill="black" stroke="black" points="4235.71,-435.285 4226.83,-429.498 4230.16,-439.556 4235.71,-435.285"/>+</g>+<!-- u41&#45;&gt;u42 -->+<g id="edge148" class="edge"><title>u41&#45;&gt;u42</title>+<path fill="none" stroke="black" d="M4188.8,-1738.16C4229.48,-1715.93 4297.2,-1671.99 4328,-1612.5 4377.18,-1517.51 4346,-1479.47 4346,-1372.5 4346,-1372.5 4346,-1372.5 4346,-1178.5 4346,-889.357 4360.42,-539.025 4364.77,-439.837"/>+<polygon fill="black" stroke="black" points="4368.27,-439.903 4365.22,-429.758 4361.28,-439.593 4368.27,-439.903"/>+</g>+<!-- u43 -->+<g id="node87" class="node"><title>u43</title>+<ellipse fill="#ff77bb" stroke="black" stroke-width="0" cx="4031" cy="-1563.5" rx="73.387" ry="18"/>+<text text-anchor="middle" x="4031" y="-1559.8" font-family="Times,serif" font-size="14.00">ValidationSwitch</text>+</g>+<!-- u41&#45;&gt;u43 -->+<g id="edge149" class="edge"><title>u41&#45;&gt;u43</title>+<path fill="none" stroke="black" d="M4144.69,-1737.31C4122.65,-1703.82 4073.89,-1629.69 4047.97,-1590.29"/>+<polygon fill="black" stroke="black" points="4050.62,-1587.96 4042.2,-1581.52 4044.77,-1591.8 4050.62,-1587.96"/>+</g>+<!-- u44&#45;&gt;u7 -->+<g id="edge150" class="edge"><title>u44&#45;&gt;u7</title>+<path fill="none" stroke="black" d="M3947.3,-1738.5C4049.5,-1695.89 4306,-1569.36 4306,-1372.5 4306,-1372.5 4306,-1372.5 4306,-794.504 4306,-657.431 4248.77,-500.342 4224.1,-438.991"/>+<polygon fill="black" stroke="black" points="4227.31,-437.596 4220.3,-429.655 4220.83,-440.236 4227.31,-437.596"/>+</g>+<!-- u44&#45;&gt;u43 -->+<g id="edge151" class="edge"><title>u44&#45;&gt;u43</title>+<path fill="none" stroke="black" d="M3917.31,-1737.31C3939.35,-1703.82 3988.11,-1629.69 4014.03,-1590.29"/>+<polygon fill="black" stroke="black" points="4017.23,-1591.8 4019.8,-1581.52 4011.38,-1587.96 4017.23,-1591.8"/>+</g>+<!-- u63&#45;&gt;u68 -->+<g id="edge152" class="edge"><title>u63&#45;&gt;u68</title>+<path fill="none" stroke="black" d="M3957.92,-2138.53C3457.24,-2138.37 577.126,-2131.51 214,-1996.5 200.051,-1991.32 186.864,-1981.54 176.425,-1972.15"/>+<polygon fill="black" stroke="black" points="178.679,-1969.46 169.011,-1965.13 173.867,-1974.55 178.679,-1969.46"/>+</g>+<!-- u63&#45;&gt;u36 -->+<g id="edge153" class="edge"><title>u63&#45;&gt;u36</title>+<path fill="none" stroke="black" d="M4017.62,-2121.64C3988.92,-2087.98 3924.42,-2012.32 3890.98,-1973.11"/>+<polygon fill="black" stroke="black" points="3893.5,-1970.67 3884.34,-1965.33 3888.17,-1975.21 3893.5,-1970.67"/>+</g>+<!-- u72 -->+<g id="node94" class="node"><title>u72</title>+<ellipse fill="#33bb77" stroke="black" stroke-width="0" cx="715" cy="-1755.5" rx="92.8835" ry="18"/>+<text text-anchor="middle" x="715" y="-1751.8" font-family="Times,serif" font-size="14.00">TimetableCoordinates</text>+</g>+<!-- u63&#45;&gt;u72 -->+<g id="edge154" class="edge"><title>u63&#45;&gt;u72</title>+<path fill="none" stroke="black" d="M3966.25,-2131.04C3780.93,-2109.98 3238.53,-2048.3 2788,-1996.5 2018.71,-1908.07 1088.98,-1800.01 802.954,-1766.74"/>+<polygon fill="black" stroke="black" points="802.984,-1763.22 792.646,-1765.54 802.175,-1770.17 802.984,-1763.22"/>+</g>+<!-- u75 -->+<g id="node97" class="node"><title>u75</title>+<ellipse fill="#ffff33" stroke="black" stroke-width="0" cx="436" cy="-1947.5" rx="48.1917" ry="18"/>+<text text-anchor="middle" x="436" y="-1943.8" font-family="Times,serif" font-size="14.00">Timetable</text>+</g>+<!-- u63&#45;&gt;u75 -->+<g id="edge155" class="edge"><title>u63&#45;&gt;u75</title>+<path fill="none" stroke="black" d="M3960.17,-2134.71C3494.74,-2110.12 912.06,-1973.66 493.354,-1951.53"/>+<polygon fill="black" stroke="black" points="493.468,-1948.04 483.297,-1951 493.099,-1955.03 493.468,-1948.04"/>+</g>+<!-- u66&#45;&gt;u62 -->+<g id="edge156" class="edge"><title>u66&#45;&gt;u62</title>+<path fill="none" stroke="black" d="M631.992,-1355.75C728.464,-1321.04 969.405,-1234.34 1071.78,-1197.49"/>+<polygon fill="black" stroke="black" points="1073.02,-1200.77 1081.25,-1194.09 1070.65,-1194.18 1073.02,-1200.77"/>+</g>+<!-- u67&#45;&gt;u66 -->+<g id="edge157" class="edge"><title>u67&#45;&gt;u66</title>+<path fill="none" stroke="black" d="M548.254,-1545.31C556.468,-1512.1 574.566,-1438.94 584.372,-1399.3"/>+<polygon fill="black" stroke="black" points="587.786,-1400.07 586.79,-1389.52 580.991,-1398.39 587.786,-1400.07"/>+</g>+<!-- u69&#45;&gt;u38 -->+<g id="edge158" class="edge"><title>u69&#45;&gt;u38</title>+<path fill="none" stroke="black" d="M583.221,-1740.56C592.458,-1736.37 602.979,-1732.18 613,-1729.5 1127.32,-1591.91 1770.23,-1568.78 2014.04,-1565.1"/>+<polygon fill="black" stroke="black" points="2014.35,-1568.6 2024.29,-1564.96 2014.25,-1561.6 2014.35,-1568.6"/>+</g>+<!-- u69&#45;&gt;u70 -->+<g id="edge159" class="edge"><title>u69&#45;&gt;u70</title>+<path fill="none" stroke="black" d="M584.192,-1740.84C653.468,-1707.26 832.076,-1620.69 910.328,-1582.76"/>+<polygon fill="black" stroke="black" points="912.329,-1585.68 919.801,-1578.17 909.276,-1579.38 912.329,-1585.68"/>+</g>+<!-- u69&#45;&gt;u67 -->+<g id="edge160" class="edge"><title>u69&#45;&gt;u67</title>+<path fill="none" stroke="black" d="M554.914,-1737.31C552.821,-1704.17 548.216,-1631.25 545.708,-1591.55"/>+<polygon fill="black" stroke="black" points="549.198,-1591.28 545.075,-1581.52 542.212,-1591.73 549.198,-1591.28"/>+</g>+<!-- u71 -->+<g id="node93" class="node"><title>u71</title>+<ellipse fill="#33bb77" stroke="black" stroke-width="0" cx="682" cy="-1563.5" rx="83.6854" ry="18"/>+<text text-anchor="middle" x="682" y="-1559.8" font-family="Times,serif" font-size="14.00">TimetableForWeek</text>+</g>+<!-- u69&#45;&gt;u71 -->+<g id="edge161" class="edge"><title>u69&#45;&gt;u71</title>+<path fill="none" stroke="black" d="M566.961,-1737.98C588.967,-1704.79 638.658,-1629.86 664.948,-1590.22"/>+<polygon fill="black" stroke="black" points="668.184,-1591.67 670.794,-1581.4 662.35,-1587.8 668.184,-1591.67"/>+</g>+<!-- u71&#45;&gt;u29 -->+<g id="edge162" class="edge"><title>u71&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M687.499,-1545.24C701.812,-1503.33 744.454,-1395.98 820,-1345.5 1070.26,-1178.3 1201.79,-1324.62 1487,-1228.5 1506.9,-1221.8 1527.79,-1211.36 1544.72,-1201.93"/>+<polygon fill="black" stroke="black" points="1546.73,-1204.81 1553.69,-1196.82 1543.27,-1198.73 1546.73,-1204.81"/>+</g>+<!-- u71&#45;&gt;u66 -->+<g id="edge163" class="edge"><title>u71&#45;&gt;u66</title>+<path fill="none" stroke="black" d="M673.764,-1545.31C657.792,-1511.96 622.52,-1438.32 603.591,-1398.79"/>+<polygon fill="black" stroke="black" points="606.628,-1397.03 599.152,-1389.52 600.315,-1400.06 606.628,-1397.03"/>+</g>+<!-- u72&#45;&gt;u1 -->+<g id="edge164" class="edge"><title>u72&#45;&gt;u1</title>+<path fill="none" stroke="black" d="M792.243,-1745.35C1044.91,-1713.84 1840.45,-1601.7 2012,-1420.5 2035.37,-1395.82 2017.23,-1378.06 2027,-1345.5 2042.14,-1295.05 2066.8,-1238.67 2081.61,-1206.6"/>+<polygon fill="black" stroke="black" points="2084.82,-1208 2085.87,-1197.46 2078.47,-1205.05 2084.82,-1208"/>+</g>+<!-- u72&#45;&gt;u61 -->+<g id="edge165" class="edge"><title>u72&#45;&gt;u61</title>+<path fill="none" stroke="black" d="M723.067,-1737.28C735.276,-1710.82 758.744,-1658.42 775,-1612.5 816.219,-1496.08 790.776,-1452.76 852,-1345.5 936.28,-1197.85 1093.82,-1063.55 1159.29,-1011.44"/>+<polygon fill="black" stroke="black" points="1161.49,-1014.16 1167.17,-1005.21 1157.15,-1008.67 1161.49,-1014.16"/>+</g>+<!-- u73 -->+<g id="node95" class="node"><title>u73</title>+<ellipse fill="#ffff33" stroke="black" stroke-width="0" cx="262" cy="-1755.5" rx="36.2938" ry="18"/>+<text text-anchor="middle" x="262" y="-1751.8" font-family="Times,serif" font-size="14.00">Lesson</text>+</g>+<!-- u73&#45;&gt;u67 -->+<g id="edge166" class="edge"><title>u73&#45;&gt;u67</title>+<path fill="none" stroke="black" d="M284.942,-1741.52C336.214,-1712.36 458.524,-1641.92 496,-1612.5 505.511,-1605.04 515.108,-1595.85 523.195,-1587.51"/>+<polygon fill="black" stroke="black" points="525.812,-1589.84 530.15,-1580.17 520.731,-1585.03 525.812,-1589.84"/>+</g>+<!-- u74 -->+<g id="node96" class="node"><title>u74</title>+<ellipse fill="#ffff33" stroke="black" stroke-width="0" cx="400" cy="-1563.5" rx="82.5854" ry="18"/>+<text text-anchor="middle" x="400" y="-1559.8" font-family="Times,serif" font-size="14.00">LessonResourceIds</text>+</g>+<!-- u73&#45;&gt;u74 -->+<g id="edge167" class="edge"><title>u73&#45;&gt;u74</title>+<path fill="none" stroke="black" d="M273.766,-1738.3C297.823,-1705.18 352.794,-1629.5 381.608,-1589.83"/>+<polygon fill="black" stroke="black" points="384.627,-1591.63 387.672,-1581.48 378.963,-1587.51 384.627,-1591.63"/>+</g>+<!-- u74&#45;&gt;u20 -->+<g id="edge168" class="edge"><title>u74&#45;&gt;u20</title>+<path fill="none" stroke="black" d="M446.516,-1548.61C462.117,-1544.43 479.693,-1540.23 496,-1537.5 1162.5,-1425.91 1367.07,-1622.34 2012,-1420.5 2030.69,-1414.66 2049.67,-1403.91 2064.67,-1394.07"/>+<polygon fill="black" stroke="black" points="2066.68,-1396.93 2073,-1388.42 2062.76,-1391.13 2066.68,-1396.93"/>+</g>+<!-- u74&#45;&gt;u66 -->+<g id="edge169" class="edge"><title>u74&#45;&gt;u66</title>+<path fill="none" stroke="black" d="M416.95,-1545.64C450.93,-1511.84 527.48,-1435.69 566.754,-1396.62"/>+<polygon fill="black" stroke="black" points="569.467,-1398.86 574.088,-1389.33 564.53,-1393.9 569.467,-1398.86"/>+</g>+<!-- u75&#45;&gt;u39 -->+<g id="edge170" class="edge"><title>u75&#45;&gt;u39</title>+<path fill="none" stroke="black" d="M482.44,-1942.45C637.432,-1928.53 1150.8,-1879.44 1570,-1804.5 1939.74,-1738.41 2044.48,-1752.54 2393,-1612.5 2410.08,-1605.64 2427.81,-1595.53 2442.31,-1586.35"/>+<polygon fill="black" stroke="black" points="2444.4,-1589.17 2450.89,-1580.79 2440.59,-1583.29 2444.4,-1589.17"/>+</g>+<!-- u75&#45;&gt;u69 -->+<g id="edge171" class="edge"><title>u75&#45;&gt;u69</title>+<path fill="none" stroke="black" d="M446.649,-1929.64C467.731,-1896.26 514.894,-1821.59 539.831,-1782.11"/>+<polygon fill="black" stroke="black" points="542.994,-1783.65 545.375,-1773.33 537.075,-1779.91 542.994,-1783.65"/>+</g>+<!-- u75&#45;&gt;u73 -->+<g id="edge172" class="edge"><title>u75&#45;&gt;u73</title>+<path fill="none" stroke="black" d="M421.165,-1930.3C390.321,-1896.62 319.174,-1818.94 283.382,-1779.85"/>+<polygon fill="black" stroke="black" points="285.643,-1777.14 276.308,-1772.13 280.481,-1781.87 285.643,-1777.14"/>+</g>+<!-- u76 -->+<g id="node98" class="node"><title>u76</title>+<ellipse fill="#ffff33" stroke="black" stroke-width="0" cx="400" cy="-1755.5" rx="83.6854" ry="18"/>+<text text-anchor="middle" x="400" y="-1751.8" font-family="Times,serif" font-size="14.00">TimetableForWeek</text>+</g>+<!-- u75&#45;&gt;u76 -->+<g id="edge173" class="edge"><title>u75&#45;&gt;u76</title>+<path fill="none" stroke="black" d="M432.742,-1929.31C426.463,-1896.17 412.647,-1823.25 405.125,-1783.55"/>+<polygon fill="black" stroke="black" points="408.525,-1782.7 403.225,-1773.52 401.648,-1784 408.525,-1782.7"/>+</g>+<!-- u76&#45;&gt;u29 -->+<g id="edge174" class="edge"><title>u76&#45;&gt;u29</title>+<path fill="none" stroke="black" d="M449.603,-1740.94C555.46,-1711.55 795.861,-1642.23 820,-1612.5 895.339,-1519.72 770.19,-1432.63 852,-1345.5 1048.44,-1136.3 1215.45,-1321.32 1487,-1228.5 1506.87,-1221.71 1527.76,-1211.27 1544.7,-1201.85"/>+<polygon fill="black" stroke="black" points="1546.7,-1204.74 1553.67,-1196.76 1543.24,-1198.65 1546.7,-1204.74"/>+</g>+<!-- u76&#45;&gt;u74 -->+<g id="edge175" class="edge"><title>u76&#45;&gt;u74</title>+<path fill="none" stroke="black" d="M400,-1737.31C400,-1704.17 400,-1631.25 400,-1591.55"/>+<polygon fill="black" stroke="black" points="403.5,-1591.52 400,-1581.52 396.5,-1591.52 403.5,-1591.52"/>+</g>+<!-- u5&#45;&gt;u6 -->+<g id="edge176" class="edge"><title>u5&#45;&gt;u6</title>+<path fill="none" stroke="black" d="M2409.97,-394.48C2427.84,-365.748 2465.44,-305.291 2486.63,-271.215"/>+<polygon fill="black" stroke="black" points="2489.83,-272.691 2492.14,-262.351 2483.89,-268.994 2489.83,-272.691"/>+</g>+<!-- u4 -->+<g id="node108" class="node"><title>u4</title>+<ellipse fill="#ffffbb" stroke="black" stroke-width="0" cx="2538" cy="-78.504" rx="27" ry="18"/>+<text text-anchor="middle" x="2538" y="-74.804" font-family="Times,serif" font-size="14.00">Size</text>+</g>+<!-- u6&#45;&gt;u4 -->+<g id="edge177" class="edge"><title>u6&#45;&gt;u4</title>+<path fill="none" stroke="black" d="M2505.72,-227.468C2511.97,-198.814 2524.64,-140.756 2532.11,-106.502"/>+<polygon fill="black" stroke="black" points="2535.54,-107.211 2534.25,-96.6949 2528.7,-105.719 2535.54,-107.211"/>+</g>+<!-- u10&#45;&gt;u6 -->+<g id="edge178" class="edge"><title>u10&#45;&gt;u6</title>+<path fill="none" stroke="black" d="M2502,-393.263C2502,-364.767 2502,-307.625 2502,-273.661"/>+<polygon fill="black" stroke="black" points="2505.5,-273.514 2502,-263.514 2498.5,-273.514 2505.5,-273.514"/>+</g>+<!-- u22&#45;&gt;u5 -->+<g id="edge179" class="edge"><title>u22&#45;&gt;u5</title>+<path fill="none" stroke="black" d="M2416.37,-585.308C2413.23,-552.172 2406.32,-479.25 2402.56,-439.55"/>+<polygon fill="black" stroke="black" points="2406.04,-439.15 2401.61,-429.525 2399.07,-439.81 2406.04,-439.15"/>+</g>+<!-- u40&#45;&gt;u4 -->+<g id="edge180" class="edge"><title>u40&#45;&gt;u4</title>+<path fill="none" stroke="black" d="M2559.11,-585.465C2560.79,-558.819 2563.89,-505.66 2565,-460.504 2565.82,-427.181 2566.47,-418.805 2565,-385.504 2560.46,-282.323 2547.34,-160.139 2541.22,-106.749"/>+<polygon fill="black" stroke="black" points="2544.68,-106.254 2540.06,-96.7228 2537.73,-107.059 2544.68,-106.254"/>+</g>+<!-- u15 -->+<g id="node107" class="node"><title>u15</title>+<ellipse fill="#bb7733" stroke="black" stroke-width="0" cx="5068" cy="-411.504" rx="27" ry="18"/>+<text text-anchor="middle" x="5068" y="-407.804" font-family="Times,serif" font-size="14.00">CSS</text>+</g>+<!-- u14&#45;&gt;u15 -->+<g id="edge181" class="edge"><title>u14&#45;&gt;u15</title>+<path fill="none" stroke="black" d="M5068,-585.308C5068,-552.172 5068,-479.25 5068,-439.55"/>+<polygon fill="black" stroke="black" points="5071.5,-439.525 5068,-429.525 5064.5,-439.525 5071.5,-439.525"/>+</g>+<!-- u0 -->+<g id="node110" class="node"><title>u0</title>+<ellipse fill="#bbffbb" stroke="black" stroke-width="0" cx="5607" cy="-3178.5" rx="29.795" ry="18"/>+<text text-anchor="middle" x="5607" y="-3174.8" font-family="Times,serif" font-size="14.00">Main</text>+</g>+<!-- u0&#45;&gt;u79 -->+<g id="edge1" class="edge"><title>u0&#45;&gt;u79</title>+<path fill="none" stroke="black" d="M5625,-3163.68C5650.78,-3142.82 5697.65,-3100.68 5721,-3053.5 5763.85,-2966.93 5759,-2936.1 5759,-2839.5 5759,-2839.5 5759,-2839.5 5759,-2645.5 5759,-2415.41 5873,-2370.6 5873,-2140.5 5873,-2140.5 5873,-2140.5 5873,-794.504 5873,-658.953 4854.21,-471.009 4584.73,-423.668"/>+<polygon fill="black" stroke="black" points="4585.17,-420.191 4574.71,-421.912 4583.96,-427.086 4585.17,-420.191"/>+</g>+<!-- u0&#45;&gt;u80 -->+<g id="edge2" class="edge"><title>u0&#45;&gt;u80</title>+<path fill="none" stroke="black" d="M5630.89,-3167.36C5668.34,-3150.08 5740,-3111.09 5773,-3053.5 5820.59,-2970.47 5797,-2935.21 5797,-2839.5 5797,-2839.5 5797,-2839.5 5797,-1178.5 5797,-1078.2 5803.21,-1035.05 5735,-961.504 5632.88,-851.391 5544.89,-924.827 5418,-844.504 5407.52,-837.872 5397.46,-828.694 5389.21,-820.138"/>+<polygon fill="black" stroke="black" points="5391.55,-817.508 5382.19,-812.547 5386.41,-822.263 5391.55,-817.508"/>+</g>+<!-- u0&#45;&gt;u81 -->+<g id="edge3" class="edge"><title>u0&#45;&gt;u81</title>+<path fill="none" stroke="black" d="M5633.3,-3169.92C5678.23,-3155.46 5768.96,-3119.36 5811,-3053.5 5862.5,-2972.83 5835,-2935.21 5835,-2839.5 5835,-2839.5 5835,-2839.5 5835,-1178.5 5835,-1081.47 5867.48,-1040.4 5811,-961.504 5735.49,-856.021 5574.93,-815.92 5499.61,-802.485"/>+<polygon fill="black" stroke="black" points="5500.01,-799.003 5489.56,-800.762 5498.83,-805.902 5500.01,-799.003"/>+</g>+<!-- u0&#45;&gt;u82 -->+<g id="edge4" class="edge"><title>u0&#45;&gt;u82</title>+<path fill="none" stroke="black" d="M5603.69,-3160.34C5594.45,-3110.81 5569,-2963.21 5569,-2839.5 5569,-2839.5 5569,-2839.5 5569,-1178.5 5569,-1058.41 5509.47,-1025.73 5408,-961.504 5182.48,-818.767 5061.44,-956.101 4819,-844.504 4805.54,-838.308 4792.39,-828.577 4781.76,-819.493"/>+<polygon fill="black" stroke="black" points="4783.96,-816.769 4774.17,-812.741 4779.31,-822.001 4783.96,-816.769"/>+</g>+<!-- u0&#45;&gt;u83 -->+<g id="edge5" class="edge"><title>u0&#45;&gt;u83</title>+<path fill="none" stroke="black" d="M5607,-3160.27C5607,-3110.53 5607,-2962.44 5607,-2839.5 5607,-2839.5 5607,-2839.5 5607,-1178.5 5607,-1081.47 5649.45,-1032.21 5583,-961.504 5375.08,-740.28 5177.96,-987.224 4910,-844.504 4899.24,-838.771 4889.52,-829.594 4881.82,-820.793"/>+<polygon fill="black" stroke="black" points="4884.41,-818.422 4875.35,-812.925 4879,-822.87 4884.41,-818.422"/>+</g>+<!-- u0&#45;&gt;u84 -->+<g id="edge6" class="edge"><title>u0&#45;&gt;u84</title>+<path fill="none" stroke="black" d="M5610.31,-3160.34C5619.55,-3110.81 5645,-2963.21 5645,-2839.5 5645,-2839.5 5645,-2839.5 5645,-1178.5 5645,-1081.47 5685.97,-1033.58 5621,-961.504 5456.87,-779.425 5311.3,-931.182 5082,-844.504 5063.68,-837.58 5044.54,-827.245 5028.98,-817.936"/>+<polygon fill="black" stroke="black" points="5030.63,-814.838 5020.27,-812.607 5026.97,-820.81 5030.63,-814.838"/>+</g>+<!-- u0&#45;&gt;u85 -->+<g id="edge7" class="edge"><title>u0&#45;&gt;u85</title>+<path fill="none" stroke="black" d="M5615.63,-3161.18C5627.49,-3137.96 5648.54,-3093.72 5659,-3053.5 5683.08,-2960.88 5683,-2935.21 5683,-2839.5 5683,-2839.5 5683,-2839.5 5683,-1178.5 5683,-1081.47 5722.7,-1034.7 5659,-961.504 5520.22,-802.055 5386.47,-940.226 5198,-844.504 5185.49,-838.152 5173.28,-828.691 5163.31,-819.844"/>+<polygon fill="black" stroke="black" points="5165.56,-817.156 5155.84,-812.951 5160.82,-822.303 5165.56,-817.156"/>+</g>+<!-- u0&#45;&gt;u86 -->+<g id="edge8" class="edge"><title>u0&#45;&gt;u86</title>+<path fill="none" stroke="black" d="M5621.86,-3162.65C5642.65,-3140.84 5679.79,-3097.9 5697,-3053.5 5731.59,-2964.27 5721,-2935.21 5721,-2839.5 5721,-2839.5 5721,-2839.5 5721,-1178.5 5721,-1081.47 5758.77,-1036.34 5697,-961.504 5585.32,-826.199 5475.3,-926.11 5320,-844.504 5307.07,-837.711 5294.16,-828.067 5283.56,-819.203"/>+<polygon fill="black" stroke="black" points="5285.81,-816.519 5275.95,-812.637 5281.24,-821.819 5285.81,-816.519"/>+</g>+<!-- u0&#45;&gt;u87 -->+<g id="edge9" class="edge"><title>u0&#45;&gt;u87</title>+<path fill="none" stroke="black" d="M5577.34,-3180.92C5414.17,-3194.04 4609.28,-3257.03 3950,-3276.5 3856.26,-3279.27 3829.43,-3301.33 3739,-3276.5 3686.87,-3262.19 3634.54,-3226.66 3603.21,-3202.55"/>+<polygon fill="black" stroke="black" points="3604.97,-3199.49 3594.94,-3196.08 3600.66,-3205 3604.97,-3199.49"/>+</g>+<!-- u0&#45;&gt;u101 -->+<g id="edge10" class="edge"><title>u0&#45;&gt;u101</title>+<path fill="none" stroke="black" d="M5590.31,-3163.25C5541.58,-3119.96 5403,-2984.12 5403,-2839.5 5403,-2839.5 5403,-2839.5 5403,-2478.5 5403,-2358.86 5350.21,-2223.02 5325.94,-2166.9"/>+<polygon fill="black" stroke="black" points="5329.12,-2165.43 5321.9,-2157.67 5322.71,-2168.24 5329.12,-2165.43"/>+</g>+<!-- u0&#45;&gt;u103 -->+<g id="edge11" class="edge"><title>u0&#45;&gt;u103</title>+<path fill="none" stroke="black" d="M5592.55,-3162.48C5572.26,-3140.47 5535.72,-3097.28 5517,-3053.5 5478.99,-2964.61 5478,-2936.18 5478,-2839.5 5478,-2839.5 5478,-2839.5 5478,-2478.5 5478,-2362.9 5469.13,-2225.27 5465.03,-2167.81"/>+<polygon fill="black" stroke="black" points="5468.52,-2167.45 5464.3,-2157.73 5461.54,-2167.95 5468.52,-2167.45"/>+</g>+<!-- u0&#45;&gt;u104 -->+<g id="edge12" class="edge"><title>u0&#45;&gt;u104</title>+<path fill="none" stroke="black" d="M5598.37,-3161.18C5586.51,-3137.96 5565.46,-3093.72 5555,-3053.5 5530.92,-2960.88 5531,-2935.21 5531,-2839.5 5531,-2839.5 5531,-2839.5 5531,-2138.5 5531,-2041.8 5555.4,-2009.37 5515,-1921.5 5485.64,-1857.66 5420.21,-1804.78 5380.83,-1777.19"/>+<polygon fill="black" stroke="black" points="5382.59,-1774.15 5372.36,-1771.37 5378.62,-1779.92 5382.59,-1774.15"/>+</g>+<!-- u0&#45;&gt;u105 -->+<g id="edge13" class="edge"><title>u0&#45;&gt;u105</title>+<path fill="none" stroke="black" d="M5580.59,-3169.78C5490.82,-3143.52 5196.22,-3057.34 5073.46,-3021.43"/>+<polygon fill="black" stroke="black" points="5074.1,-3017.97 5063.52,-3018.53 5072.13,-3024.69 5074.1,-3017.97"/>+</g>+</g>+</svg>
+ xhtml/timetable_01.xhtml view
@@ -0,0 +1,2266 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">+<head>+<meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title>+</head>+<body>+<h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_01.xml' --outputStudentViewTimetable='xml/studentViewTimetable_01.xml'</h1>+<div class="box">+<button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button>+<h2 title="Runtime-information."+      >Runtime-information</h2>+<div style="display: none" id="consoleOutput">+<ul>+<li>+<p class="warning"+	    >WARNING:	the following lesson-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;isSpecialistInTopic&quot;, &quot;matchCourseClassSizeToLocationCapacity&quot;, &quot;maximiseRelativeFacilityUtilisation&quot;, &quot;minimiseWasteOfScarceFacilities&quot;.</p>+</li>+<li>+<p class="warning"+	    >WARNING:	the following timetable-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest&quot;, &quot;minimiseDispersionOfStudentFreePeriodsPerDay&quot;, &quot;minimiseRatioOfConsecutiveEqualLessons&quot;.</p>+</li>+<li>+<p class="warning"+	    >WARNING:	the following evolution-strategies are inappropriate for the specified problem-parameters, &amp; consequently their fecundities have been zeroed; &quot;excessRunlengthMutation&quot;, &quot;splitSessionMutation&quot;.</p>+</li>+</ul>+<table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable">+<tr>+<th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th>+</tr>+<tr>+<th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th>+<th title="Weighted Mean over the values of Heterogeneous Timetable-criteria.">+<abbr title="mu"+	      >&mu;</abbr>+</th>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b65910"+	    >0.891</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b65910"+	    >0.891</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b65910"+	    >0.891</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b65910"+	    >0.891</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b65910"+	    >0.891</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b65810"+	    >0.893</td>+</tr>+<tr>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b65810"+	    >0.893</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b65810"+	    >0.893</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b65810"+	    >0.893</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-TimeslotId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b65810"+	    >0.893</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b65910"+	    >0.891</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b55b0f"+	    >0.886</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >-Day</td>+<td class="numericData" style="color: #b45e0d"+	    >0.880</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >-ObserverId</td>+<td class="numericData" style="color: #b65810"+	    >0.893</td>+</tr>+<tr id="selectedRaster" title="Selected Raster-scan.">+<td class="timetableAxis"+	    >+TimeslotId</td>+<td class="timetableAxis"+	    >+Day</td>+<td class="timetableAxis"+	    >+ObserverId</td>+<td class="numericData" style="color: #b95114"+	    >0.910</td>+</tr>+<tr>+<th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria.">+<abbr title="mu"+	      >&mu;</abbr>+</th>+<td class="numericData" style="color: #b65910"+	    >0.892</td>+</tr>+</table>+<table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable">+<tr>+<th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th>+</tr>+<tr>+<th rowspan="2"+	    >Name</th>+<th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th>+<th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th>+</tr>+<tr>+<th title="The mean value">+<abbr title="mu"+	      >&mu;</abbr>+</th>+<th title="The standard deviation.">+<abbr title="sigma"+	      >&sigma;</abbr>+</th>+<th title="The minimum value."+	    >Min.</th>+<th title="The maximum value."+	    >Max.</th>+</tr>+<tr>+<td class="lessonCriterion"+	    >areResourcesReused</td>+<td class="numericData" style="color: #38bf28"+	    >0.523</td>+<td class="numericData" style="color: #24bf3c"+	    >0.467</td>+<td class="numericData" style="color: #2fbf30"+	    >0.499</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td>+<td class="numericData" style="color: #066dab"+	    >0.159</td>+<td class="numericData" style="color: #05a970"+	    >0.333</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #05a970"+	    >0.333</td>+<td class="numericData" style="color: #05a970"+	    >0.333</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td>+<td class="numericData" style="color: #233dbe"+	    >0.037</td>+<td class="numericData" style="color: #55b712"+	    >0.600</td>+<td class="numericData" style="color: #2cbf33"+	    >0.490</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >isSpecialistInTopic</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td>+<td class="numericData" style="color: #194abb"+	    >0.071</td>+<td class="numericData" style="color: #51b915"+	    >0.589</td>+<td class="numericData" style="color: #00928d"+	    >0.257</td>+<td class="numericData" style="color: #05a970"+	    >0.333</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td>+<td class="numericData" style="color: #164fba"+	    >0.084</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td>+<td class="numericData" style="color: #1f42bd"+	    >0.050</td>+<td class="numericData" style="color: #bc481a"+	    >0.933</td>+<td class="numericData" style="color: #008f90"+	    >0.249</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+</tr>+<tr>+<td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td>+<td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+</table>+<table class="runtimeInformation" id="evolutionStrategyStatisticsTable">+<tr>+<th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where a Variable number of Scouts were Dispatched.</th>+</tr>+<tr id="timetableCriteriaWeights">+<th colspan="7"+	    >Timetable-criteria Weights&nbsp;&rarr;</th>+<td class="numericData" style="color: #2f30c0" title="maximiseComplianceWithFreePeriodPreferences"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #1c47bc" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.062</td>+<td class="numericData" style="color: #009090" title="maximiseMeanStudentClassSize"+	    >0.250</td>+<td class="numericData" style="color: #2f30c0" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td>+<td class="numericData" style="color: #2f30c0" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #2f30c0" title="minimiseDispersionOfStudentFreePeriodsPerDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherFreePeriodsPerDay"+	    >0.031</td>+<td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td>+<td class="numericData" style="color: #2f30c0" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #2f30c0" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td>+<td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td>+<td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td>+<td class="numericData" style="color: #009090" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.250</td>+<td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td>+<td class="numericData" style="color: #2f30c0" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #2f30c0" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td>+</tr>+<tr id="bestDeterministicWeightedTimetableCriteria">+<th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="numericData" style="color: #25bf3b" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.469</td>+<td class="numericData" style="color: #5fb30c" title="maximiseMeanStudentClassSize"+	    >0.625</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="numericData" style="color: #05a970" title="minimiseDispersionOfTeacherFreePeriodsPerDay"+	    >0.333</td>+<td class="numericData" style="color: #70a905" title="minimiseDispersionOfTeacherWorkload"+	    >0.667</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="numericData" style="color: #30c030" title="minimiseMeanLocationChangesOfTeachers"+	    >0.500</td>+<td class="numericData" style="color: #1ebd44" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.444</td>+<td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+<td class="unavailable" title="Zero weight"+	    >N/A</td>+</tr>+<tr>+<th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th>+<th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th>+<th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th>+<th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria.">+<abbr title="mu"+	      >&mu;</abbr>+</th>+<th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase.">+<abbr title="Delta"+	      >&Delta;</abbr>+</th>+<th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th>+</tr>+<tr>+<th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th>+<th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th>+<th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th>+<th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th>+</tr>+<tr>+<td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td>+<td class="reconstructionStrategy"+	    >Deterministic</td>+<td colspan="2" class="numericData"+	    >32</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td>+<td class="reconstructionStrategy"+	    >Deterministic</td>+<td colspan="2" class="numericData"+	    >32</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td>+<td class="reconstructionStrategy"+	    >Deterministic</td>+<td colspan="2" class="numericData"+	    >32</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td>+<td class="reconstructionStrategy"+	    >Deterministic</td>+<td colspan="2" class="numericData"+	    >32</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td>+<td class="reconstructionStrategy"+	    >Deterministic</td>+<td colspan="2" class="numericData"+	    >32</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td>+<td class="reconstructionStrategy"+	    >Deterministic</td>+<td colspan="2" class="numericData"+	    >32</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td>+<td class="reconstructionStrategy"+	    >Random</td>+<td colspan="2" class="numericData"+	    >64</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td>+<td class="reconstructionStrategy"+	    >Random</td>+<td colspan="2" class="numericData"+	    >64</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td>+<td class="reconstructionStrategy"+	    >Random</td>+<td colspan="2" class="numericData"+	    >64</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td>+<td class="reconstructionStrategy"+	    >Random</td>+<td colspan="2" class="numericData"+	    >64</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td>+<td class="reconstructionStrategy"+	    >Random</td>+<td colspan="2" class="numericData"+	    >64</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+<tr>+<td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td>+<td class="reconstructionStrategy"+	    >Random</td>+<td colspan="2" class="numericData"+	    >64</td>+<td class="numericData"+	    >0</td>+<td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td>+</tr>+</table>+</div>+</div>+<div class="box">+<button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button>+<h2 title="From the perspective of each student-body."+      >By Student-body</h2>+<div id="studentViewTimetable">+<div class="box">+<h3+	  >Summary</h3>+<div class="warning">+<dl>+<dt>+<span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span>+</dt>+<dd>+<span class="numericData"+		>0</span>+</dd>+<dt>+<span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span>+</dt>+<dd>+<span class="numericData"+		>0</span>+</dd>+<dt>+<span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span>+</dt>+<dd>+<span class="numericData"+		>0</span>+</dd>+</dl>+</div>+</div>+<dl>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+		>Body_1</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+<td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_3</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_4</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_1</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+</tr>+</table>+</dd>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+		>Body_2</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+<td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_3</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_4</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_1</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_4</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+</tr>+</table>+</dd>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="studentBody" title="&quot;Student_3.0&quot;"+		>Body_3</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+<td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_3</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #16d2b3; background-color: #e92d4c" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_1</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_4</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+</tr>+</table>+</dd>+</dl>+<br class="observerViewTerminator"+	 /></div>+</div>+<div class="box">+<button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button>+<h2 title="From the perspective of each teacher."+      >By Teacher-id</h2>+<div style="display: none" id="teacherViewTimetable">+<div class="box">+<h3+	  >Summary</h3>+<dl>+<dt>+<span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span>+</dt>+<dd>+<span class="numericData"+	      >4</span>+</dd>+<dt>+<span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span>+</dt>+<dd>+<span class="numericData"+	      >3.750</span>+</dd>+<dt>+<span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span>+</dt>+<dd>+<span class="data"+	      >(&quot;Teacher_3&quot;,&quot;Teacher_2&quot;)</span>+</dd>+</dl>+</div>+<dl>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="teacherId" title="teacherId"+		>Teacher_1</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >67</span+		  >%</span>+</li>+<li>+<span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >1</span>+</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td>+<td rowspan="1" style="color: #16d2b3; background-color: #e92d4c" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td>+<td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td>+</tr>+</table>+</dd>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="teacherId" title="teacherId"+		>Teacher_2</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td>+<td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_1</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+</tr>+</table>+</dd>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="teacherId" title="teacherId"+		>Teacher_3</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  >%</span>+</li>+<li>+<span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >2</span>+</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+<td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+</tr>+</table>+</dd>+<dt>+<br+	     /><ul class="observerSummary">+<li>+<span class="teacherId" title="teacherId"+		>Teacher_4</span>+</li>+<li>+<span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >67</span+		  >%</span>+</li>+<li>+<span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >1</span>+</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td>+<td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td>+<td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="locationId" title="locationId"+			>Location_2</span+			>.</li>+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td>+</tr>+</table>+</dd>+</dl>+<br class="observerViewTerminator"+	 /></div>+</div>+<div class="box">+<button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button>+<h2 title="From the perspective of each location."+      >By Location-id</h2>+<div style="display: none" id="locationViewTimetable">+<div class="box">+<h3+	  >Summary</h3>+<dl>+<dt>+<span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span>+</dt>+<dd>+<span class="numericData"+	      >6</span>+</dd>+</dl>+</div>+<dl>+<dt>+<br+	     /><ul class="observerSummary">+<li+	      > <span class="locationId" title="locationId"+		>Location_1</span>+</li>+<li>+<span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span>+</span>+</li>+<li>+<span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >3</span>+</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td>+<td rowspan="1" style="color: #16d2b3; background-color: #e92d4c" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_1</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_2</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td>+</tr>+</table>+</dd>+<dt>+<br+	     /><ul class="observerSummary">+<li+	      > <span class="locationId" title="locationId"+		>Location_2</span>+</li>+<li>+<span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span>+</span>+</li>+<li>+<span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >3</span>+</span>+</li>+</ul>+</dt>+<dd>+<table class="timetableForWeek" title="Timetable for Week">+<tr>+<th class="origin">+</th>+<th class="weekend" title="weekend"+		>Sunday</th>+<th class="workday" title="Work-day"+		>Monday</th>+<th class="workday" title="Work-day"+		>Tuesday</th>+<th class="workday" title="Work-day"+		>Wednesday</th>+<th class="workday" title="Work-day"+		>Thursday</th>+<th class="workday" title="Work-day"+		>Friday</th>+<th class="weekend" title="weekend"+		>Saturday</th>+</tr>+<tr>+<th colspan="1">+<span class="timeslotId" title="timeslotId"+		  >0</span>+</th>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td>+<td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_3</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_4</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td>+<td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;, &quot;Student_1.2&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_1</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1">+<div class="lesson" title="lesson">+<span class="subject" title="subject">+<span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span>+</span+		    >.<ul class="resourceIds" title="resourceIds">+<li>+<span class="studentClass" title="studentClass">+<span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;"+			  >Body_3</span>+</span+			>.</li>+<li>+<span class="teacherId" title="teacherId"+			>Teacher_4</span+			>.</li>+</ul>+</div>+</td>+<td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td>+</tr>+</table>+</dd>+</dl>+<br class="observerViewTerminator"+	 /></div>+</div>+</body>+</html+>+
+ xhtml/timetable_02.xhtml view
@@ -0,0 +1,3277 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"+><head+  ><meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title+    ></head+  ><body+  ><h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_02.xml' --outputStudentViewTimetable='xml/studentViewTimetable_02.xml'</h1+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="Runtime-information."+      >Runtime-information</h2+      ><div style="display: none" id="consoleOutput"+      ><ul+	><li+	  ><p class="warning"+	    >WARNING:	the following timetable-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest&quot;, &quot;minimiseDispersionOfFreeStudentPeriodsPerDay&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	the following evolution-strategies are inappropriate for the specified problem-parameters, &amp; consequently their fecundities have been zeroed; &quot;splitSessionMutation&quot;.</p+	    ></li+	  ></ul+	><table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	><tr+	  ><th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th+	    ></tr+	  ><tr+	  ><th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th+	    ><th title="Weighted Mean over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9c8101"+	    >0.789</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.788</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.787</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b75612"+	    >0.899</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.787</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b75512"+	    >0.900</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9c8101"+	    >0.789</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.788</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9c8101"+	    >0.789</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.782</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.782</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.781</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.788</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.781</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ad6908"+	    >0.851</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b85412"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9a8500"+	    >0.780</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #988600"+	    >0.777</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ad6908"+	    >0.851</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b85512"+	    >0.902</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b85512"+	    >0.902</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.782</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.781</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.786</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.889</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.887</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.787</td+	    ></tr+	  ><tr id="selectedRaster" title="Selected Raster-scan."+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b85413"+	    >0.904</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b85412"+	    >0.902</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.904</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b85412"+	    >0.902</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b85412"+	    >0.902</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b85412"+	    >0.902</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.904</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ae6908"+	    >0.852</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9a8500"+	    >0.780</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #988600"+	    >0.775</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ae6908"+	    >0.852</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b85412"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b85413"+	    >0.903</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b85512"+	    >0.902</td+	    ></tr+	  ><tr+	  ><th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><td class="numericData" style="color: #ad6a08"+	    >0.848</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable"+	><tr+	  ><th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th+	    ></tr+	  ><tr+	  ><th rowspan="2"+	    >Name</th+	    ><th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th+	    ><th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th+	    ></tr+	  ><tr+	  ><th title="The mean value"+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th title="The standard deviation."+	    ><abbr title="sigma"+	      >&sigma;</abbr+	      ></th+	    ><th title="The minimum value."+	    >Min.</th+	    ><th title="The maximum value."+	    >Max.</th+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >areResourcesReused</td+	    ><td class="numericData" style="color: #38bf28"+	    >0.523</td+	    ><td class="numericData" style="color: #027da0"+	    >0.200</td+	    ><td class="numericData" style="color: #12b755"+	    >0.400</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td+	    ><td class="numericData" style="color: #066dab"+	    >0.159</td+	    ><td class="numericData" style="color: #1abc49"+	    >0.432</td+	    ><td class="numericData" style="color: #0e5db4"+	    >0.119</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ><td class="numericData" style="color: #70a905"+	    >0.667</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td+	    ><td class="numericData" style="color: #233dbe"+	    >0.037</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.800</td+	    ><td class="numericData" style="color: #12b755"+	    >0.400</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isSpecialistInTopic</td+	    ><td class="numericData" style="color: #1e44bd"+	    >0.055</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td+	    ><td class="numericData" style="color: #194abb"+	    >0.072</td+	    ><td class="numericData" style="color: #4abb1a"+	    >0.570</td+	    ><td class="numericData" style="color: #0e5db4"+	    >0.119</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.800</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td+	    ><td class="numericData" style="color: #1a49bc"+	    >0.068</td+	    ><td class="numericData" style="color: #bd421f"+	    >0.950</td+	    ><td class="numericData" style="color: #086aad"+	    >0.150</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td+	    ><td class="numericData" style="color: #194abb"+	    >0.071</td+	    ><td class="numericData" style="color: #b3600c"+	    >0.875</td+	    ><td class="numericData" style="color: #00839b"+	    >0.217</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td+	    ><td class="numericData" style="color: #164fba"+	    >0.084</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td+	    ><td class="numericData" style="color: #1f42bd"+	    >0.050</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e"+	    >0.996</td+	    ><td class="numericData" style="color: #2c33bf"+	    >0.011</td+	    ><td class="numericData" style="color: #be3d23"+	    >0.963</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="evolutionStrategyStatisticsTable"+	><tr+	  ><th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where a Variable number of Scouts were Dispatched.</th+	    ></tr+	  ><tr id="timetableCriteriaWeights"+	  ><th colspan="7"+	    >Timetable-criteria Weights&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #2f30c0" title="maximiseComplianceWithFreePeriodPreferences"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #2f30c0" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td+	    ><td class="numericData" style="color: #009090" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.250</td+	    ><td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td+	    ><td class="numericData" style="color: #0c60b3" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.125</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr id="bestDeterministicWeightedTimetableCriteria"+	  ><th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #909000" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.750</td+	    ><td class="numericData" style="color: #5fb30c" title="maximiseMeanStudentClassSize"+	    >0.625</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #64b00a" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.637</td+	    ><td class="numericData" style="color: #6aad08" title="minimiseDispersionOfTeacherWorkload"+	    >0.650</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #7aa202" title="minimiseMeanLocationChangesOfTeachers"+	    >0.692</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th+	    ><th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th+	    ><th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th+	    ><th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th+	    ></tr+	  ><tr+	  ><th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th+	    ><th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th+	    ><th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th+	    ><th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="1" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >16</td+	    ><td class="numericData"+	    >3</td+	    ><td class="numericData" style="color: #b85313"+	    >0.906</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.222%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #909000" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.750</td+	    ><td class="numericData" style="color: #5fb30c" title="maximiseMeanStudentClassSize"+	    >0.625</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #48bc1b" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.565</td+	    ><td class="numericData" style="color: #6aad08" title="minimiseDispersionOfTeacherWorkload"+	    >0.650</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #a67504" title="minimiseMeanLocationChangesOfTeachers"+	    >0.821</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><th title="The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable." colspan="7"+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #24be3c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >-0.002</td+	    ><td class="numericData" style="color: #30c030" title="minimiseDispersionOfTeacherWorkload"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #47bc1b" title="minimiseMeanLocationChangesOfTeachers"+	    >0.008</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ></table+	></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button+      ><h2 title="From the perspective of each student-body."+      >By Student-body</h2+      ><div id="studentViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><div class="warning"+	  ><dl+	    ><dt+	      ><span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ></dl+	    ></div+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+		>Body_01</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+		>Body_02</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each teacher."+      >By Teacher-id</h2+      ><div style="display: none" id="teacherViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >25</span+	      ></dd+	    ><dt+	    ><span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >3.750</span+	      ></dd+	    ><dt+	    ><span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span+	      ></dt+	    ><dd+	    ><span class="data"+	      >(&quot;NuttHazel&quot;,&quot;MasseyHugh&quot;)</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>AtrickJerry</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>BannJoe</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>EasterleyGale</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>InnoveraMarge</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >44</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >5</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>MasseyHugh</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >57</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>NuttHazel</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>TheronLou</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each location."+      >By Location-id</h2+      ><div style="display: none" id="locationViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >46</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >10</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #bdca46; background-color: #4235b9" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >10</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #84352d; background-color: #7bcad2" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #296edf; background-color: #d69120" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #645bbf; background-color: #9ba440" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #47dcbd; background-color: #b82342" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" style="color: #50ae99; background-color: #af5166" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ></body+  ></html+>+
+ xhtml/timetable_03.xhtml view
@@ -0,0 +1,3851 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"+><head+  ><meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title+    ></head+  ><body+  ><h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_03.xml' --outputStudentViewTimetable='xml/studentViewTimetable_03.xml'</h1+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="Runtime-information."+      >Runtime-information</h2+      ><div style="display: none" id="consoleOutput"+      ><ul+	><li+	  ><p class="warning"+	    >WARNING:	The following timetable-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;maximiseComplianceWithFreePeriodPreferences&quot;, &quot;minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest&quot;.</p+	    ></li+	  ></ul+	><table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	><tr+	  ><th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th+	    ></tr+	  ><tr+	  ><th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th+	    ><th title="Weighted Mean over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.919</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.919</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b85313"+	    >0.906</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b85313"+	    >0.906</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b85313"+	    >0.906</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b85313"+	    >0.906</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ba4d17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.889</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.888</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.890</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #ba4d17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ba4f16"+	    >0.917</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.919</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b95015"+	    >0.914</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b95015"+	    >0.914</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b95015"+	    >0.914</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b95015"+	    >0.914</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b95015"+	    >0.914</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.886</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.886</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.886</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b95015"+	    >0.914</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.886</td+	    ></tr+	  ><tr id="selectedRaster" title="Selected Raster-scan."+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ba4d17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4e16"+	    >0.918</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.889</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.888</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.890</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ba4d17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #ba4e17"+	    >0.920</td+	    ></tr+	  ><tr+	  ><th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><td class="numericData" style="color: #b95114"+	    >0.911</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable"+	><tr+	  ><th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th+	    ></tr+	  ><tr+	  ><th rowspan="2"+	    >Name</th+	    ><th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th+	    ><th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th+	    ></tr+	  ><tr+	  ><th title="The mean value"+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th title="The standard deviation."+	    ><abbr title="sigma"+	      >&sigma;</abbr+	      ></th+	    ><th title="The minimum value."+	    >Min.</th+	    ><th title="The maximum value."+	    >Max.</th+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >areResourcesReused</td+	    ><td class="numericData" style="color: #1058b6"+	    >0.107</td+	    ><td class="numericData" style="color: #0473a7"+	    >0.174</td+	    ><td class="numericData" style="color: #0db35e"+	    >0.379</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td+	    ><td class="numericData" style="color: #2936bf"+	    >0.018</td+	    ><td class="numericData" style="color: #2837bf"+	    >0.022</td+	    ><td class="numericData" style="color: #1156b7"+	    >0.102</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td+	    ><td class="numericData" style="color: #243cbf"+	    >0.034</td+	    ><td class="numericData" style="color: #20be41"+	    >0.451</td+	    ><td class="numericData" style="color: #076bac"+	    >0.153</td+	    ><td class="numericData" style="color: #027da0"+	    >0.200</td+	    ><td class="numericData" style="color: #909000"+	    >0.750</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td+	    ><td class="numericData" style="color: #2b34bf"+	    >0.014</td+	    ><td class="numericData" style="color: #b2620b"+	    >0.870</td+	    ><td class="numericData" style="color: #06aa6f"+	    >0.337</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isSpecialistInTopic</td+	    ><td class="numericData" style="color: #2b34bf"+	    >0.013</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td+	    ><td class="numericData" style="color: #263abf"+	    >0.029</td+	    ><td class="numericData" style="color: #31bf2e"+	    >0.504</td+	    ><td class="numericData" style="color: #2937bf"+	    >0.020</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #55b712"+	    >0.600</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.008</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #0966af"+	    >0.141</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td+	    ><td class="numericData" style="color: #2936bf"+	    >0.020</td+	    ><td class="numericData" style="color: #b95015"+	    >0.913</td+	    ><td class="numericData" style="color: #0379a3"+	    >0.190</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td+	    ><td class="numericData" style="color: #1c47bc"+	    >0.062</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #0966af"+	    >0.141</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td+	    ><td class="numericData" style="color: #1a4abb"+	    >0.070</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td+	    ><td class="numericData" style="color: #243cbe"+	    >0.035</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #017f9f"+	    >0.204</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.006</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f"+	    >0.998</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.007</td+	    ><td class="numericData" style="color: #bf3927"+	    >0.974</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="evolutionStrategyStatisticsTable"+	><tr+	  ><th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where <span class="numericData"+	      >2</span+	      > initial Scouts were Dispatched.</th+	    ></tr+	  ><tr id="timetableCriteriaWeights"+	  ><th colspan="7"+	    >timetable-criteria Weights&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #2f30c0" title="maximiseComplianceWithFreePeriodPreferences"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #2f30c0" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td+	    ><td class="numericData" style="color: #009090" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.250</td+	    ><td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td+	    ><td class="numericData" style="color: #0c60b3" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.125</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.250</td+	    ></tr+	  ><tr id="bestDeterministicWeightedTimetableCriteria"+	  ><th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #a07d02" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.800</td+	    ><td class="numericData" style="color: #55b712" title="maximiseMeanStudentClassSize"+	    >0.600</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #75a504" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.680</td+	    ><td class="numericData" style="color: #849a00" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.719</td+	    ><td class="numericData" style="color: #70a905" title="minimiseDispersionOfTeacherWorkload"+	    >0.666</td+	    ><td class="numericData" style="color: #b95214" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.909</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.788</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th+	    ><th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th+	    ><th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th+	    ><th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th+	    ></tr+	  ><tr+	  ><th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th+	    ><th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th+	    ><th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th+	    ><th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >6</td+	    ><td class="numericData" style="color: #bb491a"+	    >0.930</td+	    ><td class="numericData" style="color: #2c33bf"+	    >1.109%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #a07d02" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.800</td+	    ><td class="numericData" style="color: #55b712" title="maximiseMeanStudentClassSize"+	    >0.600</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #37bf29" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.520</td+	    ><td class="numericData" style="color: #809e01" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.707</td+	    ><td class="numericData" style="color: #70a905" title="minimiseDispersionOfTeacherWorkload"+	    >0.666</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #a77304" title="minimiseMeanLocationChangesOfTeachers"+	    >0.825</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(splitSessionMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><th title="The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable." colspan="7"+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #17ba4e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >-0.005</td+	    ><td class="numericData" style="color: #2dbf32" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >-0.000</td+	    ><td class="numericData" style="color: #30c030" title="minimiseDispersionOfTeacherWorkload"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #40be21" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.045</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #36bf29" title="minimiseMeanLocationChangesOfTeachers"+	    >0.002</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button+      ><h2 title="From the perspective of each student-body."+      >By Student-body</h2+      ><div id="studentViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><div class="warning"+	  ><dl+	    ><dt+	      ><span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ></dl+	    ></div+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+		>Body_01</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>WallCathR</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>WallCathR</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+		>Body_02</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each teacher."+      >By Teacher-id</h2+      ><div style="display: none" id="teacherViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >68</span+	      ></dd+	    ><dt+	    ><span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >3.600</span+	      ></dd+	    ><dt+	    ><span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span+	      ></dt+	    ><dd+	    ><span class="data"+	      >(&quot;IronsRusty&quot;,&quot;EasterleyGale&quot;)</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>AtrickJerry</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>EasterleyGale</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >38</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>InnoveraMarge</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >23</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >10</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>IronsRusty</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>MasseyHugh</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >27</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>NuttHazel</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>ShoeiJim</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>TheronLou</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>WallCathR</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each location."+      >By Location-id</h2+      ><div style="display: none" id="locationViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >103</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>ChemistryLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >13</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Chemistry-lab&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >17</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>Gym</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >13</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Gym-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >13</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >19</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>WallCathR</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>WallCathR</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ></body+  ></html+>+
+ xhtml/timetable_05.xhtml view
@@ -0,0 +1,13807 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"+><head+  ><meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title+    ></head+  ><body+  ><h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_05.xml' --outputStudentViewTimetable='xml/studentViewTimetable_05.xml'</h1+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="Runtime-information."+      >Runtime-information</h2+      ><div style="display: none" id="consoleOutput"+      ><ul+	><li+	  ><p class="warning"+	    >WARNING:	The following timetable-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;maximiseComplianceWithFreePeriodPreferences&quot;, &quot;maximiseSynchronisationOfSynchronisedCourses&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	The following evolution-strategies are inappropriate for the specified problem-parameters, &amp; consequently their fecundities have been zeroed; &quot;synchronisedCourseMutation&quot;, &quot;synchronisedCourseByDayMutation&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	those groups to which neither student-bodies nor teachers have subscribed, have been removed from the group-catalogue; &quot;Christians&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	those groups for which zero meetings have been scheduled, have been removed from the group-catalogue; &quot;Musicians&quot;, &quot;Sport-teachers&quot;.</p+	    ></li+	  ></ul+	><table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	><tr+	  ><th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th+	    ></tr+	  ><tr+	  ><th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th+	    ><th title="Weighted Mean over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b0650a"+	    >0.860</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b0650a"+	    >0.862</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b0640a"+	    >0.863</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #af6709"+	    >0.856</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b0650a"+	    >0.862</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #af6609"+	    >0.859</td+	    ></tr+	  ><tr id="selectedRaster" title="Selected Raster-scan."+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b65910"+	    >0.891</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b1620b"+	    >0.868</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ac6c07"+	    >0.844</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ad6a08"+	    >0.849</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ab6d06"+	    >0.840</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #a97105"+	    >0.832</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #a87205"+	    >0.830</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ab6e06"+	    >0.840</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #af6709"+	    >0.857</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #ab6d07"+	    >0.842</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ad6908"+	    >0.851</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ac6b07"+	    >0.847</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ad6b07"+	    >0.847</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #ac6c07"+	    >0.845</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.835</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.837</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #aa6e06"+	    >0.839</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #aa6e06"+	    >0.838</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ad6a08"+	    >0.848</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b3600c"+	    >0.875</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #ae6809"+	    >0.855</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #ae6808"+	    >0.853</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b1640a"+	    >0.865</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b1630b"+	    >0.866</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b1630b"+	    >0.865</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b2620b"+	    >0.870</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.836</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #ab6d07"+	    >0.842</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ab6d06"+	    >0.840</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.836</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.836</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a97006"+	    >0.835</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ac6b07"+	    >0.846</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #a97006"+	    >0.835</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b1630b"+	    >0.867</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b2620b"+	    >0.870</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a97005"+	    >0.835</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #a87205"+	    >0.830</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #af6609"+	    >0.858</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #af6709"+	    >0.856</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a97005"+	    >0.833</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.836</td+	    ></tr+	  ><tr+	  ><th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><td class="numericData" style="color: #ad6a08"+	    >0.850</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable"+	><tr+	  ><th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th+	    ></tr+	  ><tr+	  ><th rowspan="2"+	    >Name</th+	    ><th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th+	    ><th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th+	    ></tr+	  ><tr+	  ><th title="The mean value"+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th title="The standard deviation."+	    ><abbr title="sigma"+	      >&sigma;</abbr+	      ></th+	    ><th title="The minimum value."+	    >Min.</th+	    ><th title="The maximum value."+	    >Max.</th+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >areResourcesReused</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.003</td+	    ><td class="numericData" style="color: #05a970"+	    >0.333</td+	    ><td class="numericData" style="color: #26bf3a"+	    >0.471</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td+	    ><td class="numericData" style="color: #243cbe"+	    >0.035</td+	    ><td class="numericData" style="color: #253bbf"+	    >0.033</td+	    ><td class="numericData" style="color: #1354b8"+	    >0.097</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.006</td+	    ><td class="numericData" style="color: #38bf27"+	    >0.525</td+	    ><td class="numericData" style="color: #027ba2"+	    >0.194</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.004</td+	    ><td class="numericData" style="color: #a37a02"+	    >0.810</td+	    ><td class="numericData" style="color: #10b658"+	    >0.393</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isSpecialistInTopic</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.003</td+	    ><td class="numericData" style="color: #be3f22"+	    >0.958</td+	    ><td class="numericData" style="color: #027da0"+	    >0.200</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.006</td+	    ><td class="numericData" style="color: #3fbe21"+	    >0.543</td+	    ><td class="numericData" style="color: #0b62b1"+	    >0.132</td+	    ><td class="numericData" style="color: #1ebd44"+	    >0.444</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.005</td+	    ><td class="numericData" style="color: #be4120"+	    >0.951</td+	    ><td class="numericData" style="color: #086aad"+	    >0.151</td+	    ><td class="numericData" style="color: #05a970"+	    >0.333</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3629"+	    >0.982</td+	    ><td class="numericData" style="color: #1453b8"+	    >0.093</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.005</td+	    ><td class="numericData" style="color: #bf312e"+	    >0.997</td+	    ><td class="numericData" style="color: #233dbe"+	    >0.038</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.006</td+	    ><td class="numericData" style="color: #3ebe23"+	    >0.539</td+	    ><td class="numericData" style="color: #0572a8"+	    >0.172</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td+	    ><td class="numericData" style="color: #243cbe"+	    >0.035</td+	    ><td class="numericData" style="color: #be3c24"+	    >0.964</td+	    ><td class="numericData" style="color: #0c61b2"+	    >0.129</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td+	    ><td class="numericData" style="color: #233dbe"+	    >0.038</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td+	    ><td class="numericData" style="color: #194abb"+	    >0.070</td+	    ><td class="numericData" style="color: #bf3827"+	    >0.976</td+	    ><td class="numericData" style="color: #076bad"+	    >0.152</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.008</td+	    ><td class="numericData" style="color: #bf342b"+	    >0.988</td+	    ><td class="numericData" style="color: #1059b6"+	    >0.108</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td+	    ><td class="numericData" style="color: #233dbe"+	    >0.038</td+	    ><td class="numericData" style="color: #bf302f"+	    >0.998</td+	    ><td class="numericData" style="color: #2e32bf"+	    >0.006</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="evolutionStrategyStatisticsTable"+	><tr+	  ><th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where <span class="numericData"+	      >2</span+	      > initial Scouts were Dispatched.</th+	    ></tr+	  ><tr id="timetableCriteriaWeights"+	  ><th colspan="7"+	    >timetable-criteria Weights&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #2f30c0" title="maximiseComplianceWithFreePeriodPreferences"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #253bbf" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.031</td+	    ><td class="numericData" style="color: #009090" title="maximiseMeanStudentClassSize"+	    >0.250</td+	    ><td class="numericData" style="color: #2f30c0" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.062</td+	    ><td class="numericData" style="color: #2a35bf" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.016</td+	    ><td class="numericData" style="color: #2a35bf" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.016</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td+	    ><td class="numericData" style="color: #009090" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.250</td+	    ><td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td+	    ><td class="numericData" style="color: #0c60b3" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.125</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.250</td+	    ></tr+	  ><tr id="bestDeterministicWeightedTimetableCriteria"+	  ><th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #15b950" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.414</td+	    ><td class="numericData" style="color: #0966af" title="maximiseMeanStudentClassSize"+	    >0.141</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #bf342b" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.988</td+	    ><td class="numericData" style="color: #bc461c" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.939</td+	    ><td class="numericData" style="color: #a57603" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.819</td+	    ><td class="numericData" style="color: #8e9100" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.745</td+	    ><td class="numericData" style="color: #64b00a" title="minimiseDispersionOfTeacherWorkload"+	    >0.636</td+	    ><td class="numericData" style="color: #bd421f" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.949</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #978800" title="minimiseMeanLocationChangesOfTeachers"+	    >0.772</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #bf3926" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.973</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #b65811" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.894</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.992</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th+	    ><th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th+	    ><th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th+	    ><th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th+	    ></tr+	  ><tr+	  ><th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th+	    ><th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th+	    ><th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th+	    ><th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >16</td+	    ><td class="numericData" style="color: #b95015"+	    >0.915</td+	    ><td class="numericData" style="color: #2739bf"+	    >2.694%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #12b854" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.402</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.136</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bc491a" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.932</td+	    ><td class="numericData" style="color: #a67504" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.821</td+	    ><td class="numericData" style="color: #859900" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.721</td+	    ><td class="numericData" style="color: #53b813" title="minimiseDispersionOfTeacherWorkload"+	    >0.594</td+	    ><td class="numericData" style="color: #bd451d" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.942</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9e7f01" title="minimiseMeanLocationChangesOfTeachers"+	    >0.794</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.997</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >2</td+	    ><td class="numericData" style="color: #b95015"+	    >0.915</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.005%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #11b756" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.397</td+	    ><td class="numericData" style="color: #0a63b1" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bc491a" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.932</td+	    ><td class="numericData" style="color: #a47703" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.815</td+	    ><td class="numericData" style="color: #899600" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.732</td+	    ><td class="numericData" style="color: #5fb30c" title="minimiseDispersionOfTeacherWorkload"+	    >0.625</td+	    ><td class="numericData" style="color: #bd451d" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.942</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.787</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.997</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="1" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >64</td+	    ><td class="numericData"+	    >1</td+	    ><td class="numericData" style="color: #b95015"+	    >0.915</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.003%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #11b756" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.397</td+	    ><td class="numericData" style="color: #0a63b1" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bc491a" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.932</td+	    ><td class="numericData" style="color: #a47703" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.815</td+	    ><td class="numericData" style="color: #8c9300" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.739</td+	    ><td class="numericData" style="color: #5fb30c" title="minimiseDispersionOfTeacherWorkload"+	    >0.625</td+	    ><td class="numericData" style="color: #bd451d" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.942</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.787</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.997</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >6</td+	    ><td class="numericData" style="color: #ba4f16"+	    >0.915</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.064%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #11b756" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.397</td+	    ><td class="numericData" style="color: #0a63b1" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bc491a" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.932</td+	    ><td class="numericData" style="color: #a67404" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.823</td+	    ><td class="numericData" style="color: #899600" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.732</td+	    ><td class="numericData" style="color: #5fb30c" title="minimiseDispersionOfTeacherWorkload"+	    >0.625</td+	    ><td class="numericData" style="color: #bd431e" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.947</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.787</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.997</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >128</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >4</td+	    ><td class="numericData" style="color: #ba4f16"+	    >0.915</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.017%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #13b854" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.404</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.136</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bc491a" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.932</td+	    ><td class="numericData" style="color: #a47703" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.815</td+	    ><td class="numericData" style="color: #879700" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.727</td+	    ><td class="numericData" style="color: #64b00a" title="minimiseDispersionOfTeacherWorkload"+	    >0.636</td+	    ><td class="numericData" style="color: #bd431e" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.947</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.787</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.997</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >1</td+	    ><td class="numericData" style="color: #ba4f16"+	    >0.915</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.004%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #13b854" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.404</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.136</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bc491a" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.932</td+	    ><td class="numericData" style="color: #a27a02" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.809</td+	    ><td class="numericData" style="color: #8d9200" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.742</td+	    ><td class="numericData" style="color: #64b00a" title="minimiseDispersionOfTeacherWorkload"+	    >0.636</td+	    ><td class="numericData" style="color: #bd431e" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.947</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.787</td+	    ><td class="numericData" style="color: #26bf3a" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.471</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.997</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(splitSessionMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >256</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><th title="The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable." colspan="7"+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #2ebf31" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >-0.000</td+	    ><td class="numericData" style="color: #2fbf30" title="maximiseMeanStudentClassSize"+	    >-0.001</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #32bf2d" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.006</td+	    ><td class="numericData" style="color: #2ebf31" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >-0.000</td+	    ><td class="numericData" style="color: #2ebf31" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >-0.000</td+	    ><td class="numericData" style="color: #2fbf30" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >-0.000</td+	    ><td class="numericData" style="color: #30bf2f" title="minimiseDispersionOfTeacherWorkload"+	    >0.000</td+	    ><td class="numericData" style="color: #2fbf30" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >-0.001</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #32bf2d" title="minimiseMeanLocationChangesOfTeachers"+	    >0.001</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #34bf2b" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.013</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #43bd1e" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.079</td+	    ><td class="numericData" style="color: #30bf2f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.001</td+	    ><td class="numericData" style="color: #30c030" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button+      ><h2 title="From the perspective of each student-body."+      >By Student-body</h2+      ><div id="studentViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><div class="warning"+	  ><dl+	    ><dt+	      ><span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ></dl+	    ></div+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+		>Body_01</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+		>Body_02</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+		>Body_03</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="4"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BaptistAnna</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;DaySonny&quot;"+		>Body_04</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>, <span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;EsterPolly&quot;"+		>Body_05</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>, <span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+		>Body_06</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+		>Body_07</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;LottMona&quot;"+		>Body_08</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BaptistAnna</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>, <span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;PipeDwain&quot;"+		>Body_09</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+		>Body_10</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;ShawRick&quot;"+		>Body_11</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each teacher."+      >By Teacher-id</h2+      ><div style="display: none" id="teacherViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >160</span+	      ></dd+	    ><dt+	    ><span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >2.718</span+	      ></dd+	    ><dt+	    ><span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span+	      ></dt+	    ><dd+	    ><span class="data"+	      >(&quot;ShoeiJim&quot;,&quot;IronsRusty&quot;)</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>AnderCorrie</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>AtrickJerry</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>BannJoe</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>BaptistAnna</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>EasterleyGale</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >70</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>InnoveraMarge</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >42</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >14</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>IronsRusty</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >74</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>, <span class="teacherId" title="teacherId"+			>PoleDi</span+			>, <span class="teacherId" title="teacherId"+			>PooleJean</span+			>, <span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>LynMandy</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >30</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="2"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>LyonDanD</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >65</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>MasseyHugh</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >61</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>, <span class="teacherId" title="teacherId"+			>PoleDi</span+			>, <span class="teacherId" title="teacherId"+			>PooleJean</span+			>, <span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>NuttHazel</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>PaineJock</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>PoleDi</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>, <span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>, <span class="teacherId" title="teacherId"+			>PooleJean</span+			>, <span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>PooleJean</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >61</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>, <span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>, <span class="teacherId" title="teacherId"+			>PoleDi</span+			>, <span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>ShoeiJim</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >18</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>SteinFrankN</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >14</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>, <span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>, <span class="teacherId" title="teacherId"+			>PoleDi</span+			>, <span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>TheronLou</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >38</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >5</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>BaptistAnna</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each location."+      >By Location-id</h2+      ><div style="display: none" id="locationViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >324</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>AssemblyHall</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Lectern&quot;</li+		  ><li+		  >&quot;Pipe-organ&quot;</li+		  ><li+		  >&quot;Seats&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;PipeDwain&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AtrickJerry</span+			>, <span class="teacherId" title="teacherId"+			>BannJoe</span+			>, <span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiologyLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >21</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>SteinFrankN</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiologyLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >14</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PooleJean</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>ChemistryLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Chemistry-lab&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>IronsRusty</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >19</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >32</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>TheronLou</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_3</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LyonDanD</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_4</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>GamesField</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Goal-posts&quot;</li+		  ><li+		  >&quot;Running-track&quot;</li+		  ><li+		  >&quot;Showers&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>Gym</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Gym-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>ShoeiJim</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PaineJock</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >19</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>AnderCorrie</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >17</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>NuttHazel</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >29</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;GunnTommy&quot;, &quot;PostMark&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;PoleLou&quot;, &quot;PottJack&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BannJoe</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;ShawRick&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >32</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;ForestWoody&quot;, &quot;HareLotta&quot;, &quot;LearSandy&quot;"+			  >Body_06</span+			  >, <span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>LynMandy</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;DaySonny&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;EsterPolly&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;LottMona&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>EasterleyGale</span+			>, <span class="teacherId" title="teacherId"+			>InnoveraMarge</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BushRose&quot;, &quot;PondLilly&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BaptistAnna</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BodyAnnie&quot;, &quot;BoyleLance&quot;, &quot;SpencerMarkN&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;LottMona&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>BaptistAnna</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;BallsHarry&quot;, &quot;BoardBill&quot;, &quot;BullTerry&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>PoleDi</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >14</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;ShawRick&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;PipeDwain&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;DaySonny&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;EsterPolly&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>MasseyHugh</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ></body+  ></html+>+
+ xhtml/timetable_05_1.xhtml view
@@ -0,0 +1,4901 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"+><head+  ><meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title+    ></head+  ><body+  ><h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_05_1.xml' --outputStudentViewTimetable='xml/studentViewTimetable_05_1.xml'</h1+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="Runtime-information."+      >Runtime-information</h2+      ><div style="display: none" id="consoleOutput"+      ><ul+	><li+	  ><p class="warning"+	    >WARNING:	the following lesson-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;matchCourseClassSizeToLocationCapacity&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	the following timetable-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;maximiseComplianceWithFreePeriodPreferences&quot;, &quot;minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	time-slots have been requested by teachers, but the weight assigned to the lesson-criterion &quot;minimiseBookingAtAnotherCoursesSpecifiedTime&quot; is zero.</p+	    ></li+	  ></ul+	><table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	><tr+	  ><th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th+	    ></tr+	  ><tr+	  ><th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th+	    ><th title="Weighted Mean over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ab6d06"+	    >0.840</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b45d0e"+	    >0.882</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b45d0e"+	    >0.882</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ad6a08"+	    >0.849</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.887</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b65810"+	    >0.894</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b65810"+	    >0.894</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ab6d06"+	    >0.840</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ab6d06"+	    >0.840</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.885</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.885</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.890</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.890</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b45d0e"+	    >0.882</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b45d0e"+	    >0.882</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a67404"+	    >0.824</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55b0f"+	    >0.887</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b45d0e"+	    >0.882</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b45c0e"+	    >0.883</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a57603"+	    >0.818</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.888</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ab6d07"+	    >0.842</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b65910"+	    >0.891</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b45d0e"+	    >0.882</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b45c0e"+	    >0.883</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #a87205"+	    >0.829</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b65711"+	    >0.896</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ab6d07"+	    >0.842</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a97005"+	    >0.834</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ab6d07"+	    >0.842</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #ad6908"+	    >0.850</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #ad6908"+	    >0.850</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.888</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a97005"+	    >0.834</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.888</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b65810"+	    >0.894</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b65810"+	    >0.894</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a97105"+	    >0.832</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b55a0f"+	    >0.890</td+	    ></tr+	  ><tr id="selectedRaster" title="Selected Raster-scan."+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #b65711"+	    >0.896</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #ab6d07"+	    >0.842</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #b65910"+	    >0.892</td+	    ></tr+	  ><tr+	  ><th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable"+	><tr+	  ><th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th+	    ></tr+	  ><tr+	  ><th rowspan="2"+	    >Name</th+	    ><th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th+	    ><th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th+	    ></tr+	  ><tr+	  ><th title="The mean value"+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th title="The standard deviation."+	    ><abbr title="sigma"+	      >&sigma;</abbr+	      ></th+	    ><th title="The minimum value."+	    >Min.</th+	    ><th title="The maximum value."+	    >Max.</th+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >areResourcesReused</td+	    ><td class="numericData" style="color: #1f42bd"+	    >0.050</td+	    ><td class="numericData" style="color: #17ba4d"+	    >0.421</td+	    ><td class="numericData" style="color: #2dbf32"+	    >0.494</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td+	    ><td class="numericData" style="color: #0473a7"+	    >0.175</td+	    ><td class="numericData" style="color: #2739bf"+	    >0.026</td+	    ><td class="numericData" style="color: #184cbb"+	    >0.077</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td+	    ><td class="numericData" style="color: #223ebe"+	    >0.040</td+	    ><td class="numericData" style="color: #40be20"+	    >0.546</td+	    ><td class="numericData" style="color: #066faa"+	    >0.163</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.800</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #0b62b1"+	    >0.132</td+	    ><td class="numericData" style="color: #0c5fb3"+	    >0.125</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isSpecialistInTopic</td+	    ><td class="numericData" style="color: #1255b7"+	    >0.099</td+	    ><td class="numericData" style="color: #4dba17"+	    >0.579</td+	    ><td class="numericData" style="color: #2dbf32"+	    >0.494</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td+	    ><td class="numericData" style="color: #2c33bf"+	    >0.010</td+	    ><td class="numericData" style="color: #b2610b"+	    >0.871</td+	    ><td class="numericData" style="color: #0868ae"+	    >0.146</td+	    ><td class="numericData" style="color: #70a905"+	    >0.667</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td+	    ><td class="numericData" style="color: #2837bf"+	    >0.021</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td+	    ><td class="numericData" style="color: #0c60b2"+	    >0.126</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #008896"+	    >0.229</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td+	    ><td class="numericData" style="color: #008a95"+	    >0.234</td+	    ><td class="numericData" style="color: #b65811"+	    >0.895</td+	    ><td class="numericData" style="color: #02a27b"+	    >0.307</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td+	    ><td class="numericData" style="color: #1a49bc"+	    >0.069</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td+	    ><td class="numericData" style="color: #03a577"+	    >0.317</td+	    ><td class="numericData" style="color: #bf332c"+	    >0.991</td+	    ><td class="numericData" style="color: #2c33bf"+	    >0.010</td+	    ><td class="numericData" style="color: #bf3828"+	    >0.977</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="evolutionStrategyStatisticsTable"+	><tr+	  ><th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where a Variable number of Scouts were Dispatched.</th+	    ></tr+	  ><tr id="timetableCriteriaWeights"+	  ><th colspan="7"+	    >Timetable-criteria Weights&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #2f30c0" title="maximiseComplianceWithFreePeriodPreferences"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td+	    ><td class="numericData" style="color: #0c60b3" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.125</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfStudentFreePeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherFreePeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td+	    ><td class="numericData" style="color: #2f30c0" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td+	    ><td class="numericData" style="color: #0c60b3" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.125</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.250</td+	    ></tr+	  ><tr id="bestDeterministicWeightedTimetableCriteria"+	  ><th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #27bf38" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.476</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #b3600c" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.875</td+	    ><td class="numericData" style="color: #a27a02" title="minimiseDispersionOfStudentFreePeriodsPerDay"+	    >0.808</td+	    ><td class="numericData" style="color: #a07d02" title="minimiseDispersionOfTeacherFreePeriodsPerDay"+	    >0.802</td+	    ><td class="numericData" style="color: #9f7e01" title="minimiseDispersionOfTeacherWorkload"+	    >0.797</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #76a503" title="minimiseMeanLocationChangesOfTeachers"+	    >0.682</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th+	    ><th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th+	    ><th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th+	    ><th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th+	    ></tr+	  ><tr+	  ><th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th+	    ><th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th+	    ><th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th+	    ><th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >synchronisedCourseMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="1" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >128</td+	    ><td class="numericData"+	    >4</td+	    ><td class="numericData" style="color: #b75512"+	    >0.901</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.587%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #27bf38" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.476</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #a27a02" title="minimiseDispersionOfStudentFreePeriodsPerDay"+	    >0.808</td+	    ><td class="numericData" style="color: #a07d02" title="minimiseDispersionOfTeacherFreePeriodsPerDay"+	    >0.802</td+	    ><td class="numericData" style="color: #9f7e01" title="minimiseDispersionOfTeacherWorkload"+	    >0.797</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #889600" title="minimiseMeanLocationChangesOfTeachers"+	    >0.729</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(synchronisedCourseByDayMutation . synchronousLessonMutation)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >362</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >362</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >362</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >362</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >synchronisedCourseMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(synchronisedCourseByDayMutation . synchronousLessonMutation)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(splitSessionMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><th title="The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable." colspan="7"+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #47bc1c" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.016</td+	    ><td class="numericData" style="color: #30c030" title="minimiseDispersionOfStudentFreePeriodsPerDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseDispersionOfTeacherFreePeriodsPerDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseDispersionOfTeacherWorkload"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #38bf28" title="minimiseMeanLocationChangesOfTeachers"+	    >0.003</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #30c030" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button+      ><h2 title="From the perspective of each student-body."+      >By Student-body</h2+      ><div id="studentViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><div class="warning"+	  ><dl+	    ><dt+	      ><span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ></dl+	    ></div+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+		>Body_1</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+		>Body_2</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Pure 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Pure 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+		>Body_3</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each teacher."+      >By Teacher-id</h2+      ><div style="display: none" id="teacherViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >36</span+	      ></dd+	    ><dt+	    ><span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >3.500</span+	      ></dd+	    ><dt+	    ><span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span+	      ></dt+	    ><dd+	    ><span class="data"+	      >(&quot;Teacher_05&quot;,&quot;Teacher_01&quot;)</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_01</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >67</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >5</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_02</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >53</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Pure 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Pure 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_03</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >53</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >7</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_04</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >9</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiochemLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_05</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each location."+      >By Location-id</h2+      ><div style="display: none" id="locationViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >134</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiochemLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >19</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Chemistry-lab&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >31</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>DiningHall</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >30</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Seats&quot;</li+		  ><li+		  >&quot;Tables&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			>Body_1</span+			>, <span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			>Body_2</span+			>, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			>Body_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >17</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Pure 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Pure 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0&quot;, &quot;Student_2.1&quot;, &quot;Student_2.2&quot;"+			  >Body_2</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >17</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Maths</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >Applied 1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  >, <span class="studentBody" title="&quot;Student_3.0&quot;, &quot;Student_3.1&quot;"+			  >Body_3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics streams</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0&quot;, &quot;Student_1.1&quot;"+			  >Body_1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ></body+  ></html+>+
+ xhtml/timetable_08.xhtml view
@@ -0,0 +1,19925 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"+><head+  ><meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title+    ></head+  ><body+  ><h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_08.xml' --outputStudentViewTimetable='xml/studentViewTimetable_08.xml'</h1+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="Runtime-information."+      >Runtime-information</h2+      ><div style="display: none" id="consoleOutput"+      ><ul+	><li+	  ><p class="warning"+	    >WARNING:	the following timetable-criteria are inappropriate for the specified problem-parameters, &amp; consequently their weights have been zeroed; &quot;maximiseComplianceWithFreePeriodPreferences&quot;.</p+	    ></li+	  ><li+	  ><p class="warning"+	    >WARNING:	those groups for which zero meetings have been scheduled, have been removed from the group-catalogue; &quot;Musicians&quot;, &quot;Sport-teachers&quot;.</p+	    ></li+	  ></ul+	><table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	><tr+	  ><th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th+	    ></tr+	  ><tr+	  ><th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th+	    ><th title="Weighted Mean over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #889600"+	    >0.730</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #928d00"+	    >0.756</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #968900"+	    >0.768</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #8e9100"+	    >0.746</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #8b9400"+	    >0.737</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #978800"+	    >0.772</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9e8001"+	    >0.794</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.783</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #8e9100"+	    >0.745</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #948b00"+	    >0.763</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #889600"+	    >0.730</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #889600"+	    >0.730</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #8f9000"+	    >0.748</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #958a00"+	    >0.766</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #968800"+	    >0.770</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.781</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #938c00"+	    >0.759</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #928d00"+	    >0.756</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #938c00"+	    >0.760</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #908f00"+	    >0.751</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.805</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #8d9200"+	    >0.743</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #8e9100"+	    >0.746</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #8f9000"+	    >0.750</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #968900"+	    >0.768</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9e8001"+	    >0.793</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.801</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #9b8301"+	    >0.785</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #8f9000"+	    >0.749</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #968900"+	    >0.769</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a27a02"+	    >0.807</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #9e7f01"+	    >0.794</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #948b00"+	    >0.763</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #988700"+	    >0.774</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #8e9100"+	    >0.746</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #8b9400"+	    >0.738</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #879800"+	    >0.726</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #8f9000"+	    >0.749</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #918e00"+	    >0.754</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9a8500"+	    >0.780</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.783</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #998500"+	    >0.780</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.786</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #918e00"+	    >0.754</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.806</td+	    ></tr+	  ><tr id="selectedRaster" title="Selected Raster-scan."+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #a37903"+	    >0.811</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9b8301"+	    >0.786</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #908f00"+	    >0.751</td+	    ></tr+	  ><tr+	  ><th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><td class="numericData" style="color: #958a00"+	    >0.765</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable"+	><tr+	  ><th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th+	    ></tr+	  ><tr+	  ><th rowspan="2"+	    >Name</th+	    ><th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th+	    ><th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th+	    ></tr+	  ><tr+	  ><th title="The mean value"+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th title="The standard deviation."+	    ><abbr title="sigma"+	      >&sigma;</abbr+	      ></th+	    ><th title="The minimum value."+	    >Min.</th+	    ><th title="The maximum value."+	    >Max.</th+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >areResourcesReused</td+	    ><td class="numericData" style="color: #2c33bf"+	    >0.010</td+	    ><td class="numericData" style="color: #0bb162"+	    >0.368</td+	    ><td class="numericData" style="color: #29bf36"+	    >0.482</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td+	    ><td class="numericData" style="color: #184cbb"+	    >0.075</td+	    ><td class="numericData" style="color: #2a35bf"+	    >0.016</td+	    ><td class="numericData" style="color: #1e43bd"+	    >0.053</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #019b83"+	    >0.286</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.008</td+	    ><td class="numericData" style="color: #938c00"+	    >0.761</td+	    ><td class="numericData" style="color: #00928d"+	    >0.258</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td+	    ><td class="numericData" style="color: #00958a"+	    >0.265</td+	    ><td class="numericData" style="color: #2c33bf"+	    >0.010</td+	    ><td class="numericData" style="color: #2838bf"+	    >0.023</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc"+	    >0.062</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td+	    ><td class="numericData" style="color: #2838bf"+	    >0.023</td+	    ><td class="numericData" style="color: #aa6f06"+	    >0.837</td+	    ><td class="numericData" style="color: #0bb162"+	    >0.369</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isSpecialistInTopic</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.002</td+	    ><td class="numericData" style="color: #be3d23"+	    >0.962</td+	    ><td class="numericData" style="color: #027aa2"+	    >0.192</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td+	    ><td class="numericData" style="color: #2c33bf"+	    >0.011</td+	    ><td class="numericData" style="color: #38bf28"+	    >0.523</td+	    ><td class="numericData" style="color: #174eba"+	    >0.081</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #a97005"+	    >0.833</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.008</td+	    ><td class="numericData" style="color: #be3c24"+	    >0.965</td+	    ><td class="numericData" style="color: #0d5fb3"+	    >0.123</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td+	    ><td class="numericData" style="color: #027ba1"+	    >0.195</td+	    ><td class="numericData" style="color: #bf342b"+	    >0.988</td+	    ><td class="numericData" style="color: #184cbb"+	    >0.076</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.003</td+	    ><td class="numericData" style="color: #bb4a19"+	    >0.928</td+	    ><td class="numericData" style="color: #0474a7"+	    >0.175</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td+	    ><td class="numericData" style="color: #263abf"+	    >0.028</td+	    ><td class="numericData" style="color: #20be41"+	    >0.452</td+	    ><td class="numericData" style="color: #009a84"+	    >0.281</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td+	    ><td class="numericData" style="color: #1a49bc"+	    >0.068</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #0377a4"+	    >0.184</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td+	    ><td class="numericData" style="color: #223ebe"+	    >0.040</td+	    ><td class="numericData" style="color: #bf3a26"+	    >0.971</td+	    ><td class="numericData" style="color: #0e5cb4"+	    >0.116</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td+	    ><td class="numericData" style="color: #00928d"+	    >0.258</td+	    ><td class="numericData" style="color: #b1630b"+	    >0.866</td+	    ><td class="numericData" style="color: #06ab6d"+	    >0.341</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.007</td+	    ><td class="numericData" style="color: #bf332c"+	    >0.990</td+	    ><td class="numericData" style="color: #1254b8"+	    >0.097</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f"+	    >0.999</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.003</td+	    ><td class="numericData" style="color: #bf342b"+	    >0.988</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="evolutionStrategyStatisticsTable"+	><tr+	  ><th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where <span class="numericData"+	      >2</span+	      > Initial Scouts were Dispatched.</th+	    ></tr+	  ><tr id="timetableCriteriaWeights"+	  ><th colspan="7"+	    >Timetable-criteria Weights&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #2f30c0" title="maximiseComplianceWithFreePeriodPreferences"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1c47bc" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.062</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.031</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td+	    ><td class="numericData" style="color: #009090" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.250</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td+	    ><td class="numericData" style="color: #009090" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.250</td+	    ><td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.250</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.250</td+	    ></tr+	  ><tr id="bestDeterministicWeightedTimetableCriteria"+	  ><th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #04a576" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.320</td+	    ><td class="numericData" style="color: #0967af" title="maximiseMeanStudentClassSize"+	    >0.143</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a25" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.970</td+	    ><td class="numericData" style="color: #849a00" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.719</td+	    ><td class="numericData" style="color: #a87205" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.829</td+	    ><td class="numericData" style="color: #ad6a08" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.849</td+	    ><td class="numericData" style="color: #28bf38" title="minimiseDispersionOfTeacherWorkload"+	    >0.478</td+	    ><td class="numericData" style="color: #be4120" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.951</td+	    ><td class="numericData" style="color: #bf332c" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.989</td+	    ><td class="numericData" style="color: #9f7e01" title="minimiseMeanLocationChangesOfTeachers"+	    >0.797</td+	    ><td class="numericData" style="color: #26bf39" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.472</td+	    ><td class="numericData" style="color: #bf342b" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.988</td+	    ><td class="numericData" style="color: #bd431f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.948</td+	    ><td class="numericData" style="color: #73a704" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.674</td+	    ><td class="numericData" style="color: #bd421f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.950</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th+	    ><th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th+	    ><th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th+	    ><th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th+	    ></tr+	  ><tr+	  ><th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th+	    ><th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th+	    ><th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th+	    ><th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >synchronisedCourseMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >13</td+	    ><td class="numericData" style="color: #a67504"+	    >0.820</td+	    ><td class="numericData" style="color: #2c34bf"+	    >1.179%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #03a379" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.310</td+	    ><td class="numericData" style="color: #0a65b0" title="maximiseMeanStudentClassSize"+	    >0.139</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a25" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.970</td+	    ><td class="numericData" style="color: #879800" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.726</td+	    ><td class="numericData" style="color: #aa6e06" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.838</td+	    ><td class="numericData" style="color: #ad6a07" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.848</td+	    ><td class="numericData" style="color: #20be40" title="minimiseDispersionOfTeacherWorkload"+	    >0.454</td+	    ><td class="numericData" style="color: #be3f22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.958</td+	    ><td class="numericData" style="color: #bf332c" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.991</td+	    ><td class="numericData" style="color: #9d8101" title="minimiseMeanLocationChangesOfTeachers"+	    >0.790</td+	    ><td class="numericData" style="color: #26bf39" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.472</td+	    ><td class="numericData" style="color: #bf342b" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.988</td+	    ><td class="numericData" style="color: #bd431f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.948</td+	    ><td class="numericData" style="color: #8a9500" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.735</td+	    ><td class="numericData" style="color: #bd431e" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.946</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(synchronisedCourseByDayMutation . synchronousLessonMutation)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >38</td+	    ><td class="numericData" style="color: #ad6b07"+	    >0.847</td+	    ><td class="numericData" style="color: #253bbf"+	    >3.313%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #02a27a" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.307</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.137</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3629" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.982</td+	    ><td class="numericData" style="color: #77a403" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.684</td+	    ><td class="numericData" style="color: #a87205" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.829</td+	    ><td class="numericData" style="color: #ad6b07" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.847</td+	    ><td class="numericData" style="color: #11b658" title="minimiseDispersionOfTeacherWorkload"+	    >0.395</td+	    ><td class="numericData" style="color: #bf3b25" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.969</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.992</td+	    ><td class="numericData" style="color: #9e7f01" title="minimiseMeanLocationChangesOfTeachers"+	    >0.795</td+	    ><td class="numericData" style="color: #26bf39" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.472</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.993</td+	    ><td class="numericData" style="color: #bf3b24" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.967</td+	    ><td class="numericData" style="color: #b55b0f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.886</td+	    ><td class="numericData" style="color: #bd421f" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.949</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >50</td+	    ><td class="numericData" style="color: #b1630b"+	    >0.867</td+	    ><td class="numericData" style="color: #2838bf"+	    >2.336%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #019d81" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.290</td+	    ><td class="numericData" style="color: #0b62b1" title="maximiseMeanStudentClassSize"+	    >0.131</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf352a" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.984</td+	    ><td class="numericData" style="color: #839b00" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.716</td+	    ><td class="numericData" style="color: #b0650a" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.862</td+	    ><td class="numericData" style="color: #b1630a" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.865</td+	    ><td class="numericData" style="color: #24be3c" title="minimiseDispersionOfTeacherWorkload"+	    >0.464</td+	    ><td class="numericData" style="color: #bf3c24" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.966</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9c8201" title="minimiseMeanLocationChangesOfTeachers"+	    >0.787</td+	    ><td class="numericData" style="color: #2bbf35" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.486</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bd441e" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.944</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3d23" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.964</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="1" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >256</td+	    ><td class="numericData"+	    >4</td+	    ><td class="numericData" style="color: #b1620b"+	    >0.869</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.204%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #019e80" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.294</td+	    ><td class="numericData" style="color: #0a63b1" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf332c" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.990</td+	    ><td class="numericData" style="color: #859900" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.720</td+	    ><td class="numericData" style="color: #a87105" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.831</td+	    ><td class="numericData" style="color: #b2620b" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.870</td+	    ><td class="numericData" style="color: #1ebd44" title="minimiseDispersionOfTeacherWorkload"+	    >0.445</td+	    ><td class="numericData" style="color: #be3f22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.958</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9d8001" title="minimiseMeanLocationChangesOfTeachers"+	    >0.793</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3d23" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.963</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3c24" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.965</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >2</td+	    ><td class="numericData" style="color: #b1620b"+	    >0.869</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.005%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #019e80" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.294</td+	    ><td class="numericData" style="color: #0a63b1" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf332c" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.990</td+	    ><td class="numericData" style="color: #859900" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.720</td+	    ><td class="numericData" style="color: #a67504" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.822</td+	    ><td class="numericData" style="color: #b2600c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.874</td+	    ><td class="numericData" style="color: #1ebd44" title="minimiseDispersionOfTeacherWorkload"+	    >0.445</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9d8001" title="minimiseMeanLocationChangesOfTeachers"+	    >0.793</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3d23" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.963</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3c24" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.965</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >724</td+	    ><td class="numericData"+	    >2</td+	    ><td class="numericData" style="color: #b1620b"+	    >0.869</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.004%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #019e80" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.294</td+	    ><td class="numericData" style="color: #0a63b1" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf332c" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.990</td+	    ><td class="numericData" style="color: #829c01" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.713</td+	    ><td class="numericData" style="color: #a67504" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.822</td+	    ><td class="numericData" style="color: #b2600c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.874</td+	    ><td class="numericData" style="color: #1ebd44" title="minimiseDispersionOfTeacherWorkload"+	    >0.445</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9d8101" title="minimiseMeanLocationChangesOfTeachers"+	    >0.790</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3d23" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.963</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3b25" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.968</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >synchronisedCourseMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(synchronisedCourseByDayMutation . synchronousLessonMutation)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >1</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.290%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #019f7e" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.297</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #839b00" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.717</td+	    ><td class="numericData" style="color: #a57603" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.818</td+	    ><td class="numericData" style="color: #b2610c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.872</td+	    ><td class="numericData" style="color: #1bbc47" title="minimiseDispersionOfTeacherWorkload"+	    >0.436</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9d8101" title="minimiseMeanLocationChangesOfTeachers"+	    >0.790</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3f21" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.956</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >6</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.012%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #02a07d" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.299</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #7f9e01" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.706</td+	    ><td class="numericData" style="color: #ac6b07" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.845</td+	    ><td class="numericData" style="color: #ae6808" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.854</td+	    ><td class="numericData" style="color: #1bbc47" title="minimiseDispersionOfTeacherWorkload"+	    >0.436</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9d8101" title="minimiseMeanLocationChangesOfTeachers"+	    >0.790</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3e23" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.961</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.998</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >2048</td+	    ><td class="numericData"+	    >6</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.036%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #02a07d" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.299</td+	    ><td class="numericData" style="color: #0a64b0" title="maximiseMeanStudentClassSize"+	    >0.135</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #7f9e01" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.704</td+	    ><td class="numericData" style="color: #ae6809" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.855</td+	    ><td class="numericData" style="color: #af6609" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.860</td+	    ><td class="numericData" style="color: #1bbc47" title="minimiseDispersionOfTeacherWorkload"+	    >0.436</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9d8101" title="minimiseMeanLocationChangesOfTeachers"+	    >0.790</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3c24" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.965</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.998</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1448</td+	    ><td class="numericData"+	    >8</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.025%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #02a07c" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.302</td+	    ><td class="numericData" style="color: #0a65b0" title="maximiseMeanStudentClassSize"+	    >0.138</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #809e01" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.707</td+	    ><td class="numericData" style="color: #aa6f06" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.836</td+	    ><td class="numericData" style="color: #ae6809" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.854</td+	    ><td class="numericData" style="color: #33bf2c" title="minimiseDispersionOfTeacherWorkload"+	    >0.511</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9b8300" title="minimiseMeanLocationChangesOfTeachers"+	    >0.784</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3d23" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.964</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.993</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1448</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1448</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1448</td+	    ><td class="numericData"+	    >1</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.037%</td+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #02a07c" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.302</td+	    ><td class="numericData" style="color: #0a65b0" title="maximiseMeanStudentClassSize"+	    >0.138</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #8b9400" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.737</td+	    ><td class="numericData" style="color: #aa6f06" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.836</td+	    ><td class="numericData" style="color: #ae6809" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.854</td+	    ><td class="numericData" style="color: #33bf2c" title="minimiseDispersionOfTeacherWorkload"+	    >0.511</td+	    ><td class="numericData" style="color: #be3e22" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.959</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.994</td+	    ><td class="numericData" style="color: #9b8300" title="minimiseMeanLocationChangesOfTeachers"+	    >0.784</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3926" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.972</td+	    ><td class="numericData" style="color: #bf362a" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.983</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(splitSessionMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1448</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><th title="The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable." colspan="7"+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><td class="unavailable" title="Zero weight"+	    >N/A</td+	    ><td class="numericData" style="color: #2cbf33" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >-0.001</td+	    ><td class="numericData" style="color: #2fbf30" title="maximiseMeanStudentClassSize"+	    >-0.003</td+	    ><td class="numericData" style="color: #30c030" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #35bf2a" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.015</td+	    ><td class="numericData" style="color: #33bf2c" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.001</td+	    ><td class="numericData" style="color: #31bf2e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.000</td+	    ><td class="numericData" style="color: #31bf2f" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.000</td+	    ><td class="numericData" style="color: #35bf2a" title="minimiseDispersionOfTeacherWorkload"+	    >0.001</td+	    ><td class="numericData" style="color: #31bf2e" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.002</td+	    ><td class="numericData" style="color: #30bf2f" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.003</td+	    ><td class="numericData" style="color: #2dbf32" title="minimiseMeanLocationChangesOfTeachers"+	    >-0.001</td+	    ><td class="numericData" style="color: #34bf2b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.002</td+	    ><td class="numericData" style="color: #32bf2d" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.006</td+	    ><td class="numericData" style="color: #39bf27" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.013</td+	    ><td class="numericData" style="color: #6faa06" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.244</td+	    ><td class="numericData" style="color: #33bf2c" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.005</td+	    ><td class="numericData" style="color: #2dbf32" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >-0.004</td+	    ></tr+	  ></table+	></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button+      ><h2 title="From the perspective of each student-body."+      >By Student-body</h2+      ><div id="studentViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><div class="warning"+	  ><dl+	    ><dt+	      ><span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ></dl+	    ></div+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+		>Body_01</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions in the same subject, in any single day."+		>Split sessions:<ul+		  ><li+		    ><span class="subject" title="subject"+		      ><span class="topic" title="topic"+			>Maths</span+			>&nbsp;<span class="level" title="level"+			>4</span+			></span+		      >&nbsp;&Implies;&nbsp;<span class="numericData"+		      >1</span+		      ></li+		    ><li+		    ><span class="subject" title="subject"+		      ><span class="topic" title="topic"+			>Music</span+			>&nbsp;<span class="level" title="level"+			>2</span+			></span+		      >&nbsp;&Implies;&nbsp;<span class="numericData"+		      >1</span+		      ></li+		    ></ul+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+		>Body_02</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Music</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+		>Body_03</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="4"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="4"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_04.0&quot;"+		>Body_04</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions in the same subject, in any single day."+		>Split sessions:<ul+		  ><li+		    ><span class="subject" title="subject"+		      ><span class="topic" title="topic"+			>Music</span+			>&nbsp;<span class="level" title="level"+			>2</span+			></span+		      >&nbsp;&Implies;&nbsp;<span class="numericData"+		      >1</span+		      ></li+		    ></ul+		  ></div+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Biology</span+			  >&nbsp;<span class="level" title="level"+			  >4</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_05.0&quot;"+		>Body_05</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Biology</span+			  >&nbsp;<span class="level" title="level"+			  >4</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+		>Body_06</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions in the same subject, in any single day."+		>Split sessions:<ul+		  ><li+		    ><span class="subject" title="subject"+		      ><span class="topic" title="topic"+			>Maths</span+			>&nbsp;<span class="level" title="level"+			>4</span+			></span+		      >&nbsp;&Implies;&nbsp;<span class="numericData"+		      >1</span+		      ></li+		    ></ul+		  ></div+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Biology</span+			  >&nbsp;<span class="level" title="level"+			  >4</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+		>Body_07</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Biology</span+			  >&nbsp;<span class="level" title="level"+			  >4</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_08.0&quot;"+		>Body_08</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Music</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physics</span+			  >&nbsp;<span class="level" title="level"+			  >4</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_09.0&quot;"+		>Body_09</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+		>Body_10</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_11.0&quot;"+		>Body_11</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Biology</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Music</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each teacher."+      >By Teacher-id</h2+      ><div style="display: none" id="teacherViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >172</span+	      ></dd+	    ><dt+	    ><span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >2.753</span+	      ></dd+	    ><dt+	    ><span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span+	      ></dt+	    ><dd+	    ><span class="data"+	      >(&quot;Teacher_03&quot;,&quot;Teacher_07&quot;)</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_01</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_02</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >67</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >5</span+		  ></span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions of identical lessons, in any single day."+		>Split sessions:<dl+		  ><dt+		    ><div class="lesson" title="lesson"+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Music</span+			  >&nbsp;<span class="level" title="level"+			  >2</span+			  ></span+			>.<ul class="resourceIds" title="resourceIds"+			><li+			  ><span class="locationId" title="locationId"+			    >MusicRoom_1</span+			    >.</li+			  ><li+			  ><span class="studentClass" title="studentClass"+			    ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			      >Body_01</span+			      >, <span class="studentBody" title="&quot;Student_04.0&quot;"+			      >Body_04</span+			      ></span+			    >.</li+			  ></ul+			></div+		      ></dt+		    ><dd+		    ><span class="numericData"+		      >1</span+		      ></dd+		    ></dl+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_03</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >10</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >9</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_04</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >36</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_05</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >10</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_06</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_07</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >96</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions of identical lessons, in any single day."+		>Split sessions:<dl+		  ><dt+		    ><div class="lesson" title="lesson"+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >4</span+			  ></span+			>.<ul class="resourceIds" title="resourceIds"+			><li+			  ><span class="locationId" title="locationId"+			    >Classroom_4</span+			    >.</li+			  ><li+			  ><span class="studentClass" title="studentClass"+			    ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			      >Body_01</span+			      >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			      >Body_06</span+			      ></span+			    >.</li+			  ></ul+			></div+		      ></dt+		    ><dd+		    ><span class="numericData"+		      >1</span+		      ></dd+		    ></dl+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_08</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >84</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_09</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >84</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_10</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required of this teacher."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >17</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_11</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >45</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="4"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_12</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >56</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_13</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >85</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_14</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >56</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_15</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required of this teacher."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >1</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_16</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >9</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="2"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="2"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_17</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_18</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >36</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each location."+      >By Location-id</h2+      ><div style="display: none" id="locationViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >590</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>AssemblyHall</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >56</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Lectern&quot;</li+		  ><li+		  >&quot;Pipe-organ&quot;</li+		  ><li+		  >&quot;Seats&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiologyLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiologyLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >23</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>ChemistryLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >19</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Chemistry-lab&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >47</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_3</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >45</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="5"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 4</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_4</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >32</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>DiningHall</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Seats&quot;</li+		  ><li+		  >&quot;Tables&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			>Body_01</span+			>, <span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			>Body_02</span+			>, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			>Body_06</span+			>, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			>Body_07</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>, <span class="studentBody" title="&quot;Student_09.0&quot;"+			>Body_09</span+			>, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			>Body_10</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>GamesField</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >13</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Goal-posts&quot;</li+		  ><li+		  >&quot;Running-track&quot;</li+		  ><li+		  >&quot;Showers&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>Gym</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >37</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Gym-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >26</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_06.0&quot;, &quot;Student_06.1&quot;, &quot;Student_06.2&quot;"+			  >Body_06</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >30</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  >, <span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >46</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="3" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_10.0&quot;, &quot;Student_10.1&quot;"+			  >Body_10</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  >, <span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			>Body_03</span+			>, <span class="studentBody" title="&quot;Student_11.0&quot;"+			>Body_11</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_03.0&quot;, &quot;Student_03.1&quot;"+			  >Body_03</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_04.0&quot;"+			>Body_04</span+			>, <span class="studentBody" title="&quot;Student_05.0&quot;"+			>Body_05</span+			>, <span class="studentBody" title="&quot;Student_08.0&quot;"+			>Body_08</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_11.0&quot;"+			  >Body_11</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_04.0&quot;"+			  >Body_04</span+			  >, <span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  >, <span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_05.0&quot;"+			  >Body_05</span+			  >, <span class="studentBody" title="&quot;Student_07.0&quot;, &quot;Student_07.1&quot;"+			  >Body_07</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_02.0&quot;, &quot;Student_02.1&quot;, &quot;Student_02.2&quot;"+			  >Body_02</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >31</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="8" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="4"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_01.0&quot;, &quot;Student_01.1&quot;, &quot;Student_01.2&quot;"+			  >Body_01</span+			  >, <span class="studentBody" title="&quot;Student_09.0&quot;"+			  >Body_09</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >4</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_08.0&quot;"+			  >Body_08</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ></body+  ></html+>+
+ xhtml/timetable_13.xhtml view
@@ -0,0 +1,31449 @@+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"+><head+  ><meta http-equiv="Content-type" content="application/xhtml+xml;charset=UTF-8"+     /><meta name="author" content="Dr. Alistair Ward"+     /><meta name="description" content="The proposed solution to the specified school-timetable problem"+     /><meta name="keywords" content="weekdaze-0.0.0.1, Timetable, Haskell, Evolutionary algorithm"+     /><link rel="icon" href="../images/favicon.png" type="image/png"+     /><link rel="stylesheet" href="../css/weekdaze.css" type="text/css"+     /><link rel="stylesheet" href="https://functionalley.com/WeekDaze/css/weekdaze.css" type="text/css"+     /><title+    >weekdaze</title+    ></head+  ><body+  ><h1 id="commandLine"+    >weekdaze --verbosity='Deafening' --randomSeed --inputConfigFilePath='xml/example_13.xml' --outputStudentViewTimetable='xml/studentViewTimetable_13.xml'</h1+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('consoleOutput'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="Runtime-information."+      >Runtime-information</h2+      ><div style="display: none" id="consoleOutput"+      ><ul+	><li+	  ><p class="warning"+	    >WARNING:	those groups for which zero meetings have been scheduled, have been removed from the group-catalogue; &quot;Sport-teachers&quot;.</p+	    ></li+	  ></ul+	><table class="runtimeInformation" id="weightedMeanOfTimetableCriteriaByTraversalOrderTable"+	><tr+	  ><th colspan="4"+	    >The Weighted Mean over the values of Heterogeneous Timetable-criteria,<br+	       />of the Deterministic Timetable resulting from each Raster-scan.</th+	    ></tr+	  ><tr+	  ><th colspan="3"+	    >Slowest-changing to Fastest-changing Coordinate.</th+	    ><th title="Weighted Mean over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9e7f01"+	    >0.796</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a17c02"+	    >0.803</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a37903"+	    >0.811</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.801</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #a07c02"+	    >0.802</td+	    ></tr+	  ><tr id="selectedRaster" title="Selected Raster-scan."+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a57603"+	    >0.818</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a27a02"+	    >0.809</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.800</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9b8301"+	    >0.785</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a17c02"+	    >0.804</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9c8201"+	    >0.787</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #998500"+	    >0.778</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9a8400"+	    >0.781</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9a8500"+	    >0.780</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9f7e01"+	    >0.797</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9d8101"+	    >0.790</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.801</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #9d8101"+	    >0.790</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9f7f01"+	    >0.796</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9b8300"+	    >0.784</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #9c8101"+	    >0.789</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #9f7e02"+	    >0.799</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9e8001"+	    >0.793</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.800</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.801</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.805</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a17c02"+	    >0.803</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.801</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #a27b02"+	    >0.806</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a17c02"+	    >0.804</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a27a02"+	    >0.807</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #a47803"+	    >0.814</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #9e7f01"+	    >0.794</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.805</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9d8101"+	    >0.791</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9e8001"+	    >0.793</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-TimeslotId</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.805</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="numericData" style="color: #9b8301"+	    >0.786</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #9b8301"+	    >0.785</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9b8201"+	    >0.786</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a17c02"+	    >0.804</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #9d8001"+	    >0.792</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a07d02"+	    >0.801</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #9b8300"+	    >0.784</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >-Day</td+	    ><td class="numericData" style="color: #a27a02"+	    >0.809</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.805</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >-ObserverId</td+	    ><td class="numericData" style="color: #a07c02"+	    >0.802</td+	    ></tr+	  ><tr+	  ><td class="timetableAxis"+	    >+TimeslotId</td+	    ><td class="timetableAxis"+	    >+Day</td+	    ><td class="timetableAxis"+	    >+ObserverId</td+	    ><td class="numericData" style="color: #998500"+	    >0.780</td+	    ></tr+	  ><tr+	  ><th colspan="3" title="The Mean, over the Weighted Mean, over the values of Heterogeneous Timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><td class="numericData" style="color: #9f7e01"+	    >0.797</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="initialLessonCriteriaStatisticsTable"+	><tr+	  ><th colspan="6"+	    >Statistics gathered for the values of each Lesson-criterion in isolation,<br+	       />Evaluated over each of the lessons of the best Deterministic Timetable.</th+	    ></tr+	  ><tr+	  ><th rowspan="2"+	    >Name</th+	    ><th rowspan="2" title="The weight of this criterion, in the weighted mean over the values of heterogeneous lesson-criteria."+	    >Weight</th+	    ><th colspan="4" title="Statistics gathered for the values of each lesson-criterion in isolation, evaluated over each of the lessons of the best deterministic timetable."+	    >Statistics</th+	    ></tr+	  ><tr+	  ><th title="The mean value"+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th title="The standard deviation."+	    ><abbr title="sigma"+	      >&sigma;</abbr+	      ></th+	    ><th title="The minimum value."+	    >Min.</th+	    ><th title="The maximum value."+	    >Max.</th+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >areResourcesReused</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.005</td+	    ><td class="numericData" style="color: #00849a"+	    >0.218</td+	    ><td class="numericData" style="color: #15b950"+	    >0.413</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestMinimumConsecutiveLessons</td+	    ><td class="numericData" style="color: #1452b9"+	    >0.092</td+	    ><td class="numericData" style="color: #253abf"+	    >0.030</td+	    ><td class="numericData" style="color: #1d45bd"+	    >0.059</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #05a970"+	    >0.333</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestRemainingCourseLessons</td+	    ><td class="numericData" style="color: #2b34bf"+	    >0.014</td+	    ><td class="numericData" style="color: #7ca102"+	    >0.697</td+	    ><td class="numericData" style="color: #009887"+	    >0.274</td+	    ><td class="numericData" style="color: #027da0"+	    >0.200</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >greatestSynchronisedCourseSetSize</td+	    ><td class="numericData" style="color: #0868ae"+	    >0.147</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.005</td+	    ><td class="numericData" style="color: #2936bf"+	    >0.019</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #1354b8"+	    >0.095</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isCoreKnowledgeRequirement</td+	    ><td class="numericData" style="color: #2b34bf"+	    >0.012</td+	    ><td class="numericData" style="color: #a47703"+	    >0.815</td+	    ><td class="numericData" style="color: #0fb55a"+	    >0.388</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >isSpecialistInTopic</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.005</td+	    ><td class="numericData" style="color: #b0640a"+	    >0.865</td+	    ><td class="numericData" style="color: #07ab6d"+	    >0.342</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >matchCourseClassSizeToLocationCapacity</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.005</td+	    ><td class="numericData" style="color: #33bf2c"+	    >0.511</td+	    ><td class="numericData" style="color: #1a49bc"+	    >0.069</td+	    ><td class="numericData" style="color: #02a27a"+	    >0.308</td+	    ><td class="numericData" style="color: #a97005"+	    >0.833</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseRelativeFacilityUtilisation</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.006</td+	    ><td class="numericData" style="color: #b95214"+	    >0.909</td+	    ><td class="numericData" style="color: #0378a4"+	    >0.186</td+	    ><td class="numericData" style="color: #009090"+	    >0.250</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverCourseClassSize</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >maximiseStudentClassSizeOverLocationCapacity</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td colspan="4" class="unavailable" title="Zero weight"+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingAtAnotherCoursesSpecifiedTime</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #0a66af"+	    >0.140</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseBookingOfLocationByOtherTeachers</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.007</td+	    ><td class="numericData" style="color: #a17b02"+	    >0.805</td+	    ><td class="numericData" style="color: #008d92"+	    >0.244</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseDeviationFromTimeslotRequest</td+	    ><td class="numericData" style="color: #2936bf"+	    >0.019</td+	    ><td class="numericData" style="color: #28bf37"+	    >0.479</td+	    ><td class="numericData" style="color: #008698"+	    >0.223</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfStudents</td+	    ><td class="numericData" style="color: #0e5db4"+	    >0.118</td+	    ><td class="numericData" style="color: #ba4f16"+	    >0.917</td+	    ><td class="numericData" style="color: #008995"+	    >0.233</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseInterCampusMigrationsOfTeachers</td+	    ><td class="numericData" style="color: #1b47bc"+	    >0.063</td+	    ><td class="numericData" style="color: #be3d23"+	    >0.962</td+	    ><td class="numericData" style="color: #0b62b1"+	    >0.132</td+	    ><td class="numericData" style="color: #30c030"+	    >0.500</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseStudentBodyCombinations</td+	    ><td class="numericData" style="color: #243cbf"+	    >0.034</td+	    ><td class="numericData" style="color: #be3f21"+	    >0.957</td+	    ><td class="numericData" style="color: #017e9f"+	    >0.203</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseTeachersLocusOperandi</td+	    ><td class="numericData" style="color: #2d32bf"+	    >0.006</td+	    ><td class="numericData" style="color: #bf342b"+	    >0.987</td+	    ><td class="numericData" style="color: #0f5bb5"+	    >0.114</td+	    ><td class="numericData" style="color: #2f30c0"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="lessonCriterion"+	    >minimiseWasteOfScarceFacilities</td+	    ><td class="numericData" style="color: #184cbb"+	    >0.076</td+	    ><td class="numericData" style="color: #bf302f"+	    >0.998</td+	    ><td class="numericData" style="color: #2e31bf"+	    >0.004</td+	    ><td class="numericData" style="color: #bf3828"+	    >0.977</td+	    ><td class="numericData" style="color: #c0302f"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ></table+	><table class="runtimeInformation" id="evolutionStrategyStatisticsTable"+	><tr+	  ><th colspan="25"+	    >The Improvement in the value of each Timetable-criterion, resulting from each Evolution-strategy, where <span class="numericData"+	      >2</span+	      > Initial Scouts were Dispatched.</th+	    ></tr+	  ><tr id="timetableCriteriaWeights"+	  ><th colspan="7"+	    >Timetable-criteria Weights&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #2a35bf" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.016</td+	    ><td class="numericData" style="color: #1c47bc" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="maximiseMeanStudentClassSize"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.500</td+	    ><td class="numericData" style="color: #0c60b3" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.125</td+	    ><td class="numericData" style="color: #2d32bf" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.008</td+	    ><td class="numericData" style="color: #2a35bf" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.016</td+	    ><td class="numericData" style="color: #253bbf" title="minimiseDispersionOfTeacherWorkload"+	    >0.031</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.500</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.500</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocationChangesOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #1c47bc" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.062</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.500</td+	    ><td class="numericData" style="color: #009090" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0.250</td+	    ><td class="numericData" style="color: #909000" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.750</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.250</td+	    ><td class="numericData" style="color: #009090" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.250</td+	    ></tr+	  ><tr id="bestDeterministicWeightedTimetableCriteria"+	  ><th colspan="7"+	    >The value of each Timetable-criterion, for the Best Deterministic Timetable&nbsp;&rarr;</th+	    ><td class="numericData" style="color: #7ba202" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.694</td+	    ><td class="numericData" style="color: #008d92" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.242</td+	    ><td class="numericData" style="color: #0d5eb4" title="maximiseMeanStudentClassSize"+	    >0.121</td+	    ><td class="numericData" style="color: #bd421f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0.950</td+	    ><td class="numericData" style="color: #be4120" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.952</td+	    ><td class="numericData" style="color: #899600" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.732</td+	    ><td class="numericData" style="color: #61b20c" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.629</td+	    ><td class="numericData" style="color: #a17c02" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.803</td+	    ><td class="numericData" style="color: #66af09" title="minimiseDispersionOfTeacherWorkload"+	    >0.642</td+	    ><td class="numericData" style="color: #bb4a19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.929</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #a87205" title="minimiseMeanLocationChangesOfTeachers"+	    >0.828</td+	    ><td class="numericData" style="color: #22be3f" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.458</td+	    ><td class="numericData" style="color: #b75512" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.901</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #9d8101" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.790</td+	    ><td class="numericData" style="color: #bf3b25" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.968</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><th colspan="2" title="The means by which a candidate-timetable is mutated, in the search for improvement."+	    >Chronologically ordered Evolution-strategies</th+	    ><th colspan="2" title="The size of the breeding-program for this evolution-strategy."+	    >Fecundity</th+	    ><th rowspan="2" title="The number of generations through which the timetable evolved, using this evolution-strategy."+	    >Generations</th+	    ><th rowspan="2" title="The weighted mean over the values of heterogeneous timetable-criteria."+	    ><abbr title="mu"+	      >&mu;</abbr+	      ></th+	    ><th rowspan="2" title="The improvement in the weighted mean over the values of heterogeneous timetable-criteria, relative to the previous phase."+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><th rowspan="2" colspan="18" title="The value of each timetable-criterion, for the best candidate resulting from a specific evolution-strategy."+	    >Timetable-criterion Values</th+	    ></tr+	  ><tr+	  ><th title="The strategy by which space is liberated in a candidate-timetable, to permit potentially beneficial mutation."+	    >Depletion</th+	    ><th title="The strategy by which a candidate-timetable is reconstructed, after application of the chosen depletion-strategy."+	    >Reconstruction</th+	    ><th title="The initial size of the breeding-program for this evolution-strategy."+	    >Initial</th+	    ><th title="The final size of the breeding-program on termination of this evolution-strategy, which may be less than the original size should that have proven excessive."+	    >Final</th+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >synchronisedCourseMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >38</td+	    ><td class="numericData" style="color: #aa6e06"+	    >0.839</td+	    ><td class="numericData" style="color: #2739bf"+	    >2.602%</td+	    ><td class="numericData" style="color: #7ba202" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.694</td+	    ><td class="numericData" style="color: #008d92" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.243</td+	    ><td class="numericData" style="color: #0d5eb3" title="maximiseMeanStudentClassSize"+	    >0.121</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3926" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.973</td+	    ><td class="numericData" style="color: #8e9100" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.746</td+	    ><td class="numericData" style="color: #8a9500" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.735</td+	    ><td class="numericData" style="color: #a77304" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.826</td+	    ><td class="numericData" style="color: #67ae09" title="minimiseDispersionOfTeacherWorkload"+	    >0.644</td+	    ><td class="numericData" style="color: #bb4c18" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.925</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.992</td+	    ><td class="numericData" style="color: #a67404" title="minimiseMeanLocationChangesOfTeachers"+	    >0.823</td+	    ><td class="numericData" style="color: #22be3f" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.458</td+	    ><td class="numericData" style="color: #bf3c24" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.966</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #aa6f06" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.837</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.970</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(synchronisedCourseByDayMutation . synchronousLessonMutation)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >40</td+	    ><td class="numericData" style="color: #ad6a08"+	    >0.850</td+	    ><td class="numericData" style="color: #2b34bf"+	    >1.270%</td+	    ><td class="numericData" style="color: #a57603" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.819</td+	    ><td class="numericData" style="color: #008d92" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.243</td+	    ><td class="numericData" style="color: #0d5eb3" title="maximiseMeanStudentClassSize"+	    >0.121</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3728" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.979</td+	    ><td class="numericData" style="color: #9f7e01" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.799</td+	    ><td class="numericData" style="color: #a17c02" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.803</td+	    ><td class="numericData" style="color: #a87205" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.830</td+	    ><td class="numericData" style="color: #66af09" title="minimiseDispersionOfTeacherWorkload"+	    >0.642</td+	    ><td class="numericData" style="color: #bb4a19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.928</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #a97105" title="minimiseMeanLocationChangesOfTeachers"+	    >0.832</td+	    ><td class="numericData" style="color: #22be3f" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.458</td+	    ><td class="numericData" style="color: #bf3729" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.980</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #b35f0d" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.876</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.972</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >73</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2739bf"+	    >2.590%</td+	    ><td class="numericData" style="color: #b2600c" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.873</td+	    ><td class="numericData" style="color: #008797" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.227</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.116</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.996</td+	    ><td class="numericData" style="color: #a37903" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.811</td+	    ><td class="numericData" style="color: #ab6d06" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.841</td+	    ><td class="numericData" style="color: #ad6908" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.851</td+	    ><td class="numericData" style="color: #69ae08" title="minimiseDispersionOfTeacherWorkload"+	    >0.648</td+	    ><td class="numericData" style="color: #bb4a19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.929</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #a87205" title="minimiseMeanLocationChangesOfTeachers"+	    >0.829</td+	    ><td class="numericData" style="color: #22be3f" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.458</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3b25" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.968</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >14</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.052%</td+	    ><td class="numericData" style="color: #b2600c" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.873</td+	    ><td class="numericData" style="color: #008797" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.227</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.116</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.998</td+	    ><td class="numericData" style="color: #a37903" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.811</td+	    ><td class="numericData" style="color: #ae6808" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.853</td+	    ><td class="numericData" style="color: #ae6808" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.854</td+	    ><td class="numericData" style="color: #6bac07" title="minimiseDispersionOfTeacherWorkload"+	    >0.654</td+	    ><td class="numericData" style="color: #bb4b19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.927</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.992</td+	    ><td class="numericData" style="color: #aa6f06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.837</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.970</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >512</td+	    ><td class="numericData"+	    >16</td+	    ><td class="numericData" style="color: #b2610c"+	    >0.872</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.041%</td+	    ><td class="numericData" style="color: #b2600c" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.873</td+	    ><td class="numericData" style="color: #008897" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.228</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.117</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.996</td+	    ><td class="numericData" style="color: #a77404" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.824</td+	    ><td class="numericData" style="color: #b2600c" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.874</td+	    ><td class="numericData" style="color: #b35e0d" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.878</td+	    ><td class="numericData" style="color: #69ad08" title="minimiseDispersionOfTeacherWorkload"+	    >0.649</td+	    ><td class="numericData" style="color: #bb4b19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.927</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #ab6d06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.841</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.970</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >8</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.017%</td+	    ><td class="numericData" style="color: #b1620b" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.869</td+	    ><td class="numericData" style="color: #008897" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.228</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.117</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.996</td+	    ><td class="numericData" style="color: #a77304" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.826</td+	    ><td class="numericData" style="color: #b55b0e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.885</td+	    ><td class="numericData" style="color: #b2600c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.873</td+	    ><td class="numericData" style="color: #71a805" title="minimiseDispersionOfTeacherWorkload"+	    >0.669</td+	    ><td class="numericData" style="color: #bb4b19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.927</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #ab6d06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.840</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.970</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Deterministic</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >2</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.001%</td+	    ><td class="numericData" style="color: #b1620b" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.869</td+	    ><td class="numericData" style="color: #008897" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.228</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.117</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.996</td+	    ><td class="numericData" style="color: #a77304" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.826</td+	    ><td class="numericData" style="color: #b55b0e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.885</td+	    ><td class="numericData" style="color: #b2600c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.873</td+	    ><td class="numericData" style="color: #71a805" title="minimiseDispersionOfTeacherWorkload"+	    >0.669</td+	    ><td class="numericData" style="color: #bb4b19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.927</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #ab6d06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.841</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.970</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >synchronisedCourseMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >4</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.004%</td+	    ><td class="numericData" style="color: #b1620b" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.869</td+	    ><td class="numericData" style="color: #008897" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.228</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.117</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.996</td+	    ><td class="numericData" style="color: #a77304" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.827</td+	    ><td class="numericData" style="color: #b55b0e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.885</td+	    ><td class="numericData" style="color: #b2610b" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.870</td+	    ><td class="numericData" style="color: #71a805" title="minimiseDispersionOfTeacherWorkload"+	    >0.669</td+	    ><td class="numericData" style="color: #bb4b19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.927</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #ac6c07" title="minimiseMeanLocationChangesOfTeachers"+	    >0.844</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3b25" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.969</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(synchronisedCourseByDayMutation . synchronousLessonMutation)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >2</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.000%</td+	    ><td class="numericData" style="color: #b1620b" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.869</td+	    ><td class="numericData" style="color: #008897" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.228</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.117</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf312e" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.996</td+	    ><td class="numericData" style="color: #a77304" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.827</td+	    ><td class="numericData" style="color: #b65910" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.891</td+	    ><td class="numericData" style="color: #b1620b" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.868</td+	    ><td class="numericData" style="color: #71a805" title="minimiseDispersionOfTeacherWorkload"+	    >0.669</td+	    ><td class="numericData" style="color: #bb4b19" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.927</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.993</td+	    ><td class="numericData" style="color: #ac6c07" title="minimiseMeanLocationChangesOfTeachers"+	    >0.844</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.995</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3b25" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.969</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForDayMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >3</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.025%</td+	    ><td class="numericData" style="color: #b0640a" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.863</td+	    ><td class="numericData" style="color: #008797" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.227</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.116</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #a67404" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.823</td+	    ><td class="numericData" style="color: #b45c0e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.884</td+	    ><td class="numericData" style="color: #ae6808" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.853</td+	    ><td class="numericData" style="color: #75a604" title="minimiseDispersionOfTeacherWorkload"+	    >0.678</td+	    ><td class="numericData" style="color: #bb4c18" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.925</td+	    ><td class="numericData" style="color: #bf322d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.992</td+	    ><td class="numericData" style="color: #ab6d06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.840</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3a26" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.970</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.997</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >homogeneousStudentViewLessonMutation</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >8</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.873</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.024%</td+	    ><td class="numericData" style="color: #a07d02" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.800</td+	    ><td class="numericData" style="color: #008798" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.225</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.115</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #a77304" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.826</td+	    ><td class="numericData" style="color: #b35e0d" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.878</td+	    ><td class="numericData" style="color: #af6609" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.858</td+	    ><td class="numericData" style="color: #76a503" title="minimiseDispersionOfTeacherWorkload"+	    >0.682</td+	    ><td class="numericData" style="color: #bc481a" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.933</td+	    ><td class="numericData" style="color: #bf332d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.991</td+	    ><td class="numericData" style="color: #aa6f06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.835</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3c24" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.966</td+	    ><td class="numericData" style="color: #bf312e" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.994</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >studentViewTimetableForWeekMutation(16,4)</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >1024</td+	    ><td class="numericData"+	    >36</td+	    ><td class="numericData" style="color: #b2600c"+	    >0.874</td+	    ><td class="numericData" style="color: #2f30bf"+	    >0.129%</td+	    ><td class="numericData" style="color: #b0640a" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.863</td+	    ><td class="numericData" style="color: #008798" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >0.225</td+	    ><td class="numericData" style="color: #0e5cb4" title="maximiseMeanStudentClassSize"+	    >0.115</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseSynchronisationOfSynchronisedCourses"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #a97005" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.833</td+	    ><td class="numericData" style="color: #b45c0e" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.884</td+	    ><td class="numericData" style="color: #b2610c" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.871</td+	    ><td class="numericData" style="color: #76a503" title="minimiseDispersionOfTeacherWorkload"+	    >0.682</td+	    ><td class="numericData" style="color: #bc471b" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.937</td+	    ><td class="numericData" style="color: #bf332d" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >0.991</td+	    ><td class="numericData" style="color: #ab6d06" title="minimiseMeanLocationChangesOfTeachers"+	    >0.841</td+	    ><td class="numericData" style="color: #25bf3b" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.468</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #c0302f" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >1&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #bf3b24" title="minimiseRatioOfConsecutiveEqualLessons"+	    >0.967</td+	    ><td class="numericData" style="color: #bf302f" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >0.998</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(singletonStudentClassMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >2048</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(studentBodyCombinationMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >2048</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(incompleteCourseMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >2048</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(excessRunlengthMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >2048</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><td class="depletionStrategy"+	    >(splitSessionMutation . randomLessonMutation(256,3))</td+	    ><td class="reconstructionStrategy"+	    >Random</td+	    ><td colspan="2" class="numericData"+	    >2048</td+	    ><td class="numericData"+	    >0</td+	    ><td class="unavailable" colspan="20" title="Zero productive generations of evolution occurred."+	    >N/A</td+	    ></tr+	  ><tr+	  ><th title="The weighted change in the value of each timetable-criterion, from the best Deterministic Timetable." colspan="7"+	    ><abbr title="Delta"+	      >&Delta;</abbr+	      ></th+	    ><td class="numericData" style="color: #4fba16" title="maximiseComplianceWithFreePeriodPreferences"+	    >0.003</td+	    ><td class="numericData" style="color: #2dbf32" title="maximiseMeanRatioOfStudentClassSizeToLocationCapacity"+	    >-0.001</td+	    ><td class="numericData" style="color: #2fbf30" title="maximiseMeanStudentClassSize"+	    >-0.003</td+	    ><td class="numericData" style="color: #38bf27" title="maximiseSynchronisationOfSynchronisedCourses"+	    >0.025</td+	    ><td class="numericData" style="color: #38bf27" title="maximiseWeightedMeanStudentBodyUtilisationRatio"+	    >0.024</td+	    ><td class="numericData" style="color: #42bd1f" title="minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"+	    >0.013</td+	    ><td class="numericData" style="color: #60b20c" title="minimiseDispersionOfFreeStudentPeriodsPerDay"+	    >0.002</td+	    ><td class="numericData" style="color: #3cbf24" title="minimiseDispersionOfFreeTeacherPeriodsPerDay"+	    >0.001</td+	    ><td class="numericData" style="color: #37bf29" title="minimiseDispersionOfTeacherWorkload"+	    >0.001</td+	    ><td class="numericData" style="color: #31bf2e" title="minimiseMeanInterCampusMigrationsOfStudents"+	    >0.004</td+	    ><td class="numericData" style="color: #2fbf30" title="minimiseMeanInterCampusMigrationsOfTeachers"+	    >-0.001</td+	    ><td class="numericData" style="color: #32bf2d" title="minimiseMeanLocationChangesOfTeachers"+	    >0.001</td+	    ><td class="numericData" style="color: #31bf2e" title="minimiseMeanLocusOperandiOfTeachers"+	    >0.001</td+	    ><td class="numericData" style="color: #42bd1f" title="minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"+	    >0.049</td+	    ><td class="numericData" style="color: #30c030" title="minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"+	    >0&nbsp;&nbsp;&nbsp;&nbsp;</td+	    ><td class="numericData" style="color: #57b611" title="minimiseMeanStudentBodyCombinationsPerLesson"+	    >0.157</td+	    ><td class="numericData" style="color: #2fbf30" title="minimiseRatioOfConsecutiveEqualLessons"+	    >-0.000</td+	    ><td class="numericData" style="color: #2fbf30" title="minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"+	    >-0.000</td+	    ></tr+	  ></table+	></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('studentViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Hide</button+      ><h2 title="From the perspective of each student-body."+      >By Student-body</h2+      ><div id="studentViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><div class="warning"+	  ><dl+	    ><dt+	      ><span title="The sum over all student-bodies, of the number of core knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked core knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of the number of optional knowledge-requirements which are incompletely booked, multiplied by the number of members in the student-body."+		>Incompletely booked optional knowledge-requirements:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ><dt+	      ><span title="The sum over all student-bodies, of available but unallocated time-slots, excluding those required for free study &amp; meetings."+		>Total free-periods:</span+		></dt+	      ><dd+	      ><span class="numericData"+		>0</span+		></dd+	      ></dl+	    ></div+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+		>Body_1.0</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >9</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Debating.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+		>Body_1.1</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Swimming</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Chess.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+		>Body_1.2</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >English</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Swimming</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="4"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="4"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+		>Body_1.3</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions in the same subject, in any single day."+		>Split sessions:<ul+		  ><li+		    ><span class="subject" title="subject"+		      ><span class="topic" title="topic"+			>Maths</span+			>&nbsp;<span class="level" title="level"+			>1</span+			></span+		      >&nbsp;&Implies;&nbsp;<span class="numericData"+		      >1</span+		      ></li+		    ><li+		    ><span class="subject" title="subject"+		      ><span class="topic" title="topic"+			>Maths</span+			>&nbsp;<span class="level" title="level"+			>1</span+			></span+		      >&nbsp;&Implies;&nbsp;<span class="numericData"+		      >1</span+		      ></li+		    ></ul+		  ></div+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Swimming</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_2.0.0&quot;"+		>Body_2.0</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >4</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Debating.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+		>Body_2.1</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >2</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Religious Education</span+			  >&nbsp;<span class="level" title="level"+			  >2</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Chess.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+		>Body_2.2</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >2</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_2.3.0&quot;"+		>Body_2.3</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >3</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_3.0.0&quot;"+		>Body_3.0</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >5</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Chess.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+		>Body_3.1</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Debating.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="studentBody" title="&quot;Student_3.2.0&quot;"+		>Body_3.2</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required by these students."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >2</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >100</span+		  >%</span+		></li+	      ><li+	      ><div class="warning" title="Some subjects have been booked in longer sessions than necessary (and therefore also longer than requested)."+		>Long sessions:<div class="data"+		  ><ul+		    ><li+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Physical Education</span+			  >&nbsp;<span class="level" title="level"+			  >3</span+			  ></span+			></li+		      ></ul+		    ></div+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('teacherViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each teacher."+      >By Teacher-id</h2+      ><div style="display: none" id="teacherViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="warning" title="The sum over all teachers, of available but unallocated time-slots, excluding those required for administration &amp; meetings."+	      >Total free-periods:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >418</span+	      ></dd+	    ><dt+	    ><span class="warning" title="The mean over all bookings, of the size of student-classes."+	      >Mean student-class size:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >2.309</span+	      ></dd+	    ><dt+	    ><span class="info" title="Time allocated to teaching / time available for teaching."+	      >(Least,Most) utilised teacher:</span+	      ></dt+	    ><dd+	    ><span class="data"+	      >(&quot;Teacher_08&quot;,&quot;Teacher_14&quot;)</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_01</span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_02</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >21</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >19</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="3"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_03</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >30</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >28</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_04</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_4</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_05</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >62</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_06</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  ></span+		></li+	      ><li+	      ><div class="warning" title="The number of instances of separated sessions of identical lessons, in any single day."+		>Split sessions:<dl+		  ><dt+		    ><div class="lesson" title="lesson"+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			>.<ul class="resourceIds" title="resourceIds"+			><li+			  ><span class="locationId" title="locationId"+			    >Classroom_2</span+			    >.</li+			  ><li+			  ><span class="studentClass" title="studentClass"+			    ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			      >Body_1.3</span+			      ></span+			    >.</li+			  ></ul+			></div+		      ></dt+		    ><dd+		    ><span class="numericData"+		      >1</span+		      ></dd+		    ><dt+		    ><div class="lesson" title="lesson"+		      ><span class="subject" title="subject"+			><span class="topic" title="topic"+			  >Maths</span+			  >&nbsp;<span class="level" title="level"+			  >1</span+			  ></span+			>.<ul class="resourceIds" title="resourceIds"+			><li+			  ><span class="locationId" title="locationId"+			    >Classroom_2</span+			    >.</li+			  ><li+			  ><span class="studentClass" title="studentClass"+			    ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			      >Body_1.3</span+			      ></span+			    >.</li+			  ></ul+			></div+		      ></dt+		    ><dd+		    ><span class="numericData"+		      >1</span+		      ></dd+		    ></dl+		  ></div+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_07</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >75</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >10</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_08</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >18</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_09</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >50</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Debating.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_2</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_10</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >70</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ChemistryLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_11</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required of this teacher."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >5</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >56</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >14</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_12</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >55</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >18</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_13</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >45</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_14</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >75</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >8</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Science-teachers.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>BiologyLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_15</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >45</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Kitchen_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_16</span+		></li+	      ><li+	      ><div class="warning" title="The number of inter-campus migrations required of this teacher."+		>Inter-campus migrations&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></div+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >72</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >11</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="3"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>GamesField</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  >, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  >, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>SwimmingBaths</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Gym</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_17</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >44</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >9</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="4"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="2"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>AssemblyHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="2"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>MusicRoom_1</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_18</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >44</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >9</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Administrators.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_1</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_19</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >62</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >15</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>Classroom_3</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_20</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >30</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >28</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>PhysicsLab_2</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_21</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >18</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >33</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>WoodworkRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_22</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >25</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >30</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="teacherId" title="teacherId"+		>Teacher_23</span+		></li+	      ><li+	      ><span class="info" title="Time allocated to teaching / time available for teaching."+		>Utilisation-ratio&nbsp;=&nbsp;<span class="numericData"+		  >45</span+		  >%</span+		></li+	      ><li+	      ><span class="warning" title="The number of available but unallocated time-slots, excluding those allocated to administration &amp; meetings."+		>Free-periods&nbsp;=&nbsp;<span class="numericData"+		  >22</span+		  ></span+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>DiningHall</span+			>.</li+		      ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="locationId" title="locationId"+			>ArtRoom</span+			>.</li+		      ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ><div class="box"+    ><button class="showHideButton" onclick="this.innerHTML = ((this.innerHTML !== 'Hide') ? 'Hide' : 'Show'); var element = document.getElementById('locationViewTimetable'); element.style.display = ((element.style.display !== 'none') ? 'none' : 'block');"+      >Show</button+      ><h2 title="From the perspective of each location."+      >By Location-id</h2+      ><div style="display: none" id="locationViewTimetable"+      ><div class="box"+	><h3+	  >Summary</h3+	  ><dl+	  ><dt+	    ><span class="info" title="The sum over all locations, of available but unallocated time-slots."+	      >Unallocated time-slots:</span+	      ></dt+	    ><dd+	    ><span class="numericData"+	      >1113</span+	      ></dd+	    ></dl+	  ></div+	><dl+	><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>ArtRoom</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >37</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Art-tools&quot;</li+		  ><li+		  >&quot;Drawing-desks&quot;</li+		  ><li+		  >&quot;Easels&quot;</li+		  ><li+		  >&quot;Sinks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_Art" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Art</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_TechnicalDrawing" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Technical Drawing</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>AssemblyHall</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >91</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Lectern&quot;</li+		  ><li+		  >&quot;Pipe-organ&quot;</li+		  ><li+		  >&quot;Seats&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Assembly.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="12" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiologyLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>BiologyLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >41</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Biology-lab&quot;</li+		  ><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Biology" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Biology</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>ChemistryLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >37</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Chemistry-lab&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="9" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Chemistry" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chemistry</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_10</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >66</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Geography" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Geography</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Chess.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_14</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >51</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Maths" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Maths" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Maths</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_06</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Debating.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_09</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_3</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >59</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Geography/History 3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_French" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >French</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_08</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_History" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >History</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_19</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Classroom_4</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >16</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >59</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="3"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_English" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >English</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_04</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="topic_German" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >German</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_03</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>DiningHall</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >60</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >65</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Seats&quot;</li+		  ><li+		  >&quot;Tables&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_A.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			>Body_1.0</span+			>, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			>Body_2.0</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			>Body_3.0</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_04</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_08</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_10</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_12</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_14</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_16</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_18</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_20</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_22</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="5"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Lunch_B.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			>Body_1.1</span+			>, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			>Body_2.1</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			>Body_3.1</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_01</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_03</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_09</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_11</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_13</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_15</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_17</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_19</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_21</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_23</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>GamesField</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >40</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >47</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Goal-posts&quot;</li+		  ><li+		  >&quot;Running-track&quot;</li+		  ><li+		  >&quot;Showers&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="2"+		>N/A</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="topic_Games" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Games</span+		      >&nbsp;</span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  >, <span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  >, <span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>Gym</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >55</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Gym-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="9" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="11" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_PhysicalEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physical Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >47</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="2"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  >, <span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_DomesticScience" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Domestic Science</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_15</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>Kitchen_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >65</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Kitchen-equipment&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="5"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >86</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="9" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="12" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_02</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Choir.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			>Body_1.2</span+			>, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			>Body_2.2</span+			>, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			>Body_3.2</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>MusicRoom_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >84</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Musical instruments&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="4"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Music" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Music</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_17</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="meetings" title="meetings" colspan="1"+		><div class="meeting" title="meeting"+		  ><div class="groupId" title="groupId"+		    >Drama.</div+		    ><ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			>Body_1.3</span+			>, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			>Body_2.3</span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_05</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_06</span+			>, <span class="teacherId" title="teacherId"+			>Teacher_07</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_1</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >6</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >36</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_ReligiousEducation" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Religious Education</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_18</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Physics" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  >, <span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.A</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_12</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>PhysicsLab_2</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >35</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Blackboard&quot;</li+		  ><li+		  >&quot;Desks&quot;</li+		  ><li+		  >&quot;Physics-lab&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="3"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="8" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="2"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/2</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Physics 3 stream</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >3.B</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Physics" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Physics</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_13</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/1</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Chinese" colspan="1"+		><div class="synchronisationId" title="synchronisationId"+		  >Foreign Languages/3</div+		  ><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Chinese</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_20</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      ><span class="campus" title="campus"+		>Sports-complex</span+		> <span class="locationId" title="locationId"+		>SwimmingBaths</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >20</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >59</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Swimming-pool&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="7" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="5" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="2"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.1.0&quot;, &quot;Student_1.1.1&quot;, &quot;Student_1.1.2&quot;"+			  >Body_1.1</span+			  >, <span class="studentBody" title="&quot;Student_1.3.0&quot;"+			  >Body_1.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="3" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.0.0&quot;"+			  >Body_3.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="4" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.2.0&quot;, &quot;Student_1.2.1&quot;"+			  >Body_1.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.0.0&quot;"+			  >Body_2.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.1.0&quot;, &quot;Student_2.1.1&quot;, &quot;Student_2.1.2&quot;"+			  >Body_2.1</span+			  >, <span class="studentBody" title="&quot;Student_2.2.0&quot;, &quot;Student_2.2.1&quot;"+			  >Body_2.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_16</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >3</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.1.0&quot;, &quot;Student_3.1.1&quot;"+			  >Body_3.1</span+			  >, <span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="topic_Swimming" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Swimming</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_11</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="2" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ></table+	    ></dd+	  ><dt+	  ><br+	     /><ul class="observerSummary"+	    ><li+	      > <span class="locationId" title="locationId"+		>WoodworkRoom</span+		></li+	      ><li+	      ><span class="info" title="The total capacity to accommodate students at this location."+		>Capacity&nbsp;=&nbsp;<span class="numericData"+		  >12</span+		  ></span+		></li+	      ><li+	      ><span class="info" title="Available but unallocated time-slots, at this location."+		>Unallocated time-slots&nbsp;=&nbsp;<span class="numericData"+		  >58</span+		  ></span+		></li+	      ><li+	      ><ul class="info" title="Facilities available at this location."+		><li+		  >&quot;Wood-tools&quot;</li+		  ><li+		  >&quot;Work-benches&quot;</li+		  ></ul+		></li+	      ></ul+	    ></dt+	  ><dd+	  ><table class="timetableForWeek" title="Timetable for Week"+	    ><tr+	      ><th class="origin"+		></th+		><th class="weekend" title="weekend"+		>Sunday</th+		><th class="workday" title="Work-day"+		>Monday</th+		><th class="workday" title="Work-day"+		>Tuesday</th+		><th class="workday" title="Work-day"+		>Wednesday</th+		><th class="workday" title="Work-day"+		>Thursday</th+		><th class="workday" title="Work-day"+		>Friday</th+		><th class="weekend" title="weekend"+		>Saturday</th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >0</span+		  ></th+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="11" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="4" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="13" class="unavailable" title="Not scheduled to be available today." colspan="1"+		>N/A</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >1</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >2</span+		  ></th+		><td rowspan="9" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >3</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >4</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >5</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_3.2.0&quot;"+			  >Body_3.2</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >6</span+		  ></th+		><td rowspan="6" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >7</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >8</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >9</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >10</span+		  ></th+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >11</span+		  ></th+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ><tr+	      ><th colspan="1"+		><span class="timeslotId" title="timeslotId"+		  >12</span+		  ></th+		><td rowspan="1" class="unallocatedTimeslot" title="Not booked for teaching, but possibly kept free for another activity." colspan="1"+		>Unallocated</td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >2</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_2.3.0&quot;"+			  >Body_2.3</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		><td rowspan="1" class="topic_Woodwork" colspan="1"+		><div class="lesson" title="lesson"+		  ><span class="subject" title="subject"+		    ><span class="topic" title="topic"+		      >Woodwork</span+		      >&nbsp;<span class="level" title="level"+		      >1</span+		      ></span+		    >.<ul class="resourceIds" title="resourceIds"+		    ><li+		      ><span class="studentClass" title="studentClass"+			><span class="studentBody" title="&quot;Student_1.0.0&quot;, &quot;Student_1.0.1&quot;, &quot;Student_1.0.2&quot;"+			  >Body_1.0</span+			  ></span+			>.</li+		      ><li+		      ><span class="teacherId" title="teacherId"+			>Teacher_21</span+			>.</li+		      ></ul+		    ></div+		  ></td+		></tr+	      ></table+	    ></dd+	  ></dl+	><br class="observerViewTerminator"+	 /></div+      ></div+    ></body+  ></html+>+
+ xml/example_01.xml view
@@ -0,0 +1,264 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies>+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="0" randomConstructorFecundity="0"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="0" randomConstructorFecundity="0"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="64"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="32" randomConstructorFecundity="64"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</x><y>+				<timetableAxisTraversal sense="True" axis="ObserverId"/>+			</y><z>+				<timetableAxisTraversal sense="False" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="0.5227" greatestMinimumConsecutiveLessons="0" greatestRemainingCourseLessons="0.1588" greatestSynchronisedCourseSetSize="0" isCoreKnowledgeRequirement="3.73e-2" isSpecialistInTopic="5.47e-2" matchCourseClassSizeToLocationCapacity="7.2e-2" maximiseRelativeFacilityUtilisation="6.75e-2" minimiseBookingAtAnotherCoursesSpecifiedTime="0" minimiseBookingOfLocationByOtherTeachers="7.07e-2" minimiseDeviationFromTimeslotRequest="0" minimiseInterCampusMigrationsOfStudents="0" minimiseInterCampusMigrationsOfTeachers="0" minimiseStudentBodyCombinations="8.43e-2" minimiseTeachersLocusOperandi="5.03e-2" minimiseWasteOfScarceFacilities="1"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="0" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.25" maximiseSynchronisationOfSynchronisedCourses="0" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0" minimiseMeanInterCampusMigrationsOfTeachers="0" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.125"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+				<xhtml>+					<style>+						<displayViews>+							<perspective view="StudentView"/>+							<perspective view="TeacherView"/>+							<perspective view="LocationView"/>+						</displayViews>+						<mergeDuplicateTimeslots>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</mergeDuplicateTimeslots>+						<displayAxisLabels>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</displayAxisLabels>+						<weekend>+							<day value="Saturday"/>+							<day value="Sunday"/>+						</weekend>+						<generateLessonColour generateLessonColourFrom="Topic" minimumContrastRatio="0.05"/>+					</style>+				</xhtml>+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_01.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="0"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="Location_1">+				<locationProfile capacity="8"/>+			</location><location locationId="Location_2">+				<locationProfile capacity="8"/>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="Teacher_1">+				<teacherProfile maximumTeachingRatio="1">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Geography" level="1"/>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="History" level="1"/>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_2">+				<teacherProfile maximumTeachingRatio="1">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Maths" level="1"/>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Music" level="1"/>+						</course>+					</service>+					<availability>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_3">+				<teacherProfile maximumTeachingRatio="1">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Physics" level="1"/>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_4">+				<teacherProfile maximumTeachingRatio="1">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Domestic Science" level="1"/>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1">+					<student studentId="Student_1.0"/>+					<student studentId="Student_1.1"/>+					<student studentId="Student_1.2"/>+				</studentBody>+				<studentProfile>+					<knowledgeRequirements>+						<core>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physics" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2">+					<student studentId="Student_2.0"/>+					<student studentId="Student_2.1"/>+				</studentBody>+				<studentProfile>+					<knowledgeRequirements>+						<core>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physics" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3">+					<student studentId="Student_3.0"/>+				</studentBody>+				<studentProfile>+					<knowledgeRequirements>+						<core>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physics" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue/>+	</problemParameters>+</options>+
+ xml/example_02.xml view
@@ -0,0 +1,343 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2013-2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies>+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="0" randomConstructorFecundity="0"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="0" randomConstructorFecundity="0"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="256"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="True" axis="ObserverId"/>+			</x><y>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</y><z>+				<timetableAxisTraversal sense="True" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="0.5227" greatestMinimumConsecutiveLessons="0" greatestRemainingCourseLessons="0.1588" greatestSynchronisedCourseSetSize="0" isCoreKnowledgeRequirement="3.73e-2" isSpecialistInTopic="5.47e-2" matchCourseClassSizeToLocationCapacity="7.2e-2" maximiseRelativeFacilityUtilisation="6.75e-2" minimiseBookingAtAnotherCoursesSpecifiedTime="0" minimiseBookingOfLocationByOtherTeachers="7.07e-2" minimiseDeviationFromTimeslotRequest="0" minimiseInterCampusMigrationsOfStudents="0" minimiseInterCampusMigrationsOfTeachers="0" minimiseStudentBodyCombinations="8.43e-2" minimiseTeachersLocusOperandi="5.03e-2" minimiseWasteOfScarceFacilities="1"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="0" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0" minimiseMeanInterCampusMigrationsOfTeachers="0" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.125"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+				<xhtml>+					<style>+						<displayViews>+							<perspective view="StudentView"/>+							<perspective view="TeacherView"/>+							<perspective view="LocationView"/>+						</displayViews>+						<mergeDuplicateTimeslots>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</mergeDuplicateTimeslots>+						<displayAxisLabels>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</displayAxisLabels>+						<weekend>+							<day value="Saturday"/>+							<day value="Sunday"/>+						</weekend>+						<generateLessonColour generateLessonColourFrom="Topic" minimumContrastRatio="0.05"/>+					</style>+				</xhtml>+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_02.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="1"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="Classroom_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Kitchen_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="MusicRoom_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="AtrickJerry">+				<teacherProfile maximumTeachingRatio="0.0">+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="BannJoe">+				<teacherProfile locationId="MusicRoom_1" maximumTeachingRatio="0.83" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="EasterleyGale">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Geography" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="InnoveraMarge">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Maths" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="MasseyHugh">+				<teacherProfile maximumTeachingRatio="0.875" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="2" maximumClassSize="3">+							<subject topic="Physics" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="NuttHazel">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Domestic Science">+					<service>+						<course requiredLessonsPerWeek="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="TheronLou">+				<teacherProfile maximumTeachingRatio="0.75" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_01">+					<student studentId="BallsHarry"/>+					<student studentId="BoardBill"/>+					<student studentId="BullTerry"/>+				</studentBody>+				<studentProfile>+					<knowledgeRequirements>+						<core>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_02">+					<student studentId="BodyAnnie"/>+					<student studentId="BoyleLance"/>+					<student studentId="SpencerMarkN"/>+				</studentBody>+				<studentProfile>+					<knowledgeRequirements>+						<core>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue/>+	</problemParameters>+</options>+
+ xml/example_03.xml view
@@ -0,0 +1,397 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2013-2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies nInitialScouts="2">+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="0" randomConstructorFecundity="0"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="0" randomConstructorFecundity="0"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="256"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="256" randomConstructorFecundity="256"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</x><y>+				<timetableAxisTraversal sense="False" axis="ObserverId"/>+			</y><z>+				<timetableAxisTraversal sense="False" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="0.1074" greatestMinimumConsecutiveLessons="1.83e-2" greatestRemainingCourseLessons="3.39e-2" greatestSynchronisedCourseSetSize="0" isCoreKnowledgeRequirement="1.36e-2" isSpecialistInTopic="1.34e-2" matchCourseClassSizeToLocationCapacity="2.93e-2" maximiseRelativeFacilityUtilisation="7.8e-3" minimiseBookingAtAnotherCoursesSpecifiedTime="0" minimiseBookingOfLocationByOtherTeachers="1.96e-2" minimiseDeviationFromTimeslotRequest="0" minimiseInterCampusMigrationsOfStudents="6.25e-2" minimiseInterCampusMigrationsOfTeachers="6.98e-2" minimiseStudentBodyCombinations="3.54e-2" minimiseTeachersLocusOperandi="6.5e-3" minimiseWasteOfScarceFacilities="1"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="6.25e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0.5" minimiseMeanInterCampusMigrationsOfTeachers="0.5" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.125" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_03.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="2"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="ChemistryLab_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Chemistry-lab"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Classroom_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Gym">+				<locationProfile capacity="4" campus="Sports-complex">+					<facilities>+						<facilityName value="Gym-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="MusicRoom_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="AtrickJerry">+				<teacherProfile maximumTeachingRatio="0.0">+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="EasterleyGale">+				<teacherProfile maximumTeachingRatio="0.93" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Geography" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Geography" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="InnoveraMarge">+				<teacherProfile maximumTeachingRatio="0.93" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="IronsRusty">+				<teacherProfile locationId="ChemistryLab_1" maximumTeachingRatio="0.93" specialtyTopic="Chemistry">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Chemistry" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="MasseyHugh">+				<teacherProfile maximumTeachingRatio="0.92" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Physics" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="NuttHazel">+				<teacherProfile maximumTeachingRatio="0.93" specialtyTopic="Domestic Science">+					<service>+						<course requiredLessonsPerWeek="2" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="ShoeiJim">+				<teacherProfile maximumTeachingRatio="0.93" specialtyTopic="Physical Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+						<day value="Saturday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="TheronLou">+				<teacherProfile maximumTeachingRatio="0.83" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="WallCathR">+				<teacherProfile locationId="MusicRoom_1" maximumTeachingRatio="0.89" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_01">+					<student studentId="BallsHarry"/>+					<student studentId="BoardBill"/>+					<student studentId="BullTerry"/>+				</studentBody>+				<studentProfile teachingRatio="0.8">	<!-- 12/15 => 4/5 -->+					<knowledgeRequirements>+						<core>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_02">+					<student studentId="BodyAnnie"/>+					<student studentId="BoyleLance"/>+					<student studentId="SpencerMarkN"/>+				</studentBody>+				<studentProfile teachingRatio="0.8">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue/>+	</problemParameters>+</options>+
+ xml/example_05.xml view
@@ -0,0 +1,1127 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "/home/al/Documents/Science/IT/Software/Haskell/WeekDaze/dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2013-2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies nInitialScouts="2">+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="256"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="256" randomConstructorFecundity="256"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="False" axis="ObserverId"/>+			</x><y>                                      +				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</y><z>                                      +				<timetableAxisTraversal sense="False" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="3.1e-3" greatestMinimumConsecutiveLessons="3.53e-2" greatestRemainingCourseLessons="6.2e-3" greatestSynchronisedCourseSetSize="0" isCoreKnowledgeRequirement="3.5e-3" isSpecialistInTopic="2.8e-3" matchCourseClassSizeToLocationCapacity="6.5e-3" maximiseRelativeFacilityUtilisation="4.9e-3" minimiseBookingAtAnotherCoursesSpecifiedTime="1" minimiseBookingOfLocationByOtherTeachers="5.4e-3" minimiseDeviationFromTimeslotRequest="5.6e-3" minimiseInterCampusMigrationsOfStudents="3.5e-2" minimiseInterCampusMigrationsOfTeachers="3.83e-2" minimiseStudentBodyCombinations="7.01e-2" minimiseTeachersLocusOperandi="7.8e-3" minimiseWasteOfScarceFacilities="3.83e-2"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="6.25e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="3.125e-2" maximiseMeanStudentClassSize="0.25" maximiseSynchronisationOfSynchronisedCourses="0.5" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="6.25e-2" minimiseDispersionOfStudentFreePeriodsPerDay="1.5625e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="1.5625e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0.5" minimiseMeanInterCampusMigrationsOfTeachers="0.5" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.125" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_05.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="4"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="AssemblyHall">+				<locationProfile capacity="40">+					<facilities>+						<facilityName value="Lectern"/>+						<facilityName value="Pipe-organ"/>+						<facilityName value="Seats"/>+					</facilities>+				</locationProfile>+			</location><location locationId="BiologyLab_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="BiologyLab_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="ChemistryLab_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Chemistry-lab"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Classroom_1">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_3">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_4">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="GamesField">+				<locationProfile capacity="40" campus="Sports-complex">+					<facilities>+						<facilityName value="Goal-posts"/>+						<facilityName value="Running-track"/>+						<facilityName value="Showers"/>+					</facilities>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Gym">+				<locationProfile capacity="4" campus="Sports-complex">+					<facilities>+						<facilityName value="Gym-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="MusicRoom_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="MusicRoom_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="4">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="PhysicsLab_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="AnderCorrie">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Domestic Science">+					<service>+						<course requiredLessonsPerWeek="2" minimumConsecutiveLessons="2" maximumClassSize="4">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Domestic Science" level="2"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="AtrickJerry">+				<teacherProfile maximumTeachingRatio="0.0">+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="BannJoe">+				<teacherProfile locationId="MusicRoom_1" maximumTeachingRatio="0.8" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Music" level="1"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Musicians"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="BaptistAnna">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Thursday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="EasterleyGale">+				<teacherProfile maximumTeachingRatio="0.92" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Geography" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Geography" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="InnoveraMarge">+				<teacherProfile maximumTeachingRatio="0.96" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Maths" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="IronsRusty">+				<teacherProfile locationId="ChemistryLab_1" maximumTeachingRatio="0.92" specialtyTopic="Chemistry">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Chemistry" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Chemistry" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="LynMandy">+				<teacherProfile locationId="MusicRoom_2" maximumTeachingRatio="0.7" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="French" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Music" level="1"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Musicians"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="LyonDanD">+				<teacherProfile maximumTeachingRatio="0.92" specialtyTopic="French">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="French" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="French" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="French" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="MasseyHugh">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="2" maximumClassSize="3">+							<subject topic="Physics" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Physics" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Physics" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="NuttHazel">+				<teacherProfile maximumTeachingRatio="0.92" specialtyTopic="Domestic Science">+					<service>+						<course requiredLessonsPerWeek="2" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="2"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</teacherProfile>+			</teacher><teacher teacherId="PaineJock">+				<teacherProfile maximumTeachingRatio="0.9" specialtyTopic="Games">+					<service>+						<course requiredLessonsPerWeek="3" minimumConsecutiveLessons="3">+							<subject topic="Games" level="1"/>+							<requiredFacilities>+								<facilityName value="Running-track"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="2">+										<day value="Wednesday"/>+									</time><time timeslotId="3">+										<day value="Wednesday"/>+									</time><time timeslotId="4">+										<day value="Wednesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="PoleDi">+				<teacherProfile maximumTeachingRatio="0.92" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="4" maximumClassSize="3">+							<subject topic="Physics" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="PooleJean">+				<teacherProfile locationId="BiologyLab_2" maximumTeachingRatio="0.9" specialtyTopic="Biology">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Biology" level="2"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Biology" level="3"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="ShoeiJim">+				<teacherProfile maximumTeachingRatio="0.92" specialtyTopic="Physical Education">+					<service>+						<course requiredLessonsPerWeek="3" minimumConsecutiveLessons="3">+							<subject topic="Games" level="1"/>+							<requiredFacilities>+								<facilityName value="Goal-posts"/>+								<facilityName value="Showers"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="2">+										<day value="Tuesday"/>+									</time><time timeslotId="3">+										<day value="Tuesday"/>+									</time><time timeslotId="4">+										<day value="Tuesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="SteinFrankN">+				<teacherProfile locationId="BiologyLab_1" maximumTeachingRatio="0.9" specialtyTopic="Biology">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Biology" level="1"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="TheronLou">+				<teacherProfile maximumTeachingRatio="0.8" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+					</groupMembership>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_01">+					<student studentId="BallsHarry"/>+					<student studentId="BoardBill"/>+					<student studentId="BullTerry"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">	<!-- 18/25 -->+					<knowledgeRequirements>+						<core>+							<subject topic="French" level="3"/>+							<subject topic="Geography" level="3"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="3"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_02">+					<student studentId="BodyAnnie"/>+					<student studentId="BoyleLance"/>+					<student studentId="SpencerMarkN"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="3"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_03">+					<student studentId="BushRose"/>+					<student studentId="PondLilly"/>+				</studentBody>+				<studentProfile teachingRatio="0.75">+					<knowledgeRequirements>+						<core>+							<subject topic="French" level="2"/>+							<subject topic="Games" level="1"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_04">+					<student studentId="DaySonny"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="French" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_05">+					<student studentId="EsterPolly"/>+				</studentBody>+				<studentProfile teachingRatio="0.68">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Games" level="1"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_06">+					<student studentId="ForestWoody"/>+					<student studentId="HareLotta"/>+					<student studentId="LearSandy"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_07">+					<student studentId="GunnTommy"/>+					<student studentId="PostMark"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_08">+					<student studentId="LottMona"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_09">+					<student studentId="PipeDwain"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="Games" level="1"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_10">+					<student studentId="PoleLou"/>+					<student studentId="PottJack"/>+				</studentBody>+				<studentProfile teachingRatio="0.8">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_11">+					<student studentId="ShawRick"/>+				</studentBody>+				<studentProfile teachingRatio="0.68">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="3"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue>+			<group groupId="Administrators">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Tuesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Assembly">+				<groupProfile locationId="AssemblyHall">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Monday"/>+						</time><time timeslotId="0">+							<day value="Tuesday"/>+						</time><time timeslotId="0">+							<day value="Wednesday"/>+						</time><time timeslotId="0">+							<day value="Thursday"/>+						</time><time timeslotId="0">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Choir">+				<groupProfile locationId="MusicRoom_1" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="4">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Christians">+				<groupProfile mandatesAttendance="True"/>+			</group><group groupId="Drama">+				<groupProfile locationId="MusicRoom_2" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="4">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Musicians">+				<groupProfile mandatesAttendance="True"/>+			</group><group groupId="Science-teachers">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Wednesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Sport-teachers">+				<groupProfile mandatesAttendance="True"/>+			</group>+		</groupCatalogue>+	</problemParameters>+</options>+
+ xml/example_05_1.xml view
@@ -0,0 +1,433 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies>+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="256" randomConstructorFecundity="512"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="1024"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</x><y>+				<timetableAxisTraversal sense="True" axis="ObserverId"/>+			</y><z>+				<timetableAxisTraversal sense="False" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="5.05e-2" greatestMinimumConsecutiveLessons="0.1748" greatestRemainingCourseLessons="4.02e-2" greatestSynchronisedCourseSetSize="1" isCoreKnowledgeRequirement="0" isSpecialistInTopic="9.89e-2" matchCourseClassSizeToLocationCapacity="9.44e-2" maximiseRelativeFacilityUtilisation="1.02e-2" minimiseBookingAtAnotherCoursesSpecifiedTime="0" minimiseBookingOfLocationByOtherTeachers="2.08e-2" minimiseDeviationFromTimeslotRequest="0.126" minimiseInterCampusMigrationsOfStudents="0" minimiseInterCampusMigrationsOfTeachers="0" minimiseStudentBodyCombinations="0.2335" minimiseTeachersLocusOperandi="6.86e-2" minimiseWasteOfScarceFacilities="0.3171"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="6.25e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0.5" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0" minimiseMeanInterCampusMigrationsOfTeachers="0" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.125" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_13.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="4"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="BiochemLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Biology-lab"/>+						<facilityName value="Chemistry-lab"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Classroom_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="DiningHall">+				<locationProfile capacity="30">+					<facilities>+						<facilityName value="Seats"/>+						<facilityName value="Tables"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="PhysicsLab_2">+				<locationProfile capacity="8">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="Teacher_01">+				<teacherProfile maximumTeachingRatio="0.6" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Geography/History">+							<subject topic="Geography" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="English" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_02">+				<teacherProfile maximumTeachingRatio="0.6">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Maths">+							<subject topic="Maths" level="Pure 1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2" synchronisationId="Physics streams">+							<subject topic="Physics" level="1.B"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_03">+				<teacherProfile maximumTeachingRatio="0.6" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Maths">+							<subject topic="Maths" level="Applied 1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2" synchronisationId="Physics streams">+							<subject topic="Physics" level="1.A"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_04">+				<teacherProfile locationId="BiochemLab_1" maximumTeachingRatio="0.6" specialtyTopic="Chemistry">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Chemistry" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Biology" level="1"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_05">+				<teacherProfile maximumTeachingRatio="0.6" specialtyTopic="History">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Geography/History">+							<subject topic="History" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1">+					<student studentId="Student_1.0"/>+					<student studentId="Student_1.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="Applied 1"/>+							<subject topic="Physics" level="1.A"/>+						</core>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2">+					<student studentId="Student_2.0"/>+					<student studentId="Student_2.1"/>+					<student studentId="Student_2.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="Pure 1"/>+							<subject topic="Physics" level="1.B"/>+						</core>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3">+					<student studentId="Student_3.0"/>+					<student studentId="Student_3.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.72">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Geography" level="1"/>+							<subject topic="Maths" level="Applied 1"/>+							<subject topic="Physics" level="1.B"/>+						</core>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue>+			<group groupId="Administrators">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Monday"/>+						</time><time timeslotId="0">+							<day value="Wednesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Lunch">+				<groupProfile locationId="DiningHall">+					<meetingTimes>+						<time timeslotId="2">+							<day value="Monday"/>+						</time><time timeslotId="2">+							<day value="Tuesday"/>+						</time><time timeslotId="2">+							<day value="Wednesday"/>+						</time><time timeslotId="2">+							<day value="Thursday"/>+						</time><time timeslotId="2">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group>+		</groupCatalogue>+	</problemParameters>+</options>+
+ xml/example_08.xml view
@@ -0,0 +1,1266 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2013-2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies nInitialScouts="2">+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="2048"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="1024"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="2048"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</x><y>+				<timetableAxisTraversal sense="True" axis="ObserverId"/>+			</y><z>+				<timetableAxisTraversal sense="True" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="0.01" greatestMinimumConsecutiveLessons="0.0753" greatestRemainingCourseLessons="0.0084" greatestSynchronisedCourseSetSize="0.2653" isCoreKnowledgeRequirement="0.0229" isSpecialistInTopic="0.0018" matchCourseClassSizeToLocationCapacity="0.0112" maximiseRelativeFacilityUtilisation="0.0079" minimiseBookingAtAnotherCoursesSpecifiedTime="0.1947" minimiseBookingOfLocationByOtherTeachers="0.0034" minimiseDeviationFromTimeslotRequest="0.028" minimiseInterCampusMigrationsOfStudents="0.0682" minimiseInterCampusMigrationsOfTeachers="0.0396" minimiseStudentBodyCombinations="0.2577" minimiseTeachersLocusOperandi="0.007" minimiseWasteOfScarceFacilities="1"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="3.125e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0.5" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="6.25e-2" minimiseDispersionOfStudentFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0.25" minimiseMeanInterCampusMigrationsOfTeachers="0.5" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.25" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_08.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="7"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="AssemblyHall">+				<locationProfile capacity="40">+					<facilities>+						<facilityName value="Lectern"/>+						<facilityName value="Pipe-organ"/>+						<facilityName value="Seats"/>+					</facilities>+				</locationProfile>+			</location><location locationId="BiologyLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="BiologyLab_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="ChemistryLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Chemistry-lab"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Classroom_1">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_3">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_4">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="DiningHall">+				<locationProfile capacity="40">+					<facilities>+						<facilityName value="Seats"/>+						<facilityName value="Tables"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="GamesField">+				<locationProfile capacity="40" campus="Sports-complex">+					<facilities>+						<facilityName value="Goal-posts"/>+						<facilityName value="Running-track"/>+						<facilityName value="Showers"/>+					</facilities>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Gym">+				<locationProfile capacity="6" campus="Sports-complex">+					<facilities>+						<facilityName value="Gym-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="MusicRoom_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="MusicRoom_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="PhysicsLab_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="Teacher_01">+				<teacherProfile maximumTeachingRatio="0.0">+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_02">+				<teacherProfile locationId="MusicRoom_1" maximumTeachingRatio="0.625" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Music" level="1"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="7"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="7"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Music" level="3"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="7"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+						<member groupId="Musicians"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_03">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Thursday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_04">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Geography/History 3">+							<subject topic="Geography" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5" synchronisationId="Geography/History 4">+							<subject topic="Geography" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_05">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Domestic Science">+					<service>+						<course requiredLessonsPerWeek="2" minimumConsecutiveLessons="2" maximumClassSize="4">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="3"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="3" minimumConsecutiveLessons="2">+							<subject topic="Domestic Science" level="2"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="3"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Domestic Science" level="3"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="3"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_06">+				<teacherProfile locationId="BiologyLab_1" maximumTeachingRatio="0.625" specialtyTopic="Biology">+					<service>+						<course requiredLessonsPerWeek="5">+							<subject topic="Biology" level="4"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_07">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Maths" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_08">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="French">+					<service>+						<course requiredLessonsPerWeek="4">+							<subject topic="French" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="French" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_09">+				<teacherProfile locationId="ChemistryLab_1" maximumTeachingRatio="0.625" specialtyTopic="Chemistry">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Chemistry" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Chemistry" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Chemistry" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_10">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Games">+					<service>+						<course requiredLessonsPerWeek="3" minimumConsecutiveLessons="3">+							<subject topic="Games" level=""/>+							<requiredFacilities>+								<facilityName value="Running-track"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="5">+										<day value="Wednesday"/>+									</time><time timeslotId="6">+										<day value="Wednesday"/>+									</time><time timeslotId="7">+										<day value="Wednesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_11">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Physics 3 stream">+							<subject topic="Physics" level="3.A"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Physics" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_12">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="4" maximumClassSize="3" synchronisationId="Physics 3 stream">+							<subject topic="Physics" level="3.B"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Physics" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_13">+				<teacherProfile locationId="BiologyLab_2" maximumTeachingRatio="0.625" specialtyTopic="Biology">+					<service>+						<course requiredLessonsPerWeek="4">+							<subject topic="Biology" level="3"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Biology" level="4"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_14">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Domestic Science">+					<service>+						<course requiredLessonsPerWeek="2" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="3"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="3" minimumConsecutiveLessons="2">+							<subject topic="Domestic Science" level="2"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="3"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="3"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="3"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_15">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Physical Education">+					<service>+						<course requiredLessonsPerWeek="3" minimumConsecutiveLessons="3">+							<subject topic="Games" level=""/>+							<requiredFacilities>+								<facilityName value="Goal-posts"/>+								<facilityName value="Showers"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="5">+										<day value="Tuesday"/>+									</time><time timeslotId="6">+										<day value="Tuesday"/>+									</time><time timeslotId="7">+										<day value="Tuesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="1">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_16">+				<teacherProfile locationId="MusicRoom_2" maximumTeachingRatio="0.625" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Music" level="1"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="7"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch"/>+						<member groupId="Musicians"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_17">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_18">+				<teacherProfile maximumTeachingRatio="0.625" specialtyTopic="History">+					<service>+						<course requiredLessonsPerWeek="4" synchronisationId="Geography/History 3">+							<subject topic="History" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5" synchronisationId="Geography/History 4">+							<subject topic="History" level="4"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch"/>+					</groupMembership>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_01">+					<student studentId="Student_01.0"/>+					<student studentId="Student_01.1"/>+					<student studentId="Student_01.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">	<!-- 5/8 -->+					<knowledgeRequirements>+						<core>+							<subject topic="French" level="3"/>+							<subject topic="Geography" level="3"/>+							<subject topic="Maths" level="4"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="3.A"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_02">+					<student studentId="Student_02.0"/>+					<student studentId="Student_02.1"/>+					<student studentId="Student_02.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="4"/>+							<subject topic="French" level="4"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="4"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+							<subject topic="Music" level="3"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_03">+					<student studentId="Student_03.0"/>+					<student studentId="Student_03.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="French" level="3"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="3"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_04">+					<student studentId="Student_04.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="4"/>+							<subject topic="French" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="3.B"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_05">+					<student studentId="Student_05.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="4"/>+							<subject topic="Games" level=""/>+							<subject topic="History" level="4"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="4"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_06">+					<student studentId="Student_06.0"/>+					<student studentId="Student_06.1"/>+					<student studentId="Student_06.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="4"/>+							<subject topic="Chemistry" level="4"/>+							<subject topic="French" level="3"/>+							<subject topic="Maths" level="4"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_07">+					<student studentId="Student_07.0"/>+					<student studentId="Student_07.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="4"/>+							<subject topic="French" level="3"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="4"/>+							<subject topic="Physics" level="4"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_08">+					<student studentId="Student_08.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="Chemistry" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physics" level="4"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+							<subject topic="Music" level="3"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_09">+					<student studentId="Student_09.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="History" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physics" level="3.A"/>+							<subject topic="Religious Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_10">+					<student studentId="Student_10.0"/>+					<student studentId="Student_10.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="Chemistry" level="3"/>+							<subject topic="Geography" level="4"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="1"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+							<subject topic="Music" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_11">+					<student studentId="Student_11.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.625">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="History" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="3.B"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+							<subject topic="Music" level="3"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue>+			<group groupId="Administrators">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Tuesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Assembly">+				<groupProfile locationId="AssemblyHall">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Monday"/>+						</time><time timeslotId="0">+							<day value="Tuesday"/>+						</time><time timeslotId="0">+							<day value="Wednesday"/>+						</time><time timeslotId="0">+							<day value="Thursday"/>+						</time><time timeslotId="0">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Choir">+				<groupProfile locationId="MusicRoom_1" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="7">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Drama">+				<groupProfile locationId="MusicRoom_2" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="7">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Lunch">+				<groupProfile locationId="DiningHall">+					<meetingTimes>+						<time timeslotId="4">+							<day value="Monday"/>+						</time><time timeslotId="4">+							<day value="Tuesday"/>+						</time><time timeslotId="4">+							<day value="Wednesday"/>+						</time><time timeslotId="4">+							<day value="Thursday"/>+						</time><time timeslotId="4">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Musicians">+				<groupProfile mandatesAttendance="True"/>+			</group><group groupId="Science-teachers">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Wednesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Sport-teachers">+				<groupProfile mandatesAttendance="True"/>+			</group>+		</groupCatalogue>+	</problemParameters>+</options>+
+ xml/example_13.xml view
@@ -0,0 +1,1645 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2013-2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies nInitialScouts="2">+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="2048" randomConstructorFecundity="4096"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="1024"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="False" axis="ObserverId"/>+			</x><y>+				<timetableAxisTraversal sense="True" axis="Day"/>+			</y><z>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="0.0048" greatestMinimumConsecutiveLessons="0.0915" greatestRemainingCourseLessons="0.0141" greatestSynchronisedCourseSetSize="0.1467" isCoreKnowledgeRequirement="0.012" isSpecialistInTopic="0.0052" matchCourseClassSizeToLocationCapacity="0.0053" maximiseRelativeFacilityUtilisation="0.0057" minimiseBookingAtAnotherCoursesSpecifiedTime="1" minimiseBookingOfLocationByOtherTeachers="0.0073" minimiseDeviationFromTimeslotRequest="0.0187" minimiseInterCampusMigrationsOfStudents="0.1178" minimiseInterCampusMigrationsOfTeachers="0.0632" minimiseStudentBodyCombinations="0.0342" minimiseTeachersLocusOperandi="0.0059" minimiseWasteOfScarceFacilities="0.0761"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="1.5625e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0.5" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="7.8125e-3" minimiseDispersionOfTeacherFreePeriodsPerDay="1.5625e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0.5" minimiseMeanInterCampusMigrationsOfTeachers="0.5" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.25" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_13.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="12"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="ArtRoom">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Art-tools"/>+						<facilityName value="Drawing-desks"/>+						<facilityName value="Easels"/>+						<facilityName value="Sinks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="AssemblyHall">+				<locationProfile capacity="40">+					<facilities>+						<facilityName value="Lectern"/>+						<facilityName value="Pipe-organ"/>+						<facilityName value="Seats"/>+					</facilities>+				</locationProfile>+			</location><location locationId="BiologyLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="BiologyLab_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="ChemistryLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Chemistry-lab"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Classroom_1">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_3">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_4">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="DiningHall">+				<locationProfile capacity="60">+					<facilities>+						<facilityName value="Seats"/>+						<facilityName value="Tables"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="GamesField">+				<locationProfile capacity="40" campus="Sports-complex">+					<facilities>+						<facilityName value="Goal-posts"/>+						<facilityName value="Running-track"/>+						<facilityName value="Showers"/>+					</facilities>+					<availability>+						<day value="Sunday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Saturday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Gym">+				<locationProfile capacity="6" campus="Sports-complex">+					<facilities>+						<facilityName value="Gym-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="MusicRoom_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="MusicRoom_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="PhysicsLab_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="SwimmingBaths">+				<locationProfile capacity="20" campus="Sports-complex">+					<facilities>+						<facilityName value="Swimming-pool"/>+					</facilities>+				</locationProfile>+			</location><location locationId="WoodworkRoom">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Wood-tools"/>+						<facilityName value="Work-benches"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="Teacher_01">+				<teacherProfile maximumTeachingRatio="0.0">+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_02">+				<teacherProfile locationId="MusicRoom_1" maximumTeachingRatio="0.616" specialtyTopic="Music">	<!-- 8/13 rounded-up -->+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Music" level="3"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_03">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="German">+					<service>+						<course requiredLessonsPerWeek="3" synchronisationId="Foreign Languages/1">+							<subject topic="German" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" synchronisationId="Foreign Languages/2">+							<subject topic="German" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5" synchronisationId="Foreign Languages/3">+							<subject topic="German" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_04">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="English" freePeriodPreference="Post">+					<service>+						<course requiredLessonsPerWeek="5">+							<subject topic="English" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="English" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_05">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="Geography" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Geography" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5" synchronisationId="Geography/History 3">+							<subject topic="Geography" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_06">+				<teacherProfile maximumTeachingRatio="0.616">+					<service>+						<course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_07">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="Maths" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_08">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="French">+					<service>+						<course requiredLessonsPerWeek="3" synchronisationId="Foreign Languages/1">+							<subject topic="French" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" synchronisationId="Foreign Languages/2">+							<subject topic="French" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_09">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="English">+					<service>+						<course requiredLessonsPerWeek="5">+							<subject topic="English" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5">+							<subject topic="English" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Debating"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_10">+				<teacherProfile locationId="ChemistryLab_1" maximumTeachingRatio="0.616" specialtyTopic="Chemistry">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Chemistry" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Chemistry" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="Chemistry" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_A"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_11">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Games">+					<service>+						<course requiredLessonsPerWeek="5" minimumConsecutiveLessons="5">+							<subject topic="Games" level=""/>+							<requiredFacilities>+								<facilityName value="Running-track"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="8">+										<day value="Wednesday"/>+									</time><time timeslotId="9">+										<day value="Wednesday"/>+									</time><time timeslotId="10">+										<day value="Wednesday"/>+									</time><time timeslotId="11">+										<day value="Wednesday"/>+									</time><time timeslotId="12">+										<day value="Wednesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Physical Education" level="2"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Physical Education" level="3"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="1"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="2"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="3"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_12">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physics" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Physics" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2" synchronisationId="Physics 3 stream">+							<subject topic="Physics" level="3.A"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_A"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_13">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physics" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Physics" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2" maximumClassSize="3" synchronisationId="Physics 3 stream">+							<subject topic="Physics" level="3.B"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_14">+				<teacherProfile locationId="BiologyLab_2" maximumTeachingRatio="0.616" specialtyTopic="Biology">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Biology" level="1"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Biology" level="2"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="Biology" level="3"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Chess"/>+						<member groupId="Lunch_A"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_15">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Domestic Science" freePeriodPreference="Terminal">+					<service>+						<course requiredLessonsPerWeek="2" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="4"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="2"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="4"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="3"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="4"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_16">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Physical Education">+					<service>+						<course requiredLessonsPerWeek="5" minimumConsecutiveLessons="5">+							<subject topic="Games" level=""/>+							<requiredFacilities>+								<facilityName value="Goal-posts"/>+								<facilityName value="Showers"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="8">+										<day value="Tuesday"/>+									</time><time timeslotId="9">+										<day value="Tuesday"/>+									</time><time timeslotId="10">+										<day value="Tuesday"/>+									</time><time timeslotId="11">+										<day value="Tuesday"/>+									</time><time timeslotId="12">+										<day value="Tuesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Physical Education" level="2"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Physical Education" level="3"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="1"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="2"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="3"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_A"/>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_17">+				<teacherProfile locationId="MusicRoom_2" maximumTeachingRatio="0.616" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="1">+							<subject topic="Music" level="1"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_18">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Religious Education" level="2"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_19">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="History">+					<service>+						<course requiredLessonsPerWeek="3">+							<subject topic="History" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="History" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5" synchronisationId="Geography/History 3">+							<subject topic="History" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_20">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Chinese">+					<service>+						<course requiredLessonsPerWeek="3" synchronisationId="Foreign Languages/1">+							<subject topic="Chinese" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" synchronisationId="Foreign Languages/2">+							<subject topic="Chinese" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="5" synchronisationId="Foreign Languages/3">+							<subject topic="Chinese" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_21">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Woodwork">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Woodwork" level="1"/>+							<requiredFacilities>+								<facilityName value="Wood-tools"/>+								<facilityName value="Work-benches"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Woodwork" level="2"/>+							<requiredFacilities>+								<facilityName value="Wood-tools"/>+								<facilityName value="Work-benches"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_22">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Technical Drawing">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Technical Drawing" level="1"/>+							<requiredFacilities>+								<facilityName value="Drawing-desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Technical Drawing" level="2"/>+							<requiredFacilities>+								<facilityName value="Drawing-desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_23">+				<teacherProfile maximumTeachingRatio="0.616" specialtyTopic="Art">+					<service>+						<course requiredLessonsPerWeek="2">+							<subject topic="Art" level="1"/>+							<requiredFacilities>+								<facilityName value="Art-tools"/>+								<facilityName value="Easels"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="3">+							<subject topic="Art" level="2"/>+							<requiredFacilities>+								<facilityName value="Art-tools"/>+								<facilityName value="Easels"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4">+							<subject topic="Art" level="3"/>+							<requiredFacilities>+								<facilityName value="Art-tools"/>+								<facilityName value="Easels"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.0">+					<student studentId="Student_1.0.0"/>+					<student studentId="Student_1.0.1"/>+					<student studentId="Student_1.0.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">	<!-- 9/13 rounded-up -->+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="French" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Art" level="1"/>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Music" level="1"/>+							<subject topic="Woodwork" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.1">+					<student studentId="Student_1.1.0"/>+					<student studentId="Student_1.1.1"/>+					<student studentId="Student_1.1.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="German" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Art" level="2"/>+							<subject topic="Domestic Science" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Chess"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.2">+					<student studentId="Student_1.2.0"/>+					<student studentId="Student_1.2.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.693" freePeriodPreference="Post">+					<knowledgeRequirements>+						<core>+							<subject topic="English" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Art" level="1"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.3">+					<student studentId="Student_1.3.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chinese" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Art" level="1"/>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.0">+					<student studentId="Student_2.0.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="History" level="2"/>+							<subject topic="Physical Education" level="2"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="2"/>+							<subject topic="Music" level="2"/>+							<subject topic="Technical Drawing" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.1">+					<student studentId="Student_2.1.0"/>+					<student studentId="Student_2.1.1"/>+					<student studentId="Student_2.1.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="2"/>+							<subject topic="German" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="2"/>+							<subject topic="Religious Education" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Art" level="2"/>+							<subject topic="Domestic Science" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Chess"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.2">+					<student studentId="Student_2.2.0"/>+					<student studentId="Student_2.2.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Chinese" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Art" level="1"/>+							<subject topic="Music" level="2"/>+							<subject topic="Technical Drawing" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.3">+					<student studentId="Student_2.3.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="History" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Music" level="2"/>+							<subject topic="Woodwork" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3.0">+					<student studentId="Student_3.0.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Chinese" level="3"/>+							<subject topic="English" level="3"/>+							<subject topic="Games" level=""/>+							<subject topic="History" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physics" level="3.A"/>+							<subject topic="Swimming" level="3"/>+						</core>+						<optional>+							<subject topic="Domestic Science" level="3"/>+							<subject topic="Technical Drawing" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Chess"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3.1">+					<student studentId="Student_3.1.0"/>+					<student studentId="Student_3.1.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="Chemistry" level="3"/>+							<subject topic="English" level="3"/>+							<subject topic="German" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="3"/>+							<subject topic="Swimming" level="3"/>+						</core>+						<optional>+							<subject topic="Art" level="3"/>+							<subject topic="Domestic Science" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_B"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3.2">+					<student studentId="Student_3.2.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.693">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="English" level="3"/>+							<subject topic="Geography" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="3"/>+							<subject topic="Physics" level="3.B"/>+							<subject topic="Swimming" level="3"/>+						</core>+						<optional>+							<subject topic="Music" level="3"/>+							<subject topic="Technical Drawing" level="2"/>+							<subject topic="Woodwork" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_A"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue>+			<group groupId="Administrators">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Tuesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Assembly">+				<groupProfile locationId="AssemblyHall">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Monday"/>+						</time><time timeslotId="0">+							<day value="Tuesday"/>+						</time><time timeslotId="0">+							<day value="Wednesday"/>+						</time><time timeslotId="0">+							<day value="Thursday"/>+						</time><time timeslotId="0">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Chess">+				<groupProfile locationId="Classroom_1">+					<meetingTimes>+						<time timeslotId="12">+							<day value="Thursday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Choir">+				<groupProfile locationId="MusicRoom_1" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="12">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Debating">+				<groupProfile locationId="Classroom_2" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="12">+							<day value="Thursday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Drama">+				<groupProfile locationId="MusicRoom_2" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="12">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Lunch_A">+				<groupProfile locationId="DiningHall">+					<meetingTimes>+						<time timeslotId="6">+							<day value="Monday"/>+						</time><time timeslotId="6">+							<day value="Tuesday"/>+						</time><time timeslotId="6">+							<day value="Wednesday"/>+						</time><time timeslotId="6">+							<day value="Thursday"/>+						</time><time timeslotId="6">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Lunch_B">+				<groupProfile locationId="DiningHall">+					<meetingTimes>+						<time timeslotId="7">+							<day value="Monday"/>+						</time><time timeslotId="7">+							<day value="Tuesday"/>+						</time><time timeslotId="7">+							<day value="Wednesday"/>+						</time><time timeslotId="7">+							<day value="Thursday"/>+						</time><time timeslotId="7">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Science-teachers">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Wednesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Sport-teachers">+				<groupProfile mandatesAttendance="True"/>+			</group>+		</groupCatalogue>+	</problemParameters>+</options>+
+ xml/example_21.xml view
@@ -0,0 +1,1743 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies nInitialScouts="4">+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="256"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="256" randomConstructorFecundity="256"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="128" randomConstructorFecundity="256"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+<!--+		<traversalOrder>+			<x>+				<timetableAxisTraversal sense="True" axis="ObserverId"/>+			</x><y>+				<timetableAxisTraversal sense="True" axis="TimeslotId"/>+			</y><z>+				<timetableAxisTraversal sense="False" axis="Day"/>+			</z>+		</traversalOrder>+-->+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="8.62e-3" greatestMinimumConsecutiveLessons="0.118" greatestRemainingCourseLessons="1.33e-2" greatestSynchronisedCourseSetSize="0.229" isCoreKnowledgeRequirement="1.03e-2" isSpecialistInTopic="5.87e-3" matchCourseClassSizeToLocationCapacity="1.16e-2" maximiseRelativeFacilityUtilisation="1.21e-2" minimiseBookingAtAnotherCoursesSpecifiedTime="1" minimiseBookingOfLocationByOtherTeachers="1.11e-2" minimiseDeviationFromTimeslotRequest="2.72e-2" minimiseInterCampusMigrationsOfStudents="0.1" minimiseInterCampusMigrationsOfTeachers="0.1" minimiseStudentBodyCombinations="2.26e-2" minimiseTeachersLocusOperandi="1.46e-2" minimiseWasteOfScarceFacilities="0.110"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="6.25e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0.5" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="1.5625e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0.5" minimiseMeanInterCampusMigrationsOfTeachers="0.5" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.25" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+				<xhtml>+					<style>+						<displayViews>+							<perspective view="StudentView"/>+							<perspective view="TeacherView"/>+							<perspective view="LocationView"/>+						</displayViews>+						<mergeDuplicateTimeslots>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</mergeDuplicateTimeslots>+						<displayAxisLabels>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</displayAxisLabels>+						<weekend>+							<day value="Saturday"/>+							<day value="Sunday"/>+						</weekend>+						<generateLessonColour generateLessonColourFrom="Topic"/>+					</style>+				</xhtml>+			</fileFormat>+<!--+			<fileFormat filePath="xml/studentViewTimetable_13.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<timeslotIdBounds>+			<min timeslotId="0"/>+			<max timeslotId="20"/>+		</timeslotIdBounds>+		<locationCatalogue>+			<location locationId="ArtRoom">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Art-tools"/>+						<facilityName value="Drawing-desks"/>+						<facilityName value="Easels"/>+						<facilityName value="Sinks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="AssemblyHall">+				<locationProfile capacity="40">+					<facilities>+						<facilityName value="Lectern"/>+						<facilityName value="Pipe-organ"/>+						<facilityName value="Seats"/>+					</facilities>+				</locationProfile>+			</location><location locationId="BiologyLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="BiologyLab_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Biology-lab"/>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="ChemistryLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Chemistry-lab"/>+						<facilityName value="Desks"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Classroom_1">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_2">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_3">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="Classroom_4">+				<locationProfile capacity="16">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="DiningHall_1">+				<locationProfile capacity="60">+					<facilities>+						<facilityName value="Seats"/>+						<facilityName value="Tables"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="DiningHall_2">+				<locationProfile capacity="60">+					<facilities>+						<facilityName value="Seats"/>+						<facilityName value="Tables"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="GamesField">+				<locationProfile capacity="40">+					<facilities>+						<facilityName value="Goal-posts"/>+						<facilityName value="Running-track"/>+						<facilityName value="Showers"/>+					</facilities>+					<availability>+						<day value="Sunday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Saturday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Gym">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Gym-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Kitchen_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Kitchen-equipment"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="MusicRoom_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="MusicRoom_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Musical instruments"/>+					</facilities>+				</locationProfile>+			</location><location locationId="PhysicsLab_1">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="PhysicsLab_2">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Blackboard"/>+						<facilityName value="Desks"/>+						<facilityName value="Physics-lab"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location><location locationId="Pottery">+				<locationProfile capacity="6">+					<facilities>+						<facilityName value="Kiln"/>+						<facilityName value="Potter's Wheel"/>+						<facilityName value="Pug-mill"/>+						<facilityName value="Sinks"/>+					</facilities>+				</locationProfile>+			</location><location locationId="SwimmingBaths">+				<locationProfile capacity="20">+					<facilities>+						<facilityName value="Swimming-pool"/>+					</facilities>+				</locationProfile>+			</location><location locationId="WoodworkRoom">+				<locationProfile capacity="12">+					<facilities>+						<facilityName value="Wood-tools"/>+						<facilityName value="Work-benches"/>+					</facilities>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+				</locationProfile>+			</location>+		</locationCatalogue>+		<teacherRegister>+			<teacher teacherId="Teacher_01">+				<teacherProfile maximumTeachingRatio="0.0">+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_02">+				<teacherProfile locationId="MusicRoom_1" maximumTeachingRatio="0.714" specialtyTopic="Music">	<!-- 15/21 rounded-up -->+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Music" level="3"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_03">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="German">+					<service>+						<course requiredLessonsPerWeek="6" synchronisationId="Foreign Languages/1" minimumConsecutiveLessons="2">+							<subject topic="German" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" synchronisationId="Foreign Languages/2" minimumConsecutiveLessons="2">+							<subject topic="German" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="10" synchronisationId="Foreign Languages/3" minimumConsecutiveLessons="2">+							<subject topic="German" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_04">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="English" freePeriodPreference="Post">+					<service>+						<course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="English" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="10" minimumConsecutiveLessons="2">+							<subject topic="English" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="12" minimumConsecutiveLessons="2">+							<subject topic="English" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_05">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Geography">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Geography" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="Geography" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="10" synchronisationId="Geography/History 3" minimumConsecutiveLessons="2">+							<subject topic="Geography" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_06">+				<teacherProfile maximumTeachingRatio="0.714">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Maths" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="10" minimumConsecutiveLessons="2">+							<subject topic="Maths" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_07">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Maths">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Maths" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="Maths" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="10" minimumConsecutiveLessons="2">+							<subject topic="Maths" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="1"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Drama"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_08">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="French">+					<service>+						<course requiredLessonsPerWeek="6" synchronisationId="Foreign Languages/1" minimumConsecutiveLessons="2">+							<subject topic="French" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" synchronisationId="Foreign Languages/2" minimumConsecutiveLessons="2">+							<subject topic="French" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_09">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="English">+					<service>+						<course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="English" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="10" minimumConsecutiveLessons="2">+							<subject topic="English" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="12" minimumConsecutiveLessons="2">+							<subject topic="English" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_10">+				<teacherProfile locationId="ChemistryLab_1" maximumTeachingRatio="0.714" specialtyTopic="Chemistry">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="3">+							<subject topic="Chemistry" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="9" minimumConsecutiveLessons="3">+							<subject topic="Chemistry" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="12" minimumConsecutiveLessons="3">+							<subject topic="Chemistry" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Chemistry-lab"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_1"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_11">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Games">+					<service>+						<course requiredLessonsPerWeek="8" minimumConsecutiveLessons="8">+							<subject topic="Games" level=""/>+							<requiredFacilities>+								<facilityName value="Running-track"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="13">+										<day value="Wednesday"/>+									</time><time timeslotId="20">+										<day value="Wednesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physical Education" level="2"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physical Education" level="3"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="1"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="2"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="3"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_12">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="8" minimumConsecutiveLessons="4">+							<subject topic="Physics" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="12" minimumConsecutiveLessons="4">+							<subject topic="Physics" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="16" minimumConsecutiveLessons="4" synchronisationId="Physics 3 stream">+							<subject topic="Physics" level="3.A"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_1"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_13">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Physics">+					<service>+						<course requiredLessonsPerWeek="8" minimumConsecutiveLessons="4">+							<subject topic="Physics" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="12" minimumConsecutiveLessons="4">+							<subject topic="Physics" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="16" minimumConsecutiveLessons="4" maximumClassSize="3" synchronisationId="Physics 3 stream">+							<subject topic="Physics" level="3.B"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+								<facilityName value="Physics-lab"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_14">+				<teacherProfile locationId="BiologyLab_2" maximumTeachingRatio="0.714" specialtyTopic="Biology">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="3">+							<subject topic="Biology" level="1"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="9" minimumConsecutiveLessons="3">+							<subject topic="Biology" level="2"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="12" minimumConsecutiveLessons="3">+							<subject topic="Biology" level="3"/>+							<requiredFacilities>+								<facilityName value="Biology-lab"/>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Chess"/>+						<member groupId="Lunch_1"/>+						<member groupId="Science-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_15">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Domestic Science" freePeriodPreference="Terminal">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="1"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="9"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="2"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="9"/>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2" maximumClassSize="8">+							<subject topic="Domestic Science" level="3"/>+							<requiredFacilities>+								<facilityName value="Kitchen-equipment"/>+							</requiredFacilities>+							<timeslotRequest>+								<ideally timeslotId="9"/>+							</timeslotRequest>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_16">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Physical Education">+					<service>+						<course requiredLessonsPerWeek="8" minimumConsecutiveLessons="8">+							<subject topic="Games" level=""/>+							<requiredFacilities>+								<facilityName value="Goal-posts"/>+								<facilityName value="Showers"/>+							</requiredFacilities>+							<timeslotRequest>+								<specifically>+									<time timeslotId="13">+										<day value="Tuesday"/>+									</time><time timeslotId="20">+										<day value="Tuesday"/>+									</time>+								</specifically>+							</timeslotRequest>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physical Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physical Education" level="2"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Physical Education" level="3"/>+							<requiredFacilities>+								<facilityName value="Gym-equipment"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="1"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="2"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Swimming" level="3"/>+							<requiredFacilities>+								<facilityName value="Swimming-pool"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Friday"/>+						<day value="Saturday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_1"/>+						<member groupId="Sport-teachers"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_17">+				<teacherProfile locationId="MusicRoom_2" maximumTeachingRatio="0.714" specialtyTopic="Music">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Music" level="1"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Music" level="2"/>+							<requiredFacilities>+								<facilityName value="Musical instruments"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_18">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Religious Education">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Religious Education" level="1"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Religious Education" level="2"/>+							<requiredFacilities>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Thursday"/>+					</availability>+					<groupMembership>+						<member groupId="Administrators"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_19">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="History">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="History" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="History" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="10" minimumConsecutiveLessons="2" synchronisationId="Geography/History 3">+							<subject topic="History" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_20">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Chinese">+					<service>+						<course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2" synchronisationId="Foreign Languages/1">+							<subject topic="Chinese" level="1"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2" synchronisationId="Foreign Languages/2">+							<subject topic="Chinese" level="2"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="10" minimumConsecutiveLessons="2" synchronisationId="Foreign Languages/3">+							<subject topic="Chinese" level="3"/>+							<requiredFacilities>+								<facilityName value="Blackboard"/>+								<facilityName value="Desks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_21">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Woodwork">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Technical Drawing" level="1"/>+							<requiredFacilities>+								<facilityName value="Drawing-desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Woodwork" level="1"/>+							<requiredFacilities>+								<facilityName value="Wood-tools"/>+								<facilityName value="Work-benches"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Woodwork" level="2"/>+							<requiredFacilities>+								<facilityName value="Wood-tools"/>+								<facilityName value="Work-benches"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_22">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Technical Drawing">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Technical Drawing" level="1"/>+							<requiredFacilities>+								<facilityName value="Drawing-desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Technical Drawing" level="2"/>+							<requiredFacilities>+								<facilityName value="Drawing-desks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Woodwork" level="1"/>+							<requiredFacilities>+								<facilityName value="Wood-tools"/>+								<facilityName value="Work-benches"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</teacherProfile>+			</teacher><teacher teacherId="Teacher_23">+				<teacherProfile maximumTeachingRatio="0.714" specialtyTopic="Art">+					<service>+						<course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Pottery" level="1"/>+							<requiredFacilities>+								<facilityName value="Kiln"/>+								<facilityName value="Potter's Wheel"/>+								<facilityName value="Pug-mill"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="4" minimumConsecutiveLessons="2">+							<subject topic="Art" level="1"/>+							<requiredFacilities>+								<facilityName value="Art-tools"/>+								<facilityName value="Easels"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="6" minimumConsecutiveLessons="2">+							<subject topic="Art" level="2"/>+							<requiredFacilities>+								<facilityName value="Art-tools"/>+								<facilityName value="Easels"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course><course requiredLessonsPerWeek="8" minimumConsecutiveLessons="2">+							<subject topic="Art" level="3"/>+							<requiredFacilities>+								<facilityName value="Art-tools"/>+								<facilityName value="Easels"/>+								<facilityName value="Sinks"/>+							</requiredFacilities>+						</course>+					</service>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</teacherProfile>+			</teacher>+		</teacherRegister>+		<studentBodyRegister>+			<studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.0">+					<student studentId="Student_1.0.0"/>+					<student studentId="Student_1.0.1"/>+					<student studentId="Student_1.0.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">	<!-- 16/21 rounded-up -->+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="French" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Pottery" level="1"/>+							<subject topic="Domestic Science" level="1"/>+							<subject topic="Woodwork" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.1">+					<student studentId="Student_1.1.0"/>+					<student studentId="Student_1.1.1"/>+					<student studentId="Student_1.1.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="German" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Art" level="1"/>+							<subject topic="Pottery" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Chess"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.2">+					<student studentId="Student_1.2.0"/>+					<student studentId="Student_1.2.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.762" freePeriodPreference="Post">+					<knowledgeRequirements>+						<core>+							<subject topic="Chemistry" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Music" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_1.3">+					<student studentId="Student_1.3.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="1"/>+							<subject topic="Chemistry" level="1"/>+							<subject topic="Chinese" level="1"/>+							<subject topic="English" level="1"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="1"/>+							<subject topic="History" level="1"/>+							<subject topic="Maths" level="1"/>+							<subject topic="Physical Education" level="1"/>+							<subject topic="Physics" level="1"/>+							<subject topic="Religious Education" level="1"/>+							<subject topic="Swimming" level="1"/>+						</core>+						<optional>+							<subject topic="Technical Drawing" level="1"/>+							<subject topic="Pottery" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.0">+					<student studentId="Student_2.0.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="History" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Music" level="2"/>+							<subject topic="Technical Drawing" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.1">+					<student studentId="Student_2.1.0"/>+					<student studentId="Student_2.1.1"/>+					<student studentId="Student_2.1.2"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="English" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="2"/>+							<subject topic="German" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physical Education" level="2"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Religious Education" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Art" level="2"/>+							<subject topic="Domestic Science" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Chess"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.2">+					<student studentId="Student_2.2.0"/>+					<student studentId="Student_2.2.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="Chinese" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="Games" level=""/>+							<subject topic="Geography" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Art" level="2"/>+							<subject topic="Music" level="2"/>+							<subject topic="Technical Drawing" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_2.3">+					<student studentId="Student_2.3.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="2"/>+							<subject topic="Chemistry" level="2"/>+							<subject topic="English" level="2"/>+							<subject topic="French" level="2"/>+							<subject topic="History" level="2"/>+							<subject topic="Maths" level="2"/>+							<subject topic="Physics" level="2"/>+							<subject topic="Swimming" level="2"/>+						</core>+						<optional>+							<subject topic="Art" level="2"/>+							<subject topic="Woodwork" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Drama"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3.0">+					<student studentId="Student_3.0.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Chinese" level="3"/>+							<subject topic="English" level="3"/>+							<subject topic="Games" level=""/>+							<subject topic="History" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physics" level="3.A"/>+							<subject topic="Swimming" level="3"/>+						</core>+						<optional>+							<subject topic="Music" level="3"/>+							<subject topic="Technical Drawing" level="1"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Chess"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3.1">+					<student studentId="Student_3.1.0"/>+					<student studentId="Student_3.1.1"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="Chemistry" level="3"/>+							<subject topic="English" level="3"/>+							<subject topic="German" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="3"/>+							<subject topic="Swimming" level="3"/>+						</core>+						<optional>+							<subject topic="Art" level="3"/>+							<subject topic="Domestic Science" level="3"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Debating"/>+						<member groupId="Lunch_2"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation><studentBodyToProfileAssociation>+				<studentBody mnemonic="Body_3.2">+					<student studentId="Student_3.2.0"/>+				</studentBody>+				<studentProfile teachingRatio="0.762">+					<knowledgeRequirements>+						<core>+							<subject topic="Biology" level="3"/>+							<subject topic="English" level="3"/>+							<subject topic="Geography" level="3"/>+							<subject topic="Maths" level="3"/>+							<subject topic="Physical Education" level="3"/>+							<subject topic="Physics" level="3.B"/>+							<subject topic="Swimming" level="3"/>+						</core>+						<optional>+							<subject topic="Technical Drawing" level="2"/>+							<subject topic="Woodwork" level="2"/>+						</optional>+					</knowledgeRequirements>+					<availability>+						<day value="Monday"/>+						<day value="Tuesday"/>+						<day value="Wednesday"/>+						<day value="Thursday"/>+						<day value="Friday"/>+					</availability>+					<groupMembership>+						<member groupId="Assembly"/>+						<member groupId="Choir"/>+						<member groupId="Lunch_1"/>+					</groupMembership>+				</studentProfile>+			</studentBodyToProfileAssociation>+		</studentBodyRegister>+		<groupCatalogue>+			<group groupId="Administrators">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Tuesday"/>+						</time><time timeslotId="1">+							<day value="Tuesday"/>+						</time><time timeslotId="0">+							<day value="Thursday"/>+						</time><time timeslotId="1">+							<day value="Thursday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Assembly">+				<groupProfile locationId="AssemblyHall">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Monday"/>+						</time><time timeslotId="0">+							<day value="Tuesday"/>+						</time><time timeslotId="0">+							<day value="Wednesday"/>+						</time><time timeslotId="0">+							<day value="Thursday"/>+						</time><time timeslotId="0">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Chess">+				<groupProfile locationId="Classroom_1">+					<meetingTimes>+						<time timeslotId="19">+							<day value="Thursday"/>+						</time><time timeslotId="20">+							<day value="Thursday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Choir">+				<groupProfile locationId="MusicRoom_1" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="19">+							<day value="Friday"/>+						</time><time timeslotId="20">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Debating">+				<groupProfile locationId="Classroom_2" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="19">+							<day value="Thursday"/>+						</time><time timeslotId="20">+							<day value="Thursday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Drama">+				<groupProfile locationId="MusicRoom_2" mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="19">+							<day value="Friday"/>+						</time><time timeslotId="20">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Lunch_1">+				<groupProfile locationId="DiningHall_1">+					<meetingTimes>+						<time timeslotId="10">+							<day value="Monday"/>+						</time><time timeslotId="10">+							<day value="Tuesday"/>+						</time><time timeslotId="10">+							<day value="Wednesday"/>+						</time><time timeslotId="10">+							<day value="Thursday"/>+						</time><time timeslotId="10">+							<day value="Friday"/>+						</time><time timeslotId="11">+							<day value="Monday"/>+						</time><time timeslotId="11">+							<day value="Tuesday"/>+						</time><time timeslotId="11">+							<day value="Wednesday"/>+						</time><time timeslotId="11">+							<day value="Thursday"/>+						</time><time timeslotId="11">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Lunch_2">+				<groupProfile locationId="DiningHall_2">+					<meetingTimes>+						<time timeslotId="11">+							<day value="Monday"/>+						</time><time timeslotId="11">+							<day value="Tuesday"/>+						</time><time timeslotId="11">+							<day value="Wednesday"/>+						</time><time timeslotId="11">+							<day value="Thursday"/>+						</time><time timeslotId="11">+							<day value="Friday"/>+						</time><time timeslotId="12">+							<day value="Monday"/>+						</time><time timeslotId="12">+							<day value="Tuesday"/>+						</time><time timeslotId="12">+							<day value="Wednesday"/>+						</time><time timeslotId="12">+							<day value="Thursday"/>+						</time><time timeslotId="12">+							<day value="Friday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Science-teachers">+				<groupProfile mandatesAttendance="True">+					<meetingTimes>+						<time timeslotId="0">+							<day value="Wednesday"/>+						</time>+					</meetingTimes>+				</groupProfile>+			</group><group groupId="Sport-teachers">+				<groupProfile mandatesAttendance="True"/>+			</group>+		</groupCatalogue>+	</problemParameters>+</options>+
+ xml/studentViewTimetable_01.xml view
@@ -0,0 +1,236 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_1">+        <student studentId="Student_1.0"/>+        <student studentId="Student_1.1"/>+        <student studentId="Student_1.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_3"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_4"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_1" teacherId="Teacher_2"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_1"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_1" teacherId="Teacher_2"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_2">+        <student studentId="Student_2.0"/>+        <student studentId="Student_2.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_3"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_4"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_1" teacherId="Teacher_2"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_1"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_4"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_3">+        <student studentId="Student_3.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_3"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_1" teacherId="Teacher_1"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_1" teacherId="Teacher_2"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_1" teacherId="Teacher_2"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Location_2" teacherId="Teacher_4"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/studentViewTimetable_02.xml view
@@ -0,0 +1,225 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_01">+        <student studentId="BallsHarry"/>+        <student studentId="BoardBill"/>+        <student studentId="BullTerry"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_02">+        <student studentId="BodyAnnie"/>+        <student studentId="BoyleLance"/>+        <student studentId="SpencerMarkN"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/studentViewTimetable_03.xml view
@@ -0,0 +1,259 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_01">+        <student studentId="BallsHarry"/>+        <student studentId="BoardBill"/>+        <student studentId="BullTerry"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="ShoeiJim"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="WallCathR"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="WallCathR"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_02">+        <student studentId="BodyAnnie"/>+        <student studentId="BoyleLance"/>+        <student studentId="SpencerMarkN"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="ShoeiJim"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/studentViewTimetable_05.xml view
@@ -0,0 +1,1858 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_01">+        <student studentId="BallsHarry"/>+        <student studentId="BoardBill"/>+        <student studentId="BullTerry"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="ShoeiJim"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="LynMandy"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_02">+        <student studentId="BodyAnnie"/>+        <student studentId="BoyleLance"/>+        <student studentId="SpencerMarkN"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="PaineJock"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="PoleDi"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_03">+        <student studentId="BushRose"/>+        <student studentId="PondLilly"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="PaineJock"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="PaineJock"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="PaineJock"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="PaineJock"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="BaptistAnna"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="LynMandy"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_04">+        <student studentId="DaySonny"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="ShoeiJim"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_05">+        <student studentId="EsterPolly"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="ShoeiJim"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="ShoeiJim"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="ShoeiJim"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="LynMandy"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="PaineJock"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_06">+        <student studentId="ForestWoody"/>+        <student studentId="HareLotta"/>+        <student studentId="LearSandy"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="SteinFrankN"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="ShoeiJim"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="SteinFrankN"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="LynMandy"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_07">+        <student studentId="GunnTommy"/>+        <student studentId="PostMark"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="SteinFrankN"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="SteinFrankN"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_08">+        <student studentId="LottMona"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="SteinFrankN"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="LyonDanD"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="SteinFrankN"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="BaptistAnna"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_09">+        <student studentId="PipeDwain"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="LynMandy"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="PaineJock"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="PaineJock"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="PaineJock"/>+              <subject topic="Games" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="TheronLou"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_10">+        <student studentId="PoleLou"/>+        <student studentId="PottJack"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="BannJoe"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="PaineJock"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="NuttHazel"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="IronsRusty"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_11">+        <student studentId="ShawRick"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="ShoeiJim"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="AnderCorrie"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="EasterleyGale"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="LynMandy"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="MasseyHugh"/>+              <subject topic="Physics" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="PooleJean"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="InnoveraMarge"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/studentViewTimetable_05_1.xml view
@@ -0,0 +1,516 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_1">+        <student studentId="Student_1.0"/>+        <student studentId="Student_1.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Physics" level="1.A"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Physics" level="1.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Physics" level="1.A"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Physics" level="1.A"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_2">+        <student studentId="Student_2.0"/>+        <student studentId="Student_2.1"/>+        <student studentId="Student_2.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Maths" level="Pure 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Maths" level="Pure 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Maths" level="Pure 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Maths" level="Pure 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_3">+        <student studentId="Student_3.0"/>+        <student studentId="Student_3.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="BiochemLab_1" teacherId="Teacher_04"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_01"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_03"/>+              <subject topic="Maths" level="Applied 1"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_02"/>+              <subject topic="Physics" level="1.B"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/studentViewTimetable_08.xml view
@@ -0,0 +1,2454 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_01">+        <student studentId="Student_01.0"/>+        <student studentId="Student_01.1"/>+        <student studentId="Student_01.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_17"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_02">+        <student studentId="Student_02.0"/>+        <student studentId="Student_02.1"/>+        <student studentId="Student_02.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_03">+        <student studentId="Student_03.0"/>+        <student studentId="Student_03.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_04">+        <student studentId="Student_04.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_05">+        <student studentId="Student_05.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_17"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_06">+        <student studentId="Student_06.0"/>+        <student studentId="Student_06.1"/>+        <student studentId="Student_06.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_07">+        <student studentId="Student_07.0"/>+        <student studentId="Student_07.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_08"/>+              <subject topic="French" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_06"/>+              <subject topic="Biology" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_08">+        <student studentId="Student_08.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_14"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_09">+        <student studentId="Student_09.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_15"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_11"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_17"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_16"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_10">+        <student studentId="Student_10.0"/>+        <student studentId="Student_10.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_10"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_04"/>+              <subject topic="Geography" level="4"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_09"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_11">+        <student studentId="Student_11.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_15"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_2" teacherId="Teacher_05"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_18"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_13"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/studentViewTimetable_13.xml view
@@ -0,0 +1,3929 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE timetable SYSTEM "../dtd/studentViewTimetable.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<timetable>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_1.0">+        <student studentId="Student_1.0.0"/>+        <student studentId="Student_1.0.1"/>+        <student studentId="Student_1.0.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_1.1">+        <student studentId="Student_1.1.0"/>+        <student studentId="Student_1.1.1"/>+        <student studentId="Student_1.1.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_1.2">+        <student studentId="Student_1.2.0"/>+        <student studentId="Student_1.2.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_1.3">+        <student studentId="Student_1.3.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_2.0">+        <student studentId="Student_2.0.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_16"/>+              <subject topic="Physical Education" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_16"/>+              <subject topic="Physical Education" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_2.1">+        <student studentId="Student_2.1.0"/>+        <student studentId="Student_2.1.1"/>+        <student studentId="Student_2.1.2"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_18"/>+              <subject topic="Religious Education" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_16"/>+              <subject topic="Physical Education" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_16"/>+              <subject topic="Physical Education" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_2.2">+        <student studentId="Student_2.2.0"/>+        <student studentId="Student_2.2.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_04"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_2.3">+        <student studentId="Student_2.3.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="2"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_2" teacherId="Teacher_17"/>+              <subject topic="Music" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_08"/>+              <subject topic="French" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_3.0">+        <student studentId="Student_3.0.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2"/>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="GamesField" teacherId="Teacher_16"/>+              <subject topic="Games" level=""/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_16"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_06"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_3" teacherId="Teacher_19"/>+              <subject topic="History" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_1" teacherId="Teacher_12"/>+              <subject topic="Physics" level="3.A"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_20"/>+              <subject topic="Chinese" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_3.1">+        <student studentId="Student_3.1.0"/>+        <student studentId="Student_3.1.1"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4"/>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="Kitchen_1" teacherId="Teacher_15"/>+              <subject topic="Domestic Science" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="9"/>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_23"/>+              <subject topic="Art" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="ChemistryLab_1" teacherId="Teacher_10"/>+              <subject topic="Chemistry" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_4" teacherId="Teacher_03"/>+              <subject topic="German" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+  <observerIdToTimetableAssociation>+    <observerId>+      <studentBody mnemonic="Body_3.2">+        <student studentId="Student_3.2.0"/>+      </studentBody>+    </observerId>+    <timetableForWeek>+      <dayToTimetableAssociation>+        <day value="Sunday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Monday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Tuesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="8"/>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Gym" teacherId="Teacher_11"/>+              <subject topic="Physical Education" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Wednesday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="MusicRoom_1" teacherId="Teacher_02"/>+              <subject topic="Music" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Thursday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="ArtRoom" teacherId="Teacher_22"/>+              <subject topic="Technical Drawing" level="2"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11">+            <lesson>+              <studentViewLessonResourceIds locationId="SwimmingBaths" teacherId="Teacher_11"/>+              <subject topic="Swimming" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Friday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="2">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_2" teacherId="Teacher_14"/>+              <subject topic="Biology" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="3">+            <lesson>+              <studentViewLessonResourceIds locationId="BiologyLab_1" teacherId="Teacher_07"/>+              <subject topic="Maths" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="4">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_1" teacherId="Teacher_05"/>+              <subject topic="Geography" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="5">+            <lesson>+              <studentViewLessonResourceIds locationId="WoodworkRoom" teacherId="Teacher_21"/>+              <subject topic="Woodwork" level="1"/>+            </lesson>+          </booking>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="9">+            <lesson>+              <studentViewLessonResourceIds locationId="PhysicsLab_2" teacherId="Teacher_13"/>+              <subject topic="Physics" level="3.B"/>+            </lesson>+          </booking>+          <booking timeslotId="10">+            <lesson>+              <studentViewLessonResourceIds locationId="Classroom_2" teacherId="Teacher_09"/>+              <subject topic="English" level="3"/>+            </lesson>+          </booking>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+      <dayToTimetableAssociation>+        <day value="Saturday"/>+        <timetableForDay>+          <booking timeslotId="0"/>+          <booking timeslotId="1"/>+          <booking timeslotId="2"/>+          <booking timeslotId="3"/>+          <booking timeslotId="4"/>+          <booking timeslotId="5"/>+          <booking timeslotId="6"/>+          <booking timeslotId="7"/>+          <booking timeslotId="8"/>+          <booking timeslotId="9"/>+          <booking timeslotId="10"/>+          <booking timeslotId="11"/>+          <booking timeslotId="12"/>+        </timetableForDay>+      </dayToTimetableAssociation>+    </timetableForWeek>+  </observerIdToTimetableAssociation>+</timetable>+
+ xml/template.xml view
@@ -0,0 +1,117 @@+<?xml version="1.0" encoding="UTF-8"?>+<!DOCTYPE options SYSTEM "../dtd/weekdaze.dtd">	<!-- CAVEAT: amend after relocating this file ! -->+<!--+	Copyright (C) 2013-2015 Dr. Alistair Ward++	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 <http://www.gnu.org/licenses/>.+-->+<options>+	<configVersion>+		<versionElement integer="1"/>+		<versionElement integer="0"/>+	</configVersion>+	<executionOptions>+		<evolutionStrategies>+			<synchronisedCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</synchronisedCourseMutation>+			<synchronisedCourseByDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</synchronisedCourseByDayMutation>+			<excessRunlengthMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</excessRunlengthMutation>+			<homogeneousStudentViewLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</homogeneousStudentViewLessonMutation>+			<incompleteCourseMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</incompleteCourseMutation>+			<randomLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="2048"/>+			</randomLessonMutation>+			<singletonStudentClassMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</singletonStudentClassMutation>+			<splitSessionMutation>+				<timetableBreederFecundity randomConstructorFecundity="1024"/>+			</splitSessionMutation>+			<studentBodyCombinationMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</studentBodyCombinationMutation>+			<studentViewTimetableForDayMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</studentViewTimetableForDayMutation>+			<studentViewTimetableForWeekMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="512" randomConstructorFecundity="1024"/>+			</studentViewTimetableForWeekMutation>+			<synchronousLessonMutation>+				<timetableBreederFecundity deterministicConstructorFecundity="1024" randomConstructorFecundity="1024"/>+			</synchronousLessonMutation>+		</evolutionStrategies>+		<optimiseLessonCriteriaWeights/>+		<lessonCriteriaWeights areResourcesReused="8.2e-3" greatestMinimumConsecutiveLessons="9.44e-2" greatestRemainingCourseLessons="1.58e-2" greatestSynchronisedCourseSetSize="0.2023" isCoreKnowledgeRequirement="9e-3" isSpecialistInTopic="6.8e-3" matchCourseClassSizeToLocationCapacity="1.25e-2" maximiseRelativeFacilityUtilisation="9.9e-3" minimiseBookingAtAnotherCoursesSpecifiedTime="1" minimiseBookingOfLocationByOtherTeachers="1.18e-2" minimiseDeviationFromTimeslotRequest="2.78e-2" minimiseInterCampusMigrationsOfStudents="0.5" minimiseInterCampusMigrationsOfTeachers="0.5" minimiseStudentBodyCombinations="3.16e-2" minimiseTeachersLocusOperandi="1.23e-2" minimiseWasteOfScarceFacilities="0.1237"/>+		<timetableCriteriaWeights maximiseComplianceWithFreePeriodPreferences="3.125e-2" maximiseMeanRatioOfStudentClassSizeToLocationCapacity="6.25e-2" maximiseMeanStudentClassSize="0.5" maximiseSynchronisationOfSynchronisedCourses="0.5" maximiseWeightedMeanStudentBodyUtilisationRatio="0.5" minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest="0.125" minimiseDispersionOfStudentFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherFreePeriodsPerDay="3.125e-2" minimiseDispersionOfTeacherWorkload="3.125e-2" minimiseMeanInterCampusMigrationsOfStudents="0.5" minimiseMeanInterCampusMigrationsOfTeachers="0.5" minimiseMeanLocationChangesOfTeachers="6.25e-2" minimiseMeanLocusOperandiOfTeachers="6.25e-2" minimiseMeanRatioOfIncompletelyBookedCoreKnowledge="0.5" minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge="0.25" minimiseMeanStudentBodyCombinationsPerLesson="0.75" minimiseRatioOfConsecutiveEqualLessons="0.125" minimiseRatioOfSeparatedEqualLessonsWithinAnyDay="0.25"/>+	</executionOptions>+	<outputOptions>+		<fileFormats>+			<fileFormat filePath="-">+				<xhtml>+					<style displayRuntimeInformation="True" displaySupplementaryInformation="True">+						<displayViews>+							<perspective view="StudentView"/>+							<perspective view="TeacherView"/>+							<perspective view="LocationView"/>+						</displayViews>+						<mergeDuplicateTimeslots>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</mergeDuplicateTimeslots>+						<displayAxisLabels>+							<timeAxes byDay="True" byTimeslotId="True"/>+						</displayAxisLabels>+						<weekend>+							<day value="Saturday"/>+							<day value="Sunday"/>+						</weekend>+					</style>+				</xhtml>+			</fileFormat>+<!--+			<fileFormat filePath="/tmp/studentViewTimetable.xml">+				<xml/>+			</fileFormat>+-->+		</fileFormats>+	</outputOptions>+	<problemParameters>+		<problemValidationSwitches checkIfStudentBodiesExceedTeachers="False" checkIfStudentBodySizeExceedsLocationCapacity="False"/>+		<groupCatalogue>+<!-- Define groups here -->+		</groupCatalogue>+		<locationCatalogue>+<!-- Define locations here -->+		</locationCatalogue>+		<studentBodyRegister>+<!-- Define student-bodies here -->+		</studentBodyRegister>+		<teacherRegister>+<!-- Define teachers here -->+		</teacherRegister>+		<timeslotIdBounds>+			<min timeslotId="0"/>+<!--			<max timeslotId=""/>	-->+		</timeslotIdBounds>+	</problemParameters>+</options>+