COPYING0000644000175000017500000001440612620453120012415 0ustar mquinsonmquinsonCopyright (c) 2008-2013. The PLM Team: Martin Quinson, Gérald Oster and others. (see the git logs for the exact authorship of each file). The PLM software was written internally by the team. This software is distributed under the GNU general public license version 3 (GPLv3). The pedagogical material distributed with the PLM is covered both by the GPLv3 license (mainly for the included code) and by the CC-BY-SA license (mainly for the other media files). But the exact boundary here between the source code and the media is left as an exercise to the reader, so this material is distributed under both licenses for sake of simplicity. The GPLv3 license can be found in the archive under the name LICENSE-GPL-3. The CC-BY-SA license can be found online: http://creativecommons.org/licenses/by-sa/3.0/ The whole artwork is free content, licenced under CC-BY-SA, GPL, LGPL and/or CC0-public domain. Some parts were done by us, other parts were borowed from free collections. The specific license and origin of each files is listed below. ========================================================================= The artwork we did ourselves is distributed under the CC-BY-SA license. img/BuggleQuestBack.png img/BuggleQuestBETA.png img/log.png img/edit_leftwall.png img/edit_baggle.png img/edit_topwall.png img/lightbot_f1.png img/lightbot_f2.png img/lightbot_noop.png img/world_arrays.svg img/world_bat.svg img/world_buggle.svg img/world_hanoi.png img/world_sorting.png img/btn-reset.png is a mashup of mine between btn-start.png (CC-BY-SA) and http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/run-rebuild.png (LGPL-2.1). The result can be used under either licence. Several exercises provide screenshot of PLM itself to help the student. These images are naturally CC-BY-SA too. ========================================================================= We borrowed the following icons, that are CC-BY-SA too: * The bunny and egg in BuggleQuest universe come from: plm/universe/bugglequest/ui/egg.png http://openclipart.org/detail/93979/ plm/universe/bugglequest/ui/rabbit.png http://openclipart.org/detail/23052/ * Buttons: img/btn-demo.png: http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/games-solve.png img/btn-switch-exo.png: http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/code-class.png img/btn-debug-step.png: http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/debug-step-instruction.png img/btn-debug.png http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/go-next-context.png img/btn-start.png http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/media-playback-start-8.png img/btn-stop.png http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/media-playback-stop-8.png img/btn-load-lesson.png http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/address-book-new-3.png img/btn-switch-lesson.png http://apps.carleton.edu/campus/library/bridge_icons/ * light for lightbot: img/lightbot_light.png http://openiconlibrary.sourceforge.net/gallery2/?./Icons/actions/help-hint.png img/world_lightbot.png (same file) ========================================================================= The following icons are LGPL: * We borrowed several of them to the nuvola icon theme for KDE 3.x img/btn-alert-off.png: nuvola/32x32/actions/irkickoff.png img/btn-alert-on.png: nuvola/32x32/actions/irkickflash.png img/console_delete.png: nuvola/22x22/actions/edit_remove.png img/console_add.png: nuvola/22x22/actions/edit_add.png img/console_refresh.png: nuvola/22x22/actions/reload_page.png img/edit_colors.png: nuvola/32x32/actions/colorize.png img/edit_text.png: nuvola/32x32/apps/applixware.png img/lightbot_forward.png nuvola/32x32/actions/up.png img/lightbot_left.png nuvola/32x32/actions/1leftarrow.png img/lightbot_right.png nuvola/32x32/actions/1rightarrow.png img/lightbot_jump.png nuvola/32x32/actions/2uparrow.png img/lightbot_light.png nuvola/32x32/actions/ledyellow.png img/menu-locale.png: nuvola/32x32/apps/locale.png ========================================================================= The following images come from the LibreOffice icon set. They are thus MPL-1.1 | GPL-3+ | LGPL-3+ img/edit_lineadd.png cmd/lc_insertrows.png img/edit_linedel.png cmd/lc_deleterows.png img/edit_coladd.png cmd/lc_insertcolumns.png img/edit_coldel.png cmd/lc_deletecolumns.png ========================================================================= The following logos are GPLv2: img/busyicon/*: (gnome) http://openiconlibrary.sourceforge.net/gallery2/?./Icons/animations/process-working.png img/world_turtle.png : stolen to the kturtle project, that is GPLv2+ ========================================================================= The logos of the programming languages are certainly free, even if I didn't dig for their exact licence. img/lang_java.png img/lang_javascript.png img/lang_python.png img/lang_ruby.png img/lang_scala.png ========================================================================= Public domain images (CC0 PD) * img/focus_* These images were retrieved from http://openclipart.org/ even if I didn't write down the exact URL for them. * img/trophy.png http://openclipart.org/detail/48937/trophy-by-sheikh_tuhin * img/world_baseball.png http://openclipart.org/detail/76927/baseball2-by-shokunin ========================================================================= The following images are believed to be free, even if I cannot remember where they come from. We should maybe play safe and replace them. But as you can see from the rest of the project, we are better programmers than designers... You are welcome if you can help. * src/lessons/sort/pancake/img/world_pancake.png It was retrieved from http://omgwtflols.deviantart.com/art/Pixel-Art-Pancakes-with-syrup-298700868 It seems rather free, but the exact license is not known. * img/world_lesson.png I cannot remember where it comes from. It looks very similar to the logo for education applications in KDE so I guess it's ok. And since I'm planning at removing the whole concept of lessons, it's probably not worth digging any further on this one.ChangeLog0000644000175000017500000011150212620453120013127 0ustar mquinsonmquinson20151010: 2.6 The Long Awaited release. * Improved translations: - French: missions and engine at 100% - Brazilian: missions at 100%, engine at 65% - Chinese: engine at 39% * Engine: - Ask loudly before pushing anything to the remote servers This fixes http://bugs.debian.org/772026 - Switch embeeded scala compiler to version 2.11.4 * Worlds: - #284: Turtle, Buggle: Better message when mixing pens and brushes - Hanoi: Allows for problems with 3+ pegs and multiple stacks - Buggle: Sensible names for well known colors when diffing worlds * Pedagogical content: - #410: Fix my usage of "teach" vs. "learn" in English - #240: SlugSnail: add false leads to avoid cheaters - #229: Poucet: Split the exercise in two. Both request to write two loops. The external loop is always a do/while ("until found"). The inner loop in the first one is a simpler for loop while the second exercise request the inner loop to also be a do/while (because of the corridors of differing lenghts) - InterleavedHanoi,SplitHanoi[123]; LinearHanoi,LinearTwinHanoi; TricolorHanoi[123]; CyclicHanoi; IterativeHanoi: New exercises to work on the decomposition of recursive problems. - Move the Moria exercise to the last position in welcome lesson. It is ways harder than the other ones. - #104: Instructions: hint about brushUp/brushDown - #428: Instructions: typo in english - New exercise, searching for the second biggest value in array - #433: New exercise: BubblePancake [Tydax] - #447: Make Dave and localization work together in Python * Internal organization: - Automatically check for classical errors in [!python] and such - New package in welcome lesson for summative exercises * Buggle Editor: - New commands: add/del line or column. 20141031: Release 2.5 The Halloween Release. * Improved translations: - French: mission and engine back at 100% - Brazilian: missions at 58% * Engine: - #292: Check the user's input before submitting a feedback - #304: Stop user's program's or demo's execution if the user switches to another exercise or lesson. - #395: Correctly remove the files that should be when reverting or failing an exercise (both in local and remote repositories) - #389: Allow fullscreen on Mac OSX - #394: Display a waiting dialog when exiting - #263: Also interpret language tags in hints, not only missions - #401: Remove non-needed HumanLangListeners - Greatly improve the coverage of our unit tests. * Worlds: - #286: Turtle, Buggle: document where (0,0) is - #220: Buggle: Improve doc of isOverBaggle(), isCarryingBaggle() * Pedagogical content: - #323: turtleart.Kerr40: new exercise - #397: GnomeSort: align mission text with code - #296: TraversalByColumn: document where (0,0) is - #239: CourseForest: get stick in water, not moving anymore - #405: LoopStairs: Make French python bindings fit the templating - #406: Lander101: unclear mission text wrt stepping the simulation - #409: LoopWhile: additional reference to "About this world" menu 20141009: Release 2.4.11 Git and TurtleWorld's equality should both be working now :) * Improved translations: - Brazilian Portuguese: Missions at 54% despite content changes * Engine: - #224: If the execution is interrupted, the exercise is failed - #380: Disable creative mode when switching the exercise - Lessons: Prevent users from accessing broken lessons and add tests to detect them. - GitSpy: Fix a bug which overwrote the current exercise's files for the current programming language by the current exercise's files for the last result's programming language - Git: Refactor Git related code to fix progression loss bugs * Worlds: - Turtle: equal() was not detecting when lines are overlapping with no common extremities. We now detect when one line is strictly included within another one, but not when they are intermixed (yet). Fix #381. * Pedagogical content: - #378, #393: French typo - #383: Fix the name of the Scala entity - #387: Fix a broken link when run from the jar - #388: The Pancake #0 is actually on top (fix mission text) 20140930: Release 2.4.10 * Engine: - Add several tests to check ExerciseTemplated's behavior. - #262: sensible error message when putting code out of any method in Scala - Add a test suite to gather together all tests. - #359: Add world-specific info to debug and feedback. SortingWorld uses that to tell which random instance was used. * Pedagogical content: - #372: scala code for Koch and Crab exercises were inverted. - #373: Fix entity name for the dutch flag 20140929: Release 2.4.9 Recursion lesson is usable again, sorry for the inconvenience. (we really need more tests, grmbl) * Engine: - Lesson constructor waits for all init threads' completion * Worlds: - Turtle: equal() was too permissive after recent work on merging lines that were too picky. Now take the world name into account in equality, so that we can switch from an empty world to another empty world in the UI. * Pedagogical content: - recursion: remove the largest fractals that were too heavy - #366: recursion.spiralUse: add another nice picture 20140928: Release 2.4.8 * Engine: - Use appropriately the executionError field instead of compilationError to store entities' run time errors. * Worlds: - ConsWorld: new subclass of BatWorld dedicated to recursive lists. * Pedagogical content: - recursion.cons: new lesson on recursive lists (17 challenges) - #349, #355 : French typo - #356: write 'one', not '1' (was too similar to 'l') (fix #356) - #365: SelectionSort: don't sort the last cell, it's already done 20140920: Release 2.4.7 Python is usable again, sorry for the inconvenience. * Engine: - Don't even compare the worlds when there was a compilation error Prevents python code from failing after reaching the solution. * Worlds: - Turtle: Merge lines that are in line with each other before comparing equality. You can now walk half of a segment, the half will be removed. You can walk to your destination in large amount of very small lines that are all depicting a long line, parts will be merged together. I hope that now, that damn world equality detection will not return false negative anymore! This fixes #338 and #339 (which are not exact duplicates). - Turtle: Show the superflous and missing shapes when the amount of shapes does not match. - #344 Turtle: Display the coordinates of the mouse. That helps reading the differences between worlds, if any. - #309 Bat: Edit the python template in order to test correctly the exercise's winning conditions instead of passing it. * Pedagogical content: - #341: French typo - TurtleArt: rename challenges from Bill Kerr to credit the author. http://billkerr2.blogspot.fr/2009/08/40-maths-shapes-challenges.html 20140917: Release 2.4.6 * Worlds: - #329: Buggle: allow exercise to specify that Buggle's direction is irrelevant to world equality tests. Use it for all maze exos. * Pedagogical content: - #332, #333: French typo - #330: Lander.*: Make Segment usable in every exercise, even if they are not absolutely mandatory to solve the problem. - #320: indexOfValue: align the template onto the mission text - #334: Lander1: we are only supposed to write a method body in python while that's a random code chunk in other languages. Adapt the mission text to that fact. - #335: Array123: Add some tests so that testing if 3 is in the array is not enough to solve the problem. - #331: New turtle art figure, original by a student. - PictureMono: more space between patterns so that V are visible 20140916: Release 2.4.5 * Improved translations: - Brazilian Portuguese: Missions at 51% despite content changes - French: Missions translation at 100% (Engine's lagging behide) * Engine: - #294: Import package Color in every exercise, so that students may use it even if they don't have to in a given exercise. - #327: Update our embeeded java compiler to OpenJDK7 * Worlds: - #291: TurtleWorld: align equals() and diffTo() on what's equal. That is, equals() now ignore the turtle color while diffTo() now reports differences in turtle position. - #298: TurtleWorld: Drop duplicate shapes before comparing, so that it still matches if the only difference is that you don't duplicate the same segments than the correction. - #236: Make sure that Left() and Right() are detected as errors even in Scala that gives a meaning to these names. - #272: Bat: Clone the arrays passed as parameter to the user code to ensure that the user don't mess with our precious data. * Pedagogical content: - #299, #307: French typo - #303: No need to draw the same thing twice - turtleart.Flower2: New picture, proposed by a student last year. - #242: Moria: Forces the use of while loops by making the word too uneven for forloops, and by adding more buggles. - #247: ScalaWallFindFollowMazeEntity was in wrong package, breaking demo. - #305: ShortestPathMaze: fix mission to match world's expectations - #273: FlowerPot: don't add a buggle manually, the map contains one 20140912: Release 2.4.4 * Engine: - #257: used to write the bad information when passing an exercise placed on the top of a sub-menu, resulting in the DONE mark not being retrieved when loading the session afterward. * Worlds: - #280: Buggles: Don't display the error dialog more than once when dropping the baggle that you don't have. * Pedagogical content: - #274: BDR: citation of Java instead of [!theLang] in mission - #289: indexOfMaxValue: add a table with all negative numbers to catch people initializing maxValue = 0 - #248: Misleading mission text in French - #285: TurtleArt with 20 sides should not be called Polygon15 20140911: Release 2.4.3 * User Interface: - Add the public branch name to the feedbacks to ease reproducing the issues. * Engine: - #257: loading sessions from git was sometimes loosing DONE marks - #267: record a git event when the student reads a tip - #265: Provide now the PLM's version number when interacting with the server * Pedagogical content: further fixing students' issues - #237, #252: typo in French - #246, #259: Lessons about mazes': make the templating mechanism explicit - #255: IndexOfValue: world and function renamed to match with the instructions - #251: Fizz Buzz: correct the solution to match the instructions 20140909: Release 2.4.2 * Engine: - Reduce the load to the github servers by not pushing more often than once every 30mn (or when the client quits). The PLM-data repository was disabled by github robots due to the excessive load. We don't want it to happen again... * Improved translations: - Brazilian Portuguese: Missions at 45% * Pedagogical content: fixing the issues opened by our students. - #221: fix templating to now show crude details to youngsters - #218, #225, #227: typos in French - #226: Course: nice error message when running more than asked - #228: CourseForest: nice error message when running more than asked - #230: Course*: forbid backward() too. forward() must be called. - #232, #233: Methods: show the code calling goAndGet() in languages allowing methods to be embeeded within methods (scala/python) Should be more robust to students misuses now. 20140905: Release 2.4.1 Soon in production, last chance to iron out the bugs found on time. * User Interface: - Students can explain their problem in a phrase when requesting for help (contributing to #208, but the teacher cannot answer yet) * Engine: - Save the error message also when it compiles but diverges (fix #213) 20140901: Release 2.4 Let's get ready for the Big Show of this year. * Improved translations: - Brazilian Portuguese: Missions at 39% despite content changes - French: Engine and Missions translation back to 100% * User Interface: - Switch from the now unmaintained jsyntaxpane to RSyntaxpaneArea (fix #191). - Switching users now works without restarting anything (fix #189) - Kill the cloud session export feature: git superseeds that. - Allow the students to provide imediate feedback on the exercises they just passed. - Restore the feature where the students can ask for the help of their teacher, once they have registered their identity to the PLM-server. Also, the PLM-server now gives a much better interface for the teacher. * Pedagogical content: - welcome: move the BDR after the races so that students know about variables when attempting them (fix #106). * Internal organization: - Move the logic related to a given programming language to a central class. This should make it easier to add new languages. 20140821: Release 2.4-beta1 Close to the release, but not there yet. * Improved translations: - Brazilian Portuguese: Now at 35% [Fred Maranhao] * User Interface: - Make it possible to copy/paste the secret session ID from the about dialog, so that the students can manually pass it to their teachers. Not as convenient as it ought to be, but it works. - Display a big fat warning when switching to C: that's still experimental, and not everything works for now. They're warned. * Pedagogical content: - welcome.array.maxvalue.Extrema: find min and max values [Valentin Giannini] - welcome.array.golomb.Golomb: compute the Nth of the surprising Golomb sequence [Valentin Giannini] - welcome.array.island.Island: small game with arrays of integers - sort.pancake.CohenPancake: Cohen's Algorithm for burned pancakes - lander.*: Integrate properly and port to any supported languages. * Still missing for the release: - French and Brasilian translations should be updated and completed - Switching identity is still broken (see #189) 20140724: Release 2.4-alpha1 This is an alpha release. Things are not ready for release, but we need more feedback to track and fix the problems. Use it at own risk, but please report all issue so that we can hunt them down. * New and improved translations: - Brazilian Portuguese: 25% of all missions [Fred Maranhao] - Italian: Full engine + Welcome lesson [Vinnie Costante] * User Interface: - user data are now saved in a git, and automatically synchronized on github. [Cédric Huguenin, Mathieu Morainville] - Add C as a programming language [Valentin Giannini] Most exercises were ported, but that's still a bit experimental. - Kill the twitter spy. That's pure evil (fix #125) - The feedback is now reported as github issues [Cédric Huguenin] - Add a little menu to switch human language (fix #110) - The error message now have the right number also on Windows. #42 was not fixed on this platform yet. [Cédric Huguenin] - Rewamp the feedback reporting dialog box - Unclutters the UI: changing the buggle color is useless * Pedagogical content: - lander.*: new lesson on lunar landing [Paul Brauner] Only working in Java for now, somehow experimental. - welcome.bat.bool2.fizzBuzz: new (classical Fizz Buzz word game) - Various proofreadings on mission texts (FR&EN) 20131113: Release 2.3 * LectureChooser: fix preferred size to the MainFrame one (fix #118) * AboutDialog: display the license and ChangeLog too * TurtleWorld: better error message when the amount of lines differs * TurtleWorld: new builtins to hide()/show() the turtle. * PancakeWorld: The larger pancake is getStackSize()-1 * PancakeWorld: avoid ../ in the icon path: doesn't work in jarfiles * recursion.DragonCurve1: slight mission text improvement * recursion.SquareKoch: new exercise (variation over the Koch idea) * recursion.PentaKoch: new exercise (another variation of Koch curve) * recursion.HexaKoch: new exercise (yet another Koch curve) * recursion.Crab: new exercise (another L-system: the Lévy C curve) * sort.dutchflag: mention about the existing colors in the doc * sort.dutchflag: allow to play with the mouse through drag and drop * recursion.hanoi: builtin getRadius(slot): radius of top-most disk * recursion.hanoi: allow to play with the mouse through drag and drop * MainFrame: Implement a "Save a picture" feature, useful in turtleart * welcome.MethodsArgs.py: compare directions without relying on their name to avoid l10n issues (fix #122) * As usual, fix some typos in the French translation 20130930: Release 2.2.7 * recursion.spiralUse: rewrite to leverage the creative mode, so that students don't spend too much time seeking for the reward. * recursion.tree: make the color changing robust to negative steps * recursion.tree: forbid teleporting This was used by some students to make the method idempotent. * recursion.sierpinski: rewrite to simplify the code to be written * recursion.hanoi: Simplify by explicitely passing the index of the unused peg to the recursive function. * TurtleWorld: synchronize to avoid a concurent modification when a shape is added while we are computing the toString() of the world * sort.dutchflag: New universe/exercise on the Dutch Flag Sorting * sort.pancake: Correctly reset the move count on need * sort.insertion: fix path to img after recent package reorg * recursion.koch: give one color per side to ease the understanding * sort.CocktailSort2: don't use ++ but += 1 in pseudocode 20130924: Release 2.2.6 * SortingView: display the value on the left of temporal view, not the index * TurtleArt: force a newline every 5 exercises as it does not work well with Java7 otherwise. * TurtleArt.Flower: new exercise (provided by a student :) * GnomeSort: fix a bug in the correction, where we stay at i=0 when there is no previous pot instead of moving forward. * TurtleWorld.equals&diffTo: synchronized on shapes to avoid issues when the stop is pressed, for example * TurtleWorld: order the points in each segment so that the line (ab, cd) is detected as equal to (cd, ab) * TurtleWorld.diffTo: i18n and improve error messages * recursion.Circle: kill exercise. It is superseeded by turtleart. * recursion.Star: kill exercise. It is superseeded by turtleart. * recursion.tree: rework to make it easier to understand - each level is given its own color - we provide a subtree() that is correct (but the colors) to ease the debugging of user's code * As usual, fix a bunch of typos in the French translation 20130916: Release 2.2.5: SortingWorld needs *more* polishing. * Align equals() and diffTo() of sortedWorld to avoid false negatives * Internationalize and translate the error messages of SortedWorld * sort.Bubble3: there is no 'break' in scala * Color the statusbar in red when a world is running so that people notice that there is more than one world. * SortingWorld: give large worlds a reduced delay so that people don't wait for the perf world too much even if they don't click 20130916: Release 2.2.4: SortingWorld also needs polishing. * Disable the "help me" button if the appengine is disabled * Document the existing colors in Buggle&Turtle worlds * Update "About world" dialog's title changed on Human lang switches * Change buggle.setColor to setBodyColor so that people used to logo don't use it to change the brush color. * Compare turtle worlds with an upsilon to avoid false negatives. * Fix an error in the pseudocode of CombSort * Fix a bunch of typos in the French translations. * sorting world: represent values as letters so that they don't get mixed with indexes. 20130912: Release 2.2.3: Let's start adding new bu^Wfeatures again. * Let every interactive control issue the source code doing the same thing when they are clicked, so that the students can copy/paste. Thanks to Laurent Guittet for suggesting this change, I love it. * Buggle: Translate the direction names, too * TurtleWorld: add a new clear() primitive that clears the sheet * New feature: import/export session to the cloud. You don't have to struggle with a bunch of zip files anymore. * Rewamp the ExerciseFailedDialog to be more user friendly. Its title is less demotival, it hints about how to fix the issue, and the textual diff (that can be big and ugly) is hidden by default. * BuggleWorld: dropping a baggle was possible even if you had none * welcome.BlueTicket: Fix typo in French * BatEntity: more informative error message when an exception is raised * FeedbackDialog: should not be modal to enable copy/paste * maze.island: move the initial positions to make cheating harder * maze.shortestpath: also translate the helper methods in scala and python * maze.shortestpath: put the distance on every cell, not just until we found the buggle. Otherwise, the student must do exactly the same traversal, which is not part of the spec, making it harder. * Search windows directories first as the user.home property cannot be trusted here at Telecom Nancy. * welcome.basic.meth: reword the mission to make clear that the code will get called automatically. * Don't remove runner threads too early from their set so that "Stop" still find them to stop them (fix #108) * welcome.array.has271: improve the mission text * welcome.traversal.*: fix the java and scala templating * welcome.variable: speak about != that is handy here 20130910: Release 2.2.2: the 2 cts release. * welcome.LoopCourse: specify that the colors get updated automatically * welcome.NearHundred: fix french translation (was plainly wrong) * welcome.SlugHunting: align templating and mission: isFacingTrail must be copied * welcome.Variables: scala mandates an initial value (fix #109) plus various small improvements * Unify all Dave messages (marking functions that are forbidden in a given exercise -- like setPos in maze exercises), to ensure that they are properly translated despite the fact that gettext don't dig into scala and python files for string to translate. * Specify a working font for plain text to help the poor Mac users * welcome.RunHalf: fix the scala templating * welcome.FlowerPot: fix the french translation (growFlowers with a s) * FeedbackDialog: reset the text on each invocation * welcome.MethodsArgs: Fix a faulty copy/paste in scala prototypes * welcome.LoopFor: Fix the scala syntax of for loops * welcome.RunHalf: the description and the given condition did not match 20130908: Release 2.2.1: C'mon, dudes. Break that one if you dare. * Allow a creative mode, perfectly adapted to open LOGO exercises. The world is never reset nor compared to the "expected" output. * Fix the dist build to not take all files copied by eclipse (fix #101) * welcome.PictureMono*: fix the templating of run() (fix #102) * welcome.Instructions: Fix a translation error (fix #103) * welcome.slugTracking: Mention also in scala and python how to test whether the ground color is green (fix #104) * Bat templating didn't even compile in Java and Scala, oops (fix #105) * turmite.hello: fix mission text: left=2; right=8 * welcome.Poucet: specify how intersection cells must be counted * welcome.LoopStairs: say that there is no need to manually fiddle with the colors. 20130830: Release 2.2. The funny times are over * Rebrand JLM into PLM (Programmer's Learning Machine) * Turtles: Allow for hints on segment sizes * Turtle.circle(): New primitive to draw circles directly. * New lesson turtleart on the classical Logo geometric figures * Upgrade our twitter4j dependency to use the new twitter API 1.1 Twitter dropped support for the 1.0 API a while ago. * Drop the identi.ca spy. It does not work since the upstream move from status.net to pump.io, and I fail fixing it. * Drop our prototypal jabber chat dialog. It was not activated because it's not adapted: student only use it to try to cheat and get easy answers. A forum would be better. Students are authenticated, and the messages moderated (France IOI does that) * Build a plm-light jarfile, without scala and python dependencies. These langs remain usable if the deps are independently installed. * Specify a sain font as default to help Mac users (fix #100) 20130820: * RELEASE 2.1, the 100th day. * Introduce Scala as a new programing language (version 2.10+ required) * Port all exercises to scala. * Change turnLeft()/turnRight() to left()/right() in buggles & turtles * Translate all builtins of buggles, turtles and sorts to French: It is now possible to write avance() instead of forward() * Review all translations for uniformity and to iron out some typos * Test the compilation process in our JUnit tests, for Java and Scala. * Mark many more strings for translation in the engine. * Allow [!java]...[/!] constructs in mission texts to adapt to progLang * In debug mode, all adaptations of all progLangs are displayed, with a color code for each. This was mandatory with a third main progLang * Partially document the black magic fueling ExerciseTemplatingEntity Erk, this class is based on ... inventive hacks ;) * Property jlm.display.fontsize sets the size of the mission texts (default: 10px; must be valid in a CSS) * MissionEditorApp: little application to edit the mission texts with realtime rendering after applying our pseudo-markdown directives * lessons/welcome/methods/picture/PictureMono*: new exercises on drawing, but without the color so that it can come early in the learning process, when we don't have methods parameters yet * lessons/welcome/methods/flowerpot/*: two new exercises training on methods (and decomposition) * New lib/jsyntaxpane.jar, from debian package fixing some upstream bugs - Contextual menu now works, as well as Ctrl-Z/Ctrl-Y, etc 20130804: * RELEASE 2.0, the revolutionary night. * Remove the array world. It was not helping very much when compared to the bat world. * Use '' to get ' in translated strings to please MessageFormat. * Pythonize the documentation of all universes * add a button to lessonChooser to load lessons from disk * Disable the step-by-step mode when stopping or swichting the lesson or the exercise (fix #1) * Editor: kill buggles that are in outer space after world resizing. * Disable JavaScript, it's really not ready for the big night. * Update our version of jsyntaxpane to get a fully working jar file. 20130730: * Pythonize new exercises * Retranslate everything back to 100% in French * Various cosmetics, small refactoring and little bug fixes * Lesson navigator: Display which exercise are passed in which language * Entity.isSelected() returns whether /this/ is selected in the UI * Change Buggle.pickUpBaggle() to pickupBaggle() for consistency * ExerciseTemplated: Trim leading spaces of non-python templates * Fix BuggleView for non-square worlds (Fix: #83) * Implement a graphical lesson chooser (Fix: #19) * Rewrite and integrate all of the baseball exercises * Give the baseball universe an historical view, as for sorting one * PancakeView: Reimplement from scratch; can now be played with mouse * Split hanoi towers and the turmites out in their own lessons * Remove the meta lesson. It was not done, seemed difficult to finish, and complicated the code of the universes. (Fix: #2) 20130720: * Integrate the pancake exercises into the sorting lesson * New pancake exercise about implementing Gates' algorithm * 1 more exercise about the while loop: Moria * 2 more exercises about variables: Big Buggles's Race (1&2) * 3 more exercises about the for loop: Stairs, Course and CourseForest * 1 more exercise about the do/while loop: Poucet * Better integrate the slug hunting exercises; add new one (on parameters) 20130710: * Fix the temporal view of the sorting world (plus various cleanups) * Allow to provide feedback easily. One click to open the dialog window, type your text, validate, and it's automatically saved with an http POST request. * Properly select the current exercise in the lesson navigator * Save the currently used programming language in the property file * Current exercise gets saved in zip files and reselected when loading * Speeds initialization by directly building everything in the right locale instead of building it with no locale, and then updating it * Progress spys (twitter/identica) get controled through properties * Default values of properties get saved to local file to ease their discover and tuning by users 20130705: * RELEASE 1.99 * Pythonize all lessons: maze, recursion, sort and bat/string * Fix: demo mode in python was without delay * print() in python was not playing well with graphical console * Update French translation of missions: back to 100% 20130621: * Improve the BuggleWorld I/O and the BuggleWorldEditor: - better detection and error messages of invalid map files - every world's characteristic can be edited in the editor - buggles are read from/saved into world files * Update all existing worlds on disk to this format * Speedup the lesson loading with a cache of answer worlds: - If a relevant .map file exists, don't execute the answer entity - If not, save the .map file after execution for the next time 20130616: * RELEASE 1.98 * Squeeze a bit our sources so that we can package it for Debian * Add a logo to the distribution (img/logo.png) * List the exact license of every image used in COPYING, and replace the ones for which we lost the license on the way. JLM is now perfectly clean wrt the licensing legal consideration. * BatEntities now work within the unit tests too (fix #67) * Integrate the bat exercise using integer arrays into the welcome lesson (fix #21) * Welcome lesson ported to python, both code and missions (fix: #89) 20130531: * Try harder to find a path where we can save our data 20130530: * Make sure that jarfiles compiled with Java 6 also work with Java 7 20130529a: * Really kill jung in the source code too so that distributed jar files actually work -- sorry. 20130529: * Reintroduce the student progression listeners. It was turned off for the debugging process, but that shouldnt be part of a released version. 20130528: * New lesson navigator based on JTree (fix #71) * Some better looking icons, with known licenses * Basic testing infrastructure (fix #8) It ensures that python entities manage to solve the Java worlds. This could be extended in many way, including: - The java entity is not compiled, so there is no compilation test - Bat exercises are too specific to be tested this way. But at least, we have a testing infrastructure! * Exception raised in python code (including syntax error) are now correcly handled (fix #66 and #78) * Basic i18n infrastructure allowing to translate the user interface (fix #76) * Kill the ability to have more than one view per world (fix #35) * Save the session before switching exo/lesson to not loose student's edits (fix #45) 20130517: * Package baseball exercises in their own directories * Add a control panel for the Pancake Worlds ( raw & burned ) 20130516: * Add an icon depicting the programming language in the status bar * Various polishing of the exercises in Python * Fix issue #64: Buggle interactive controls are now properly initialized * Package maze, welcome, lightbot, sort and bat.string1 and recursion exercises in their own directories * Refresh the french translation * Add a control panel for the Sorting World * Start porting bat exercises to python * Port hanoiWorld to python 20130515: * Huge python cleanup: - various cleanups, code factorization and bug fixes - Create or improve the bindings of Turtle, Sorting and Buggle worlds - Port many exercises to python, testing that the bindings are sufficients, and [partially] rewriting the mission text to that extend. The templates are not sufficient yet for absolutely all exercises, but many of them are. - Fix line number computation in error messages coming from python - If python is the default language, use the python entity to compute the answer. Note that it still fails for some exercises. - Add back the jruby jar file, as jython needs it to access POSIX * Merge both views of sorting worlds, toward code simplification * Rewrite most sorting exercises mission texts after recent splitup of our mega exercise into several ones with one entity only each * Refresh the french translation * Simplify Random Mouse exercise, fix the demo of Pledge algorithm * Add a combobox to switch to next exercise in "success" dialog * Add an interactive way to change the buggle color and brush color * Baseball exercise of SMN can now be played with more than 2 players per base 20130416: * Kill several seamingly good ideas that complicated the code base: - aliased source files: student must keep them synchronized manually now. We may want to reintroduce this at some point? - Java code that cannot be compiled. This would have been useful only for user-provided text files, but we don't use it now. - uneditable source files. The student will see all files passed to the compiler, now. This was never used in production - inconditional static rewriting patterns to apply to the source code. People should change the code in their source directly :) - lessons cannot be sequential anymore. Forbidding pupils to attempt the exercise in the order they want is not in the JLM way of style anyway. - exercises cannot have more than one kind of exercise. This was introduced to have all sorting exercises at once, but this was split in several exercises because the SortingView was gone amok. * Simplify a bit the way external lesson files are loaded * Remove a bunch of unused dependencies on external jars. The distribution jar is now only half as big only (still 20M). * Request a confirmation from the user (through a dialog) before reverting the exercise, that was a mean trap... 20130328: * Merge all code (and wiki) from last year's students * Accept a pull request from J-Bastian, with a new lesson (SMN) and a bunch of bug fixes. * Various little bug fixes. 20120319: * Minor update on build process 20120318: * Allow jlm:/// links in mission texts 20120116: * Add an ant target to generate a source tgz (for Debian packaging) 20120110: * Do not even try to compile the Java sources if we were asked to used another language, such as Python. (Fixes #48: Python source code not used if some java code provided) 20111201: * Port some more welcome exercises to Python. The translations should be updated to appear again. * Port all sorting exercises to Python 20111013: * Fix a bug in python that were due to an extra space added in front of the body. Damn python indentation freaks. * Add a debug mode to JLM, to see more infos on problem * Add a trap spitting a lot of info when issue #42 (line numbers are shifted) occures. I need more info to understand where it comes from. * Fix the array exercises (there were bugged and not properly integrated into po4a) * various improvements to the missions and their french translations * Remove the "clear session" menu entry. Too dangerous. * Graphical consistency between menu choosing the human language, and the one choosing the programming language * Show in about box where the session gets saved to avoid NFS hell * Various typos and little errors hunted down by Pierre-Etienne and JC * Improve shortest path exercise by not removing distance marks, so that students can compare their computation with the correct one 20111006e: * Allow to code in python, javascript or ruby * Definitely kill the linearity of lessons (combobox removed) * Load the lessons on need only (and save them separately from each other) * Cleanup the way identica and twitter get informed of student progress * Textual display of what's wrong when the world is not what's expected * implement the world equality for logo * Allow to have lectures, ie non-interactive exercises * Improved turmite track, with a specific view displaying the step 20110909: * New exercise track on turmites * Enforce that the buggles cannot move to outer space with setPos(), setX(), setY() nor peek outer space with getCell() 20110907: * Add a new lesson navigator allowing to break the lesson linearity * Use identi.ca in addition to twitter to push the success of studentsLICENSE-GPL-30000644000175000017500000010451312620453120013146 0ustar mquinsonmquinson GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . README.md0000644000175000017500000000312212620453120012632 0ustar mquinsonmquinsonProgrammer's Learning Machine (PLM) ========= The Programmer's Learning Machine (PLM) is a platform dedicated to computer programming education. This generic platform offers support to teachers for creating programming microworlds suitable to teaching courses. It features an integrated and graphical environment, providing a short feedback loop to students in order to improve the effectiveness of the autonomous learning process. For more information, subscribe to our [announcement](https://sympa.inria.fr/sympa/subscribe/plm-announce) mailing list (low trafic), and [visit the PLM web site](http://www.loria.fr/~quinson/Teaching/PLM/). [![Build Status](https://travis-ci.org/oster/PLM.svg)](https://travis-ci.org/oster/PLM) ## License PLM is licensed under the GNU General Public License 3. 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 . The documentation, tutorial and source code are intended as a community resource and you can basically use, copy and improve them however you want. Included works are subject to their respective licenses. TODO.org0000644000175000017500000001237112620453120012637 0ustar mquinsonmquinsonYou want to help the PLM project but don't know where to start? This file is for you! It contains many ideas that would improve the PLM so you just have to select one of them, contact us and here we go! You can contribute to the project! First of all, you want to get some context about the PLM. For that, check that presentation of Dec. 2014. It presents the project and gives a roadmap of future developments. http://webloria.loria.fr/~quinson/blog/2014/1204/PLM.pdf (in French, sorry) The level 0 of contribution is to report any glitch (either technical or pedagogical, or even typos in the mission texts). Then of course, you should have a look at the known bugs and issues. Any help to solve them is very welcome. https://github.com/oster/PLM/issues and https://github.com/oster/webPLM/issues. We have 2 bug trackers because the project is modular :) Another idea is to help translating the material. How to do that is documented here: https://github.com/BuggleInc/PLM/wiki/Working-on-translations Fourth idea, some extension ideas are given in the "help"/"About this lesson" menu of most existing lessons. You can find these files in the archive by searching files named "Main.html" in the differing subdirectories. They are even translated to other languages, if that helps. Finally, some less baked ideas are listed directly in this file, below. Do not hesitate to ask if you have any question. * Lessons and universes The important here is that I try to build lessons on important notions, not entertaining or particularly challenging things. That's the main editorial difference with projects like Codingame.com or other programming challenges. They want to find the best programmers out there, I want to teach everybody the things that good programmers need to know. That being said, I have no strong feelings about the parts of informatics that should be taught in the PLM. I seriously think about adding a lesson on HPC programming in C with MPI, for example, even if that's *very* different from the existing content. ** Improvements to the existing pedagogical content - There is some bug about exercises that should be slightly improved, such as. They are all visible from that list: https://github.com/BuggleInc/PLM/labels/Exercise ** Additional exercises There is naturally a huge body of things that we could add to the PLM. Take one book such as the Cormen or the Sedgewik and just pick some random ideas. A particularly interesting lead would be to implement slightly different versions of the same exercise so that we can do some sort of https://en.wikipedia.org/wiki/A/B_testing. In particular, we'd like to evaluate this way whether students prefer large assignments with a large degree of freedom, or a longer list of very constrained challenges. ** Pedagogical micro-worlds Adding them could only require to reimplement an adapted universe (similar to BuggleWorld or TurtleWorld or SortingWorld), and import the existing exercises from the upstream authors. At least, that's the initial plan but in practice, I often change the exercises to integrate them in the gameplay of having buggles and also because I love adapting the stuff that I integrate... - Karel the robot (it may be sufficient to build a loader of karel worlds within the buggle world) - PatchWorld. This one is very good for absolute learners. http://cs.wellesley.edu/~cs111/fall07/notes/lectures/06_picture_world_intro_web.pdf - These people, who invented the whole buggle concept had many other ideas: - http://cs.wellesley.edu/~cs111/fall98/assignments.html - Another classical recursive game: - http://www.cut-the-knot.org/recurrence/flavius.shtml - We could try to adapt some ideas from similar frameworks, such as http://javascool.gforge.inria.fr/ In particular, we could use some kind of micro-world to teach the various graph algorithms as they do. ** Programmer games They may require a King of Hill mode, but that's also doable. - Robozzle. This is very close to the Lightbot that we had before moving to the web, but needs some specific improvements: https://github.com/BuggleInc/PLM/issues/3 - CodeRuler (strategy) - CodeRobot (fights between robots) - CodeRally (racing cars) - CodeInvaders (fight between spaceships) https://www-927.ibm.com/ibm/cas/hspc/competition/ - MARS (assembly) http://courses.missouristate.edu/kenvollmar/mars/ - MMIX (assembly by Knuth) http://mmix.cs.hm.edu/index.html - Corewars * Possible improvement to the graphical engine ** Code editor improvements - Use the same shortcuts than eclipse (when possible) - Provide autocompletion on keywords and bindings - have the editor follow the execution point during stepped execution - During step-by-step execution, it'd be great to display the content of values. See https://github.com/oster/PLM/issues/116 - Locations displayed in the console should be links that move the editor. ** World representation - represent graphically the textual diff between the expected world and the actual one. We would have red circles on cells that have an error (either wrong color or wrong message), red crosses on badly located buggles, etc. * Various ideas ** Essential Math for Games Programmers - http://www.essentialmath.com/tutorial.htm ** Introduction to the algorithms behind the games - http://www.redblobgames.com/articles/visibility/ build.xml0000644000175000017500000003550412620453120013205 0ustar mquinsonmquinson checkDave.pl0000755000175000017500000000320012620453120013565 0ustar mquinsonmquinson#! /usr/bin/perl use strict; my @files = qx(find src -name '*.java' -or -name '*.scala' -or -name '*.py'); my $error = 0; foreach my $file (sort @files) { chomp ($file); my $filectn; my $FH; open (FH,"<$file") || die "Cannot open $file: $!\n"; while () { next unless ($_ =~ /Dave/); my $line = $_; $line =~ s/throw new RuntimeException\(Game.i18n.tr\((.*?)\)\);/$1/; if ($line =~ /"Sorry Dave, I cannot let you use forward with an argument in this exercise. Use a loop instead."/) { } elsif ($line =~ /"Sorry Dave, I cannot let you use backward with an argument in this exercise. Use a loop instead."/) { # traversals } elsif ($line =~ /"Sorry Dave, I cannot let you use forward\(\) in this exercise. Use setPos\(x,y\) instead."/) { } elsif ($line =~ /"Sorry Dave, I cannot let you use backward\(\) in this exercise. Use setPos\(x,y\) instead."/) { # dogHouse } elsif ($line =~ /"Sorry Dave, I cannot let you use right\(\) in this exercise. Use left\(\) instead."/) { } elsif ($line =~ /"Sorry Dave, I cannot let you use left\(\) both in lines \{0\} and \{1\} in this exercise. You can write left\(\) only once in this exercise."/) { # mazes } elsif ($line =~ /"Sorry Dave, I cannot let you use setX\(x\) in this exercise. Walk to your goal instead."/) { } elsif ($line =~ /"Sorry Dave, I cannot let you use setY\(y\) in this exercise. Walk to your goal instead."/) { } elsif ($line =~ /"Sorry Dave, I cannot let you use setPos\(x,y\) in this exercise. Walk to your goal instead."/) { } else { $error++; print STDERR "$file : $line"; } } } print "#errors: $error\n";check_pseudoMD.pl0000755000175000017500000000204312620453120014571 0ustar mquinsonmquinson#! /usr/bin/perl use strict; my @langs = qw,python java scala c,; my $errorCount = 0; sub error($) { print $_[0]; $errorCount++; } print "Checking for errors about language pseudo-markup ([!python] etc)\n"; foreach my $file (qx(find src -name '*html')) { chomp $file; open my $fh, '<', $file or die "unable to open file '$file' for reading : $!"; my @arr = <$fh>; close $fh; # close as soon as possible for my $line (@arr) { for my $lang1 (@langs) { error "$file: [$lang1] instead of [!$lang1].\n $line\n" if ($line =~ /\[$lang1\]/); for my $lang2 (@langs) { error "$file: [$lang1|$lang2] instead of [!$lang1|$lang2].\n $line\n" if ($line =~ /\[$lang1\|$lang2\]/); for my $lang3 (@langs) { error "$file: [$lang1|$lang2|$lang3] instead of [!$lang1|$lang2|$lang3].\n $line\n" if ($line =~ /\[$lang1\|$lang2\|$lang3\]/); } } } error "$file: [!/] instead of [/!].\n $line" if ($line =~ m|\[!/\]|); } } print "$errorCount errors found.\n"; exit $errorCount;doc/0000755000175000017500000000000012620453120012122 5ustar mquinsonmquinsondoc/reporting/0000755000175000017500000000000012620453120014133 5ustar mquinsonmquinsondoc/reporting/20141128-report.md0000644000175000017500000000442512620453120016675 0ustar mquinsonmquinsonRapport d'activité du 24/11 au 28/11 ============================== Activité de la semaine ------------------------------------ * Implémentation d'un script permettant de récupérer l'ensemble des messages de commit de [PLM-server](https://github.com/mquinson/PLM-server), servant de base à [Harvester](https://github.com/mquinson/PLM-server/blob/master/script/git/browse/Harvester.java). * Mise en place et tests d'environnement de développement d'une application Web utilisant [Play Framework](https://www.playframework.com/) pour le back-end et [Dart]() pour le front-end. * Suivi du [tutoriel d'AngularDart](https://angulardart.org/) et implémentation d'une [application de démonstration](https://github.com/MatthieuNICOLAS/play-with-dart) Problèmes rencontrés ------------------------------------- * Difficultés à mettre en place l'environnement de développement * Aucun IDE parmi *Eclipse*, *Intellij IDEA* ou *Dart Editor* ne supporte nativement **Play Framework** et **Dart**) * Des plugins existent pour permettrent à *Eclipse* ou *Intellij IDEA* de supporter **Dart**, mais certaines fonctionnalités décrites ([Dart-to-JS compiler](https://www.dartlang.org/tools/webstorm/#dart-to-js-compiler) par exemple) semblent absentes. * Des conflits peuvent se produire entre Chromium et Dartium, empêchant ce dernier de fonctionner. * Release récente de la version 1.0 d'**AngularDart**: certains [exemples](https://angulardart.org/demo/) de code n'ont pas encore été mis à jour. Objectifs pour la semaine suivante --------------------------------------------------------- * S'assurer que la procédure de mise en place de l'environnement de développement décrite [ici](https://github.com/MatthieuNICOLAS/play-with-dart/blob/master/README.md) est complète. * Étudier comment déployer [l'application](https://github.com/MatthieuNICOLAS/play-with-dart) au format *standalone* et la rendre facile d'utilisation. * Possibles pistes [ici](https://www.playframework.com/documentation/2.4.x/ProductionDist) et [là](http://scalatron.github.io/). * Implémenter une application basée sur **Play With Dart** créant une instance de **PLM** et permettant à un utilisateur d'interagir avec depuis une page Web. * Revoir l'état de la branche command-view et poursuivre son développement.doc/reporting/backlog.org0000644000175000017500000000771612620453120016261 0ustar mquinsonmquinson* TODO Refactorer le code gérant la conversion en JSON des objets Scala - Voir question de la semaine du <2015-02-09 lun.> au <2015-02-13 ven.> * TODO Mettre en place un outil de concaténation et de minification du JS - Plutôt que de charger plusieurs fichiers JS, il serait préférable que le client ne charge qu'un seul fichier contenant tout le code JS nécessaire à l'application. - Ceci permettrait d'améliorer les performances de l'application en réduisant le temps de chargement de la page (1 seule requête HTTP pour le JS au lieu de... beaucoup). - Minifier le code de ce fichier permettrait d'améliorer encore plus la vitesse de chargement de la page. - Voir du côté de [[http://gruntjs.com/][Grunt]]. * TODO Automatiser les tests du JS - Il faudrait que les tests JS s'exécutent de façon automatique. - Les tests pourraient se lancer à la suite de la tâche de concaténation et de minification du code JS. - Voir si un plug-in *Grunt* existe pour *jasmine*. * TODO Interrompre l'exécution du programme si une exception est levée - Le programme devrait s'interrompre lorsqu'une exception est levée, par exemple lorsqu'on essaie de poser un baggle sans en avoir un. * TODO Créer un mode d'auto-complétion pour BuggleWorld * TODO Fixer le bug du baggle ne s'affichant pas - Lorsque webPLM a été testé sur le Mac de Gérald, le baggle présent normalement dans l'exercice n'était pas affiché. - Reste à voir si ce bug est reproductible. * TODO Lancer la démo lorsqu'on bascule sur le monde objectif pour la 1ère fois * TODO Limiter la vitesse d'exécution du programme du client - Si l'utilisateur boucle indéfinitivement sur une ou des méthodes ne comportant pas de stepUI, tel que System.out.println, alors son programme surcharge le serveur empêchant l'utilisateur de le stopper autrement qu'en arrêtant manuellement le serveur. - Lancer le programme de l'utilisateur dans une autre JVM permettrait de mieux contrôler son exécution et de corriger ce problème. * TODO Modifier les messages concernant l'envoi de données au serveur - Actuellement, plusieurs messages sont affichés pour informer l'utilisateur que PLM est en train d'envoyer les données de son activité au serveur. - Ces messages apparaissent même si l'utilisateur a refusé de communiquer ses données, ce qui peut prêter à confusion. SCHEDULED: <2014-12-08 lun.> * TODO Indiquer à l'utilisateur si la connexion avec le serveur a été perdue - Rien n'indique actuellement à l'utilisateur que la communication avec le serveur a été interrompue, ce qui peut être confus. * TODO Mettre en place un processus de reconnexion de la websocket - Si le serveur rencontre un problème momentané, le client doit être le moins possible impacté. - Une tentative de reconnexion de la websocket à intervals réguliers permettrait d'éviter à l'utilisateur de recharger la page et (surtout) perdre ses dernières modifications. * TODO Vérifier le bon fonctionnement de Git côté serveur - PLM affiche le message suivant au démarrage du serveur: "Impossible de récupérer une session adéquate sur les serveurs...". * TODO Retirer la partie UI présente dans PLM-library * TODO Permettre à un utilisateur de gérer les vues des mondes dynamiquement - Actuellement, seul le monde selectionné est affiché. L'utilisateur doit donc changer de monde selectionné pour observer l'exécution du programme sur un autre monde. - Donner les moyens à l'utilisateur d'ajouter ou de retirer dynamiquement les vues des mondes permettrait à chacun de personnaliser son interface. * TODO Se renseigner sur seccomp-bpf - Permettrait de sandboxer les programmes utilisateurs, à voir comment ça s'utilise et cela fonctionne. * TODO Se renseigner sur Docker - A première vue, ça pourrait être utile pour exécuter le code des clients une fois passé en mode serveur centralisé. doc/reporting/activity-report.org0000644000175000017500000010007312620453120020012 0ustar mquinsonmquinson* Informations Ce fichier contient le journal de bord de Matthieu Nicolas concernant son activité sur PLM. ** Bibliographie - https://github.com/oster/PLM Le lien vers le repo de la version originale de PLM - https://github.com/MatthieuNICOLAS/webPLM Le lien vers le repo de la version web de PLM * Journal de bord ** Semaine du <2015-02-09 lun.> au <2015-02-13 ven.> *** Done **** DONE Etablir le plan de la présentation **** DONE Créer un dépôt pour la présentation - Voir [[https://github.com/MatthieuNICOLAS/IJD-seminar-2015-03-03][ici]]. **** DONE Prendre en main reveal.js - Ajout de [[https://github.com/hakimel/reveal.js][reveal.js]] au dépôt. - Utilisation de [[http://johnmacfarlane.net/pandoc/][Pandoc]] pour [[http://johnmacfarlane.net/pandoc/demo/example9/producing-slide-shows-with-pandoc.html][générer les slides]] à partir d'un fichier *Markdown*. **** DONE Ajouter l'opération BuggleDontHaveBaggle **** DONE Ajouter l'opération CellAlreadyHaveBaggle **** DONE Mettre en place les tests unitaires pour le code JS - Ajout de [[http://jasmine.github.io/][jasmine]] et de [[http://sinonjs.org/][sinon]] au projet. - Création d'une [[http://localhost:9000/specRunner][page]] permettant d'exécuter les tests. - Ajout de tests unitaires pour les principales opérations. - Ajout de tests unitaires pour les constructeurs des modèles de données. - Ajout de tests unitaires pour *BuggleWorld*. - Ajout de tests unitaire pour *canvas*. *** Questions **** Créer le type d'opération "ExceptionOperation" ? - Actuellement, il existe un type d'opération spécifique pour chaque au type d'exception existant. - Ne faudrait-il mieux pas créer un type d'opération générique possédant juste un nom et un message? - Cela permettrait de factoriser le code de la génération des opérations et de leur exécution. - Mais cela perdrait en clarté selon moi. - Réponse Mt: On a pour l'instant une exception par type de problème potentiel car je me disais qu'un jour, les apprenants pourraient vouloir rattraper des exceptions et agir en conséquence. Il faut donc pas arrêter de faire ainsi, stp. **** Refactorer BuggleWorld.generateOperation (JS) ? - En appliquant *JSHint* sur *BuggleWorld*, j'ai relevé un avertissement généré expliquant que la complexité cyclomatique de *generateOperation* est actuellement trop élevée. - Ceci est dû à l'utilisation d'un switch pour déterminer quel constructeur utiliser en fonction des données reçues. - Comment pouvons-nous refactorer *generateOperation* pour que sa complexité ne soit plus une source d'avertissement? **** Refactorer le code gérant la conversion en JSON des objets Scala ? - Les objets Scala du serveur sont transmis au client après avoir été converti au format JSON. - Pour chaque type d'objet, une fonction de conversion est définie. - Ces fonctions sont actuallement éparpillées dans plusieurs fichiers: *PLMActor* et *ExecutionSpy* - Comment mieux gérer cette partie du code? Mise en place d'un utilitaire? *** Planned **** TODO Préparer la présentation pour le séminaire IJD - Travailler le plan de la présentation - Voir pour essayer [[https://github.com/hakimel/reveal.js][reveal.js]]. **** TODO Ajouter des opérations correspondant aux exceptions levées - BuggleDontHaveBaggleException - CellAlreadyHaveBaggle - BuggleInOuterSpaceException - "Sorry Dave, I cannot let you use..." **** TODO Poursuivre le développement de tests unitaires - Ajouter des tests unitaires pour le code JS permettrait de s'assurer de la robustesse du code. - Voir comment utiliser [[http://jasmine.github.io/][jasmine]]. - Voir comment utiliser [[http://sinonjs.org/][sinon]]. ** Semaine du <2015-02-02 lun.> au <2015-02-06 ven.> *** Done **** DONE Stocker localement la vitesse d'exécution de l'animation - Il serait intéressant pour l'utilisateur que la vitesse d'exécution de l'animations soit conservée entre les exercices/entre les sessions. - Utilisation de *localStorage*? - Il existe un module *ngStorage* permettant de stocker facilement avec *localStorage* une valeur manipulée par *AngularJS* - Implémentation de *ngStorage*. - *ngStorage* semble ne plus être maintenu et comporter plusieurs problèmes: [[http://stackoverflow.com/questions/28136231/angularjs-controller-is-caching-in-firefox-and-ie-how-to-disable][voir ce thread]]. - Implémentation de [[https://github.com/tymondesigns/angular-locker][angular-locker]] à la place. **** DONE Fixer le bug de "Program steps" dans le cas d'un monde possédant plusieurs entités - Dans certains exercices, tels que BDR, plusieurs entités (buggles dans ce cas là) sont présentes dans le monde. Le programme de l'utilisateur s'exécutant en concurrence sur chacune des entités, les buggles bougent de façon chaotique jusqu'à atteindre l'état final. - A cause de cela, les pas décrits dans "Program steps" ne correspondent pas à un pas d'un buggle mais aux actions de plusieurs, ce qui peut gêner la compréhension du programme. - Stocke maintenant les opérations dans les entités et non plus dans un tableau commun au monde. - Lorsqu'un *worldStep* est détecté, on n'envoie les opérations que des entités étant marqué comme prête à envoyer. **** DONE Permettre à l'utilisateur de sélectionner une leçon en double-cliquant dessus - *$location.path* permet de rediriger l'utilisateur vers une nouvelle page - *ng-dblclick* permet de détecter un double-clique **** DONE Fixer le changement de monde involontaire - Dans le 1er exercice de la leçon labyrinthe par exemple, lorsque l'utilisateur exécute son programme, la vue du monde passe toute seule sur la celle de *Blue cheese*. - Dû à une erreur dans la méthode *reset*, qui remplaçait le monde affiché actuellement par le monde qu'on venait de remettre à zéro. **** DONE Permettre à l'utilisateur d'écourter le replay - Lorsque l'utilisateur rejoue l'exécution de son programme, il n'a pas d'autres choix que d'attendre la fin de l'animation pour pouvoir naviguer de nouveau entre les étapes. - Il devrait pouvoir stopper l'animation (avec les boutons *reset* et *last* ?) **** DONE Fixer les buggles décalés - Si le monde n'est pas carré, les buggles ne sont pas correctement alignés sur le damier **** DONE Etudier les options de codeMirror - Auto-complétion des {}, ()... => Add-on [[http://codemirror.net/doc/manual.html#addon_closebrackets][closebrackets]] - Suggestion de mots-clés => Add-on [[http://codemirror.net/doc/manual.html#addon_show-hint][show-hint]] - Indentation par défaut => Option *tabSize* à passer dans la directive AngularJS **** DONE Mettre en valeur le message d'erreur reçu lorsqu'on n'a pas réussi un exercice - Message affiché dans l'onglet "Result", mais rien n'indique que quelque chose de nouveau y est écrit. - Maintenant sélectionne l'onglet "Result" automatiquement lorsqu'il est mis à jour. **** DONE Fix la compilation en Scala - J'ai tenté de jouer avec les versions de Scala utilisées (2.10, 2.11) et avec l'origine de la dépendance (PLM ou webPLM) pour corriger le bug, sans succès. - Je suis tombé sur [[http://stackoverflow.com/questions/27470669/scala-reflect-internal-fatalerror-package-scala-does-not-have-a-member-int][ce sujet]] traitant d'un problème similaire, mais aucune réponse n'a été proposée. - Lancer l'application avec *activator start* au lieu de *activator run* permet de "résoudre" le problème! **** DONE Bloquer les actions utilisateurs pendant le changement du langage de programmation - Empêcher l'utilisateur de changer le langage de programmation actuel alors qu'un programme est en cours. **** DONE Ajouter un message de félicitations lorsque l'utilisateur réussit un exercice **** DONE Ajouter un bouton permettant de passer à l'exercice suivant **** DONE Permettre à l'utilisateur de parcourir la liste des exercices **** DONE Permettre à l'utilisateur de passer à l'exercice suivant **** DONE Récupérer la liste des exercices pour chaque leçon - getRootLectures permet de récupérer les exercices principaux d'une leçon - getChildren permet ensuite de récupérer les exercices secondaires *** Questions **** Pourquoi la compilation de code Scala ne fonctionne pas si on lance l'application en mode développement? - Post d'une [[https://groups.google.com/forum/#!topic/play-framework/a_80eHRxbAk][question]] sur la mailing list de *Play Framework* pour demander des explications, en attente d'une réponse. **** Y a-t-il un intérêt à extraire la liste des exercices de ExerciseController pour en faire un data service? - Un service permettrait de ne récupérer qu'une fois la liste des exercices au début d'une leçon, puisque les données sont conservées entre plusieurs pages. - Mais comment le service serait informé du changement de leçon, s'il y en a eu un? **** Comment gérer les opérations rajoutées par l'exercice ? - Dans l'exercice *Voie du paradis*, les cases sur lesquelles passent le buggle s'illumine d'elles-même au fur et à mesure de l'exécution. - Ca correspond à l'ajout d'opérations dans *Program steps* mais qui ne correspondent pas au pas attendu (le buggle avance alors qu'il est écrit qu'il est en train de peindre la case par exemple). - Répone Mt: ha oui, c'est dommage. La magie de ce genre d'exercice va un peu tomber à l'eau. Tant pis pour l'instant. *** Planned **** TODO Fixer la duplication des baggles - Un buggle a pu ramassé un baggle et le reposer ailleurs, sans que le baggle original ne soit retiré de la vue du monde. **** TODO Fixer le baggle invisible - Lors de la séance de test réalisée avec Gérald sur son Mac, un baggle présent dans l'exercice n'était pas dessiné. **** TODO Refactorer le code concernant le passage au prochain exercice - Nettoyer le code - Voir pour l'extraire de ExerciseController et en faire un service **** TODO Poursuivre le développement de tests unitaires ** Semaine du <2015-01-27 mar.> au <2015-01-30 ven.> *** Done **** DONE Rédiger le README du projet **** DONE Permettre à l'utilisateur de changer le langage de programmation - Pour chaque exercice, récupérer la liste des langages disponibles et le langage actuellement selectionné. - Afficher cette liste côté client. - La liste doit permettre de changer le langage actuellement sélectionné ainsi que le mode de l'IDE. **** DONE Refactorer drawBuggleImage - La méthode actuelle rencontre des difficultés à changer la couleur du Buggle: getImageData permet ed récupérer les pixels représentants l'image et de les modifier, mais ceux-ci correspondent aussi à la cellule sur laquelle se trouve le buggle... - Il faut donc colorier uniquement les pixels du buggle. - Le buggle dessiné n'a pas non plus toujours la bonne taille. - [[http://fabricjs.com/][Fabricjs]] propose des fonctions permettant de manipuler les images, à étudier. *** Questions **** Pourquoi la compilation de code Scala ne fonctionne pas dans webPLM mais fonctionne dans PLM? *** Planned **** CANCELLED Refactorer les controllers - Retirer les parties du codes interrogeant le serveur pour récupérer la liste des exercices/les données d'un exercice des controllers et en faire des services à la place. - Actuellement nécessaire d'écouter l'évènement "onmessage" pour traiter les messages provenant du serveur et n'étant pas une réponse à une requête (par exemple "operations"), on peut donc difficilement sortir complètement la logique de communication client/serveur des controllers. ** Semaine du <2015-01-19 lun.> au <2015-01-23 ven.> *** Done **** DONE Permettre à l'utilisateur de consulter l'API du monde **** DONE Ajouter des tests unitaires côté serveur - Voir [[https://www.playframework.com/documentation/2.3.x/ScalaTestingYourApplication][la documentation de Play]] concernant l'ajout de tests unitaires. - Ajout de tests unitaires pour models.PLM. - Ajout de tests unitaires pour log.RemoteLogWriter. **** DONE Retravailler l'interface de l'exerciseur - Revoir le placement des différents composants: consigne, éditeur de code, vue du monde/player. - Ajouter la console de log. - Ajouter le composant "dernier résultat" indiquant si le programme lancé a passé les tests et indiquant l'erreur rencontré dans le cas contraire. - Ajouter une liste des actions réalisées pour chaque monde (alternative au slider). - Lier les nouveaux composants aux données du controller. **** DONE Intégrer les collisions avec les murs de BuggleWorld dans WebPLM - Gestion des collisions avec les murs - Transmission du message d'erreur au client - Arrêt de l'exécution du programme **** DONE Intégrer les messages au sol de BuggleWorld dans WebPLM - Gestion des messages au sol (attribut content) - Ajout des opérations correspondantes - Représentation des messages dans l'interface cliente **** DONE Refactorer l'architecture du projet côté client - Voir les bonnes pratiques listées dans [[https://github.com/johnpapa/angularjs-styleguide][ce guide]] et [[https://github.com/toddmotto/angularjs-styleguide][celui-ci]]. - Utilisation de [[http://requirejs.org/docs/commonjs.html][CommonJS]] pour gérer les dépendances? => Non, juste besoin de lister l'ensemble des fichiers JS dans index.html. - Déplacement des directives: une par fichier. **** DONE Fix Logger.debug - Rediriger la sortie standard vers l'interface client empêche les messages de debug du serveur de s'afficher. - Ajout d'un LoggerUtils s'occupant de désactiver/réactiver la capture de la sortie lorsque l'on souhaite logger. **** DONE Rediriger ce qui est écrit dans la console de la PLM vers l'interface client - Voir Game.setOutputWriter - Ajout de RemoteLogWriter qui redirige la sortie standard vers la websocket. **** DONE Fix la démo de RandMouseMaze - Lorsqu'on exécute la démo de cet exercice, le baggle n'est pas ramassé à la fin. De plus, si on recharge la page et relance la démo, la 1ère opération effectuée sera celle ramassant le baggle. - Ajout d'un stepUI à la fin de pickupBaggle *** Questions *** Planned ** du <2014-12-01 lun.> au <2015-01-16 lun.> *** Done **** DONE S'assurer que la procédure de mise en place de l'environnement de développement décrite ici est complète. **** DONE Étudier comment déployer l'application au format standalone et la rendre facile d'utilisation **** DONE Créer une archive zip de l'application à partir [[https://www.playframework.com/documentation/2.4.x/ProductionDist#Using-the-dist-task][des instructions suivantes]] SCHEDULED: <2014-12-02 mar.> - L'archive résultante possède deux binaires, un pour les environnements UNIX et un pour les environnements Windows. **** DONE Vérifier que le binaire pour UNIX fonctionne correctement SCHEDULED: <2014-12-02 mar.> **** DONE Vérifier que le script .bat fonctionne correctement SCHEDULED: <2014-12-02 mar.> **** DONE Mettre en place plusieurs vues côté client SCHEDULED: <2014-12-17 mer.> - *Angular* permet de créer des applications web fonctionnant en 1 page. - L'application reste néanmoins composée de plusieurs vues qui sont chargées à la volée par *Angular* selon l'état actuel. - Il faut donc modifier le code de l'interface cliente pour diviser l'application en vues. **** DONE Création de l'interface de l'exerciseur **** DONE Affichage de la consigne de l'exercice SCHEDULED: <2014-12-18 jeu.> - Quelques soucis de CSS encore par contre... **** DONE Implémentation d'un éditeur de code SCHEDULED: <2014-12-19 ven.> - *CodeMirror* semble fonctionner correctement avec *Angular* grâce à [[https://github.com/angular-ui/ui-codemirror][ce module]]. **** DONE Représentation du monde courant et de son état **** DONE Récupérer le code de l'étudiant pour l'exercice en cours SCHEDULED: <2014-12-19 ven.> - Reprendre le code utilisé dans GitSpy **** DONE Permettre à l'étudiant d'exécuter son code SCHEDULED: <2015-01-05 lun.> **** DONE Ajouter un bouton qui permet à l'étudiant d'envoyer son code à un web-service - La fonction déclenchée lors du click doit récupérer le code contenu dans CodeMirror et le transmettre au web-service. **** DONE Le web-service exécute le code de l'étudiant - Reprendre le code utilisé dans les tests **** DONE Le web-service renvoie le résultat au client - Actuellement, n'attend pas la fin de l'exécution du code pour envoyer le résultat (faussé du coup). - Modifier le web-service pour qu'il attende que le thread exécutant le programme se termine? - Web-service modifié pour qu'il ajoute un progressSpyListener à PLM, qui se charge de communiquer les résultats de l'exécution au client. **** DONE L'interface affiche le résultat de l'exécution **** DONE Afficher les étapes de l'exécution du code de l'étudiant **** DONE Modifier les interactions entre le client et le serveur - Pour permettre au serveur d'envoyer des données en continu au client lors de l'exécution d'un programme, une WebSocket est requise. **** DONE Permettre à PLM de streamer l'exécution du code - Créer une classe basée sur [[https://github.com/oster/PLM/blob/command-view/src/plm/universe/Bridge.java][Bridge]] et [[https://github.com/oster/PLM/blob/command-view/src/plm/universe/ISender.java][ISender]] enregistrant les différents actions effectuées à chaque pas et les écrivant dans un stream. - Créer une classe implémentant IWorldView et vidant un buffer à chaque WorldHasMoved? **** DONE Transmettre le stream de l'exécution du code au client - Le serveur doit rediriger le stream dans la websocket du client. - Pas de solution simple pour créer un stream? - Donner à la classe une référence vers PLMActor et utiliser sa méthode createMessage permet de contourner ce problème. **** DONE Envoyer l'état initial du monde - Au démarrage d'un exercice, le serveur doit fournir au client l'état initiaux des mondes. **** DONE Créer le modèle local du monde - Le client doit récupérer les données pour créer un modèle local de chaque monde en fonction de son type. **** DONE Représenter côté client le monde de l'exercice - Une fois le modèle du monde créé, il faut ensuite dessiner sa représentation. **** DONE Ajouter un bouton permettant de stopper l'exécution en cours - Si l'étudiant code une boucle infinie, cela peut s'avérer plus pratique que de devoir redémarrer le serveur. **** DONE Permettre à l'utilisateur de naviguer entre les étapes de son programme - La liste des opérations reçues doit être stockée pour chaque monde et l'utilisateur doit pouvoir les jouer/dé-jouer pour examiner le comportement de son programme. **** DONE Etudier comment binder une valeur du modèle à un slider avec AngularJS - Ceci nous permettrait d'utiliser des sliders pour permettre à l'utilisateur de régler la vitesse d'animation ou de naviguer entre les différentes étapes du programme. **** DONE Corriger l'affichage des murs - Les murs correspondant à la bordure du monde ne sont actuellement pas dessinés. **** DONE Ajouter des types d'opérations supplémentaires - ChangeBuggleDirection - ChangeCellColor **** DONE Ajouter la gestion des baggles **** DONE Retirer le délai d'exécution côté serveur **** DONE Récupérer l'état objectif du monde - Plutôt que de récupérer l'état objectif du monde, on peut se contenter de récupérer les opérations obtenues lors de l'exécution de la solution. **** DONE Permettre à l'utilisateur de consulter l'objectif pour chaque monde **** DONE Permettre à l'utilisateur d'exécuter le code de la solution en guise de démo - Nous n'avons pas besoin de rejouer la solution côté serveur lorsque l'étudiant souhaite voir la démo, puisque nous possèdons déjà les opérations de la solution. **** DONE Permettre à l'utilisateur de passer d'un monde à l'autre - Certains exercices comportent plusieurs mondes. - L'utilisateur doit pouvoir passer d'un à l'autre pour observer le déroulement de son algorithme en fonction des différentes conditions. - La description d'une leçon est stockée dans différents fichiers selon la langue actuellement selectionnée. On utilise donc /FileUtils/ pour récupérer la description de la langue choisie. - Mais /FileUtils/ utilise /Locale/ pour déterminer le fichier à lire, qui semble rencontrer des problèmes d'initialisation avec *Play framework*. - Affecter la valeur par défaut à /Locale/ avant le test levant l'exception permet de pallier temporairement à ce problème. **** DONE Instancier Game au lancement du serveur - Game n'est instancié qu'au moment où le serveur l'interroge. Son instanciation prenant plusieurs secondes, elle entraîne un timeout qui renvoie une erreur à l'utilisateur. **** DONE Mettre en place une routine permettant de compiler les fichiers Dart en Javascript, rendant l'application compatible avec tous les navigateurs SCHEDULED: <2014-12-02 mar.> - Dans Eclipse, le plugin Dart et son option /pub build/ permettent de générer un dossier *build* contenant le code Dart ainsi que son équivalent Javascript. Cependant, il est ensuite nécessaire de modifier les références vers les scripts pour qu'elles pointent vers ce nouveau dossier: - Soit nous mettons à jour les références côté client (fichiers HTML) pour tenir compte de ce changement, - Soit nous modifions le fichier /conf/routes.conf/ pour que ça soit le serveur qui redirige les requêtes des clients vers les bons fichiers. - Après plusieurs tests plus poussés, l'option /pub build/ ne fonctionne pas (plus?). En effet, lorsqu'on définit le template HTML d'un *Component* (élément basique d'*AngularDart*) dans un autre fichier que dans /component.dart/, /pub build/ échoue car il n'arrive pas à le localiser. Quant à la commande /dart2js -o main.dart.js main.dart/, elle fonctionne toujours et permet de générer directement les fichiers Javascript à l'emplacement souhaité. **** DONE Modifier /build.sbt/ pour lancer la commande /dart2js -o main.dart.js main.dart/ avant de créer l'archive zip SCHEDULED: <2014-12-02 mar.> - J'ai rencontré des difficultés à modifier /build.sbt/ pour que les fichiers Dart soient compilés avant la création de l'archive. Je n'ai en effet pas trouvé comment configurer *sbt* pour ajouter l'exécution d'une commande shell lors du build. - J'ai donc créé un script shell se contentant de lancer les deux commandes à la suite et permettant ainsi de rendre l'application compatible avec tous les navigateurs et de l'exporter dans une archive zip. **** DONE Instancier un objet PLM côté serveur SCHEDULED: <2014-12-03 mer.> - Plusieurs problèmes ont été rencontrés avant de réussir à instancier un objet PLM depuis un projet Play Framework. - Tout d'abord, le jar produit par PLM embarque pour plusieurs librairies, dont le *compilateur Scala*. Ceci provoque alors un doublon avec la configuration par défaut d'un projet *Play Framework*. Il a donc fallu retirer cette librairie du build de PLM. - Par défaut, Play Framework utilise la /version 2.11/ du compilateur Scala. Cette version est cependant incompatible avec PLM, qui est compilée à l'heure actuelle avec la /version 2.10.5/ du compilateur. Pour permettre à l'application de fonctionner, il faut donc downgrader la version de scala utilisée en modifiant la valeur affectée à ~scalaVersion~ dans /build.sbt/. **** DONE Mettre en place un webservice RESTful permettant d'interagir avec PLM SCHEDULED: <2014-12-04 jeu.> **** DONE Ajouter pop-up au démarrage informant l'utilisateur que PLM conserve une trace de son activité suite au [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772026][bug report suivant]] SCHEDULED: <2014-12-05 ven.> **** DONE Permettre aux utilisateurs de désactiver l'envoi de la trace de leur activité au repo central SCHEDULED: <2014-12-05 ven.> **** DONE Ajouter une fonction à PLM retournant la liste des leçons SCHEDULED: <2014-12-08 lun.> **** DONE Etudier comment récupérer à partir du nom d'une leçon son image et sa description - Actuellement, /src/plm/core/ui/ChooseLessonDialog.java/ récupère à partir de la liste des leçons l'image et la description associée à chacune. Celles-ci sont contenues dans le jar de la PLM. - Maintenant que nous passons à une interface WEB, devons-nous externaliser ces fichiers (images et descriptions) pour y accéder directement depuis l'implémentation du serveur ou devons-nous les rendre accessibles par le biais d'attributs présents dans les classes exposées au serveur? - Possible d'accéder à une image contenue dans le jar à partir d'une son URL. Nous avons donc juste besoin de pouvoir récupérer le chemin de l'image associée à la leçon. - Possible de charger la description d'une leçon à son initialisation dans un champ. **** DONE Modifier PLM pour disposer d'une liste de leçons initialisées au lancement - Ceci permettrait au serveur de récupérer la liste des leçons et de leurs données, qui seraient ensuite transmises au client pour construire la page d'accueil. - Les exercices des leçons et leurs solutions seraient toujours chargées uniquement au moment où l'utilisateur essaient d'y accéder. **** DONE Charger la description d'une leçon SCHEDULED: <2014-12-11 jeu.> - La description d'une leçon est stockée dans différents fichiers selon la langue actuellement selectionnée. On utilise donc *FileUtils* pour récupérer la description de la langue choisie. - Mais *FileUtils* utilise /Locale/ pour déterminer le fichier à lire, qui n'est pas initialisée suite aux modifications apportées à l'instanciation de Game. - Il a donc fallu modifier *FileUtils* pour utiliser /getLocale/ plutôt que /locale/ directement, /getLocale/ se chargeant d'initialiser cette dernière si elle n'est pas initialisée. **** DONE Instancier Game au lancement du serveur SCHEDULED: <2014-12-11 jeu.> - Game n'est instancié qu'au moment où le serveur l'interroge. Son instanciation prenant plusieurs secondes, elle entraîne un timeout qui renvoie une erreur à l'utilisateur. - /Play Framework/ permet de définir un objet *Global* permettant de surcharger les fonctions appelées au lancement et au stop de l'application. Ceci permet d'instancier *Game* au démarrage. **** DONE Afficher la page d'accueil de l'application automatiquement au lancement du serveur SCHEDULED: <2014-12-12 ven.> **** CANCELLED Faire un mock-up de l'interface WEB - Il convient de choisir un framework CSS au préalable pour faciliter le développement de l'interface WEB. [[http://usablica.github.io/front-end-frameworks/compare.html][Cette page]] liste un grand nombre de ces derniers. - *BootStrap*, *Foundation* se démarquent par leur communauté importante (surtout *BootStrap*). - *Semantic UI* est aussi un choix intéressant, mais semble encore jeune (trop?). - Il est aussi important de prendre l'intégration du framework CSS avec le framework JS utilisé: il semblerait que les frameworks tels qu'*Angular* peuvent buggés suite à une modification du DOM par un autre script. **** DONE Ajouter pop-up au démarrage informant l'utilisateur que PLM conserve une trace de son activité suite au [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772026][bug report suivant]] SCHEDULED: <2014-12-05 ven.> **** DONE Permettre aux utilisateurs de désactiver l'envoi de la trace de leur activité au repo central SCHEDULED: <2014-12-05 ven.> **** DONE Implémenter une page web incorporant un éditeur de code tel que [[http://ace.c9.io/#nav=about][Ace]] ou [[http://codemirror.net/][CodeMirror]] depuis Dart SCHEDULED: <2014-12-08 lun.> - Création d'un /Component/ se chargeant des interactions entre Dart et Ace. - Mais avec AngularDart, un Component est inclus dans son propre *ShadowDom* ce qui empêche Ace de trouver l'élément à transformer en éditeur de code. - Possibilité de désactiver le ShadowDom en modifiant l'attribut ~useShadowDom~ du Component. - Hériter de *ShadowRootAware* permet d'écouter l'évènement *onShadowRoot* qui indique quand le DOM est chargé. **** DONE Tester Foundation SCHEDULED: <2014-12-15 lun.> - *Foundation* propose des fonctionnalités qui peuvent s'avérer intéressantes telles que [[http://foundation.zurb.com/docs/components/block_grid.html][celle-ci]] ou encore [[http://foundation.zurb.com/docs/components/joyride.html][celle-là]]. - Mais sa faiblesse est qu'il ne gère pas l'HTML généré dynamiquement (voir les issues [[https://github.com/zurb/foundation/issues/5503][#5503]] et [[https://github.com/zurb/foundation/issues/4827][#4827]]). - Pour pallier à ce problème, il est nécessaire d'appeler la méthode /$(document).foundation()/ à chaque fois que l'on modifie le DOM et que l'on souhaite utiliser une fonctionnalité de *Foundation*. - Est-ce que des appels répétés à cette méthode peuvent être handicapant pour l'application et ses performances au cours d'une longue session d'utilisation? *** Questions *** Planned **** TODO Modifier les messages concernant l'envoi de données au serveur - Actuellement, plusieurs messages sont affichés pour informer l'utilisateur que PLM est en train d'envoyer les données de son activité au serveur. - Ces messages apparaissent même si l'utilisateur a refusé de communiquer ses données, ce qui peut prêter à confusion. SCHEDULED: <2014-12-08 lun.> **** CANCELLED S'assurer que la procédure de mise en place de l'environnement de développement décrite [[https://github.com/MatthieuNICOLAS/play-with-dart/blob/master/README.md#getting-started][ici]] est complète. **** CANCELLED Créer un jar de l'application [[https://www.playframework.com/documentation/2.4.x/ProductionDist#Using-the-SBT-assembly-plugin][à partir des instructions suivantes.]] SCHEDULED: <2014-12-01 lun.> - Lors de la création du jar, plusieurs erreurs surgissent: En effet, les librairies importées par Play Framework par défaut déclenchent un conflit puisqu'elles déclarent des classes avec le même nom. Il est donc nécessaire de définir une [[https://github.com/sbt/sbt-assembly#merge-strategy][stratégie de résolution des conflits.]] - Tout d'abord,il faut remplacer /assemblyMergeStrategy/ de leur exemple par /mergeStrategy/ dans notre cas (doc pas à jour?)). - Utiliser /MergeStrategy.rename/ lève l'exception /Java.io.FileNotFoundException/. En effet, les fichiers en conflits sont renommés, et leur nouveau nom dépasse 255 caractères. Ceci empêche donc la création du jar. - Utiliser /MergeStrategy.last/ permet au build de passer. Cependant, la classe /play.core.server.NettyServer/ n'est pas embarquée dans le jar, empêchant ainsi l'application de fonctionner. - Utiliser une combinaison de /MergeStrategy/ telle que: ~mergeStrategy in assembly := { case "META-INF/MANIFEST.MF" => MergeStrategy.rename case _ => MergeStrategy.first }~ gènère aussi un jar ne fonctionnant pas car une dépendance est manquante. **** CANCELLED Voir si on peut facilement passer d'un fichier /routes.conf/ pour le développement à un fichier /routes.conf/ pour le déploiement SCHEDULED: <2014-12-02 mar.> **** CANCELLED Implémenter une page web incorporant un éditeur de code tel que [[http://ace.c9.io/#nav=about][Ace]] ou [[http://codemirror.net/][CodeMirror]] depuis Dart SCHEDULED: <2014-12-08 lun. **** CANCELLED Tester Bootstrap SCHEDULED: <2014-12-16 mar.> - *Bootstrap* serait capable de détecter automatiquement les changements apportés au DOM. - Il reste à déterminer si cette détection automatique est plus performante que le refresh manuel de *Foundation*. img/0000755000175000017500000000000012620453120012131 5ustar mquinsonmquinsonimg/focus_check.svg0000644000175000017500000000557212620453120015137 0ustar mquinsonmquinson image/svg+xml img/world_turtle.png0000644000175000017500000000307012620453120015365 0ustar mquinsonmquinsonPNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  -IDATXˏ[~3ml cf @ "b) !@da)(REؠ<EY  <3n{3~Tu=e@3HYoWswϩsH2yoy=oY[C6Ay]A /4M9-x9U^8ykuʽ[}__==.-' 4T8j"KH㤗vy>ʓ4QYBsRh,h3__.SO51h9s B<;-rh.躏k n+- &9Ö)8({=ZzOPi'`jA XI㪗+p:@A)N?ޏ^`wS3ג#JP dnāp=0R(2Rm!`˝Z<.?P]A:eS0sV0# 0%4HFb4nŗ>gOBh⻥|4۷ SHz$h`0Q0IDz&-,r2/<\p/m3`>͒L;@|l6Ԣ=%@\T[| dT.<_ HacS,Wy9Gހ6ry M0s R\%(V.ukkZ?>jM7(.N8CݠYg?Twv4j(k+ !:Hn*UEH 5 Ρ>nt%7FO̓ޏK!@pK]#ٜHX9i-%<WpC~ZmTMEӝxjgGXL"S=!-elk5QOpq*YLn2x]) r9U)_9xWU0BcXvE4MDYQCLz Z|uyδ6⫙?U0Ͻ*uWŞ6$S>mqtW Bn^`ʵ$BNܹqw}~=nqiqsgk?]+owoi<@e]X)k|<2;ݑt$.:-%tEXtdate:create2013-06-15T22:23:36+02:00Vf%tEXtdate:modify2009-02-06T13:44:35+01:001IENDB`img/edit_baggle.png0000644000175000017500000000224212620453120015065 0ustar mquinsonmquinsonPNG  IHDR szzsRGBbKGD pHYs B(xtIME .:_Q"IDATXŗlSUǿ}u}[;mɺ ƪl5Řm(DŽaDHb Ƅ!H&Re dA Ua׽n?6ues={ι ^qOKq8wb90@(FvA1Tπ.[ J",g؎seEn- ʑE׽<قxW2c N[ 8.\l`z rڐۊI9 `©rs&n|PH`&2cAO; ym# >9zٯ qs Q~ƚ^C3^o ދ%J *]I=l8JH j?%Np%\% VS"ᔜ;~8/_yEƾz6C\]mޚt$c?ȫ3F>F:(x7]j]/mӱot=7wF.KWzy@\axق吪uD\7 ׵v0v@=-3}(>w|B Mḥh''Õ/CîGMyf}05hʇ 'z?eV=P!I(\=6{?in1+,t1=O W,\Wi>5}~U[>0H?Zp{%p3@lLU4_w +c ;n.%ĶAlqDð;@TcߥχS:΃C߅>zزC!a;ape 6hw/LW{/'@Cе4W [yPq 42?C!UWýC{l 3e,)&.z9w f[Ɗ~ܾGW#ƮK>s}K%j=g MW¹ t]Hr/ȡP \f3!5Z.W ԏ0 f%ѤF@O5o$lr8Mbޜ![31 oTV ;Eг ~-I/NoN2pGBS* Ztm ̞.ۚԍly PVԋ- v܈zeoB6b? ֭U{hXC?%9S7HtѰkpKrb8C9sw߅^ ?,/V;^ɻ#m@ƏA6Jl%OGiP8QJ0;@2lR bpcdWA N3w9!Uܾ>Cxh'3)#C KAx 5fDWvXwr7/0}u!SƑx)7WB Xv Nͷd[r(kv>ڦg`qIPׂ д`!LB춶yJELUU@; s֔~9"pF"?=@]>yRc.yM'AHF=}t@I \#r a%rI8IL T2/2 $Eol^J,&s!H-{b:[^cC< ƌ$O ,y|abx 6A xXDB *+ab xܧ GG…j$2RPV@t!e- K)g-:  9HYKR1 7~zOCaZ(%'!v0|!X[g!x Rk3 %PS F YtlP$Љ04. ]$(Nz}h-cn 0qถMUlKm oE'^d&q*S: t:8ۻMOJu*A;7r?Nz㖷+;Bgv*aJ*~  a%*$^ڧ?35+~6gF!ȱ5COEƳɽ râi\1DCaLW5ݹі7|"x_X!~ķ]܉x6Z@)'ĺpRi_U/3jamjq-`&!9_1%Ԓ_ÅaHHs$Ѓj^JM;{QL $A%n#O1يYUS9z/,P9gw';KXf s]֜2;GcIR,aH^u _S*&=[ Iy [fb:6ֹ uڤ`MZG pNFDgF$!B} ]z̞WD0 2D{xVBa ۴Vτ@WMi(mQ[uE}vf?;?PPi+Nb9w֢x7 %V+s– /עSGޯx׹㹕;ÅOWB ,Dw iHRAJzŤi4TX޾}{̈ǛfVVn8h :猑%:/X,l"s&@bWoJ-.wmhLȊ5,,z h7t;cL_[l3[-PK0 iه,0- MJd&La #eTVָhƌʓSbyM򢖩433`eoo;7%B{skz7?ƌQA 0khJͧ],Φ$\BI0H( $&m8A),&%T0r]o7iRX8tRԶICKV*Yu\W~D$›0AwIM$q.l]e*^1#R)g/*w]ꬲ%t\*scr6-"Ix, ) ( h P 9Բ,"mY=Tʌb̘8iI]ǦdX`yz`+ _ x B" d-d&O;Slr66()8Pl(Ik[-Iث~g/6nҡ'ӆaR47I.%]' u #{z{aL,/o?yrʶ Z?zKjO={M۶on$ Ӳ0-ibӤ aJI&fRjn*ECb,%OYKZ,lkvs9H X), ;ǪةRx)1$a[tޏL [DII$R)'e@XʁkBDTT7'(w,Բ0i @yI.dē>% `"uyUg$?ߓWU2i~7la)^&R)♔HJ1LZ fźZ4ZKRXuHF@G.E]+l "wn:|RBL˳A)7u+G*’y@*x&_^@.X"A,'LRBBAò*64GߺC,-JP+ϊq]Q"beͱ"]˚$'xSE`bו+݇ p Xa0 b==mm{[-mmf{WLH nC+޽˦1$K^k#';RJO4 m#9Fpyǟ,̬fu#gG SM.{v;πoQS% !ϴmmY(Hz,6z@#Z0t=d:%e7x9b(4T+3ψVx+$*t-KĤ2D@{H7 Rq>g ۜyw jaIHYD2IH%FOooL&t%-ǫ ӬPQ'2[ʻo uA IJ骒HF++d{܌;DuǍ*l-Nܽ-.nDےx z{d*LuR_Uո˴i[k++гz׆:;z*DE_OOYwwٖNwqaB2iۄU"*0C 5Q$q9&Ep}},j<`rlX ~! #P˃aM;SӼۧM_!SlN5[{nԼiûMMJU틚'Vp`n0xm-Ζ'i"(jn1Shz`;OM% ij8Ty*{LKϯ7?zeIXO6K%RKrW$[c ^RQVh9ӄnU4eL:1.DoU W-+Rw9yY+ K\ܼu%=\=öMݽ&Jwh[\ 2|+JېLC$V`Q_ZT0 !j.RntgNWׂQȢS/~#TbvfV6fDC[X2 0 xW&v?F`[ܭ\h \gMN)fuaQ]'";8"wʋ3ZnSg36=ޤ'+ٖ!t+nmZ 9$K[à b7 [`۹2ܔ+7]71|V$m3 ܨ-释 ^@0ڷcV'3%2σ*<תbEk@(/1}uAu˃$υ[wo: `~ @ % h_#{6ש2i "32s:e{N9e\_E;.,3 >"wU-@8OX>.tAn5K~Bjȼr>LoCQdI0dviGlJ1y˂olバJ >w&z@=&}^dJ;("/ϼ}[=';7P\dh4 !-J\8-S t8Z cba[+3W2]q65 Gl)r㵢Wr0H?Xwҳ`) OȘ?M~t:qўvLLm$v}h۷UA; ⁖Dk2f]CrN / 2P0o{˯8_ 1Ԋ<2xm,MJkX,0E~] mg[W.{ M\+8ކceRRhI]k^ڕgܜkM. >rf RLlk4m|Zdkܬ uiEZRF,+oOv+:aV)NRF+vL؎pA)H.Y6:'u_WӔɯQD0R<E\5}(\Y~h:dH^9GӮB;^J; &{}5;NŊ<ҋֲKTPܮlfy<_g75N61G+s?R1~(fp`4l} :FREVܡ`DqRl[Ԛ˹Sι?r\ʏO8ɭU 9Mo=b׷5ܺD.Tŭ e t(sߖBtB@&/"6631W1BNݫI퐡G2OzFTVE6\o+ʄ`7gV ;+,6Hrnz ? ).;qxГc"!?Oނ 52 r#ɕ~&om3oFU'w4[T}$mvc Ƈ=-V!80Yш.6$rRo>JJ&%K8HV*™fe~6Akor5<f(L޺g|0I߾yqO[m2&%s u.Hfp`' 7m?6EV2Syv"?"*d'xgxϝ+ȼ 0O*4 ݤ'$lϾ!4gtbDnΟvϰ_诅SELܷO'и@ΰ.pG I-'H%NQFύ`bb;3eC,ftt}U>rPlSQ(~#Cȟ&\@!.(90n S?4 aOnncbII[Ab^`}~2"2Bc6Ud99ArY/42?Pe2NR+`ϲ3y/_ Hɟ\ǖ&.C,ST]ޭw?)b{a3xs! 7 2@PK_dg}cZ0)#VBد0I#p{b )7s=kvV~Ҳi 0Kk)|$M*7.qB7ht_9"p(-2ǼJwNa$|D{3tzX!@isz.Ie]H)tB,ߙ{R܋A7r6Pl϶pwbH*F:KmұXw4ܒ u= T}?\TڃPaU}i 5$p hshA( 8@*'YU))2ό(ۙ&yWD\i2!̻F"?^춃+BmTsW7ש;faXE+ ]BH@OB I+юP1 ia wQrO!loZyȘCXdPwGPrX{Z,W|g^a8 5@+wwEiSlX /5#+HC#mXmk`򉃔NfW5P !(H˗/=[F$ӗχЌDAZ?/&:H,> DAJ2A&ymkypVyH򉂔Ng5}>A<0ţ%=cTQ'0ΰm[ݝ (=6FvP,_,k!|O Ƅ (emwQYc"{HK#Էƪ⽞)ԣZH?5 i~\XBzO-qơ-y %>;~Dc8 Ub"B_x[U?J$L'~nJ>_>n8pTL܇؀P}QA'ޒZx 3ڇZ?6KRe?zׇ]'P]!Ĝlժ$?Sb@.JʖIENDB`img/lang_scala.png0000644000175000017500000000222712620453120014726 0ustar mquinsonmquinsonPNG  IHDR(-SgAMA asRGB cHRMz&u0`:pQ<4PLTEF s 5 '!:T u#}4s}C,/c sg Z X _  )?M n ~g~_h*S OCa^+\[%$)B^ )B^_%$+F_&$ # ' ` '%  !a FK 'g s #" 1V_ *D_\)A]\*A&Ba,CL&! o1 ,qBtRNSmP0PqDxޯ۬3v㶠8^֭*֡c`DObKGDԶwL pHYsHHFk>IDATc`@LHfV6'v0UAPHXDTLGA? 0(= $4,GA/" 2*8:&$6.>AA61)#*-% 5-=CNA!3+;'7/TQAYAUM]CSGAGWOߠIL5d0261532pYX0X&ύ 7E>V ֋. Zs6@ÂVZ=quv 7l4m۶عmRG%tEXtdate:create2013-08-05T01:28:34+02:00v%tEXtdate:modify2013-08-02T21:58:35+02:00cIENDB`img/btn-start.png0000644000175000017500000000314112620453120014554 0ustar mquinsonmquinsonPNG  IHDR sbKGD#2 pHYsvv}Ղ vpAg BIDATH}ߋ\w93;MU@\TKiAU^HeаX۠4i"MkWERzѥsvz1'm=~yϳYu4zͱᓀ~\vE߂Dl9N- >pZLC"ȍ ~isyRhR-ru2FvG?Rɕ&n"5b}C;FF_٪&JUQ+Y ɾy_n:,H$)U~c |8F=PwG#=v1Ahֺ<zKDWA{&*U6;Y=wg7ӸKRQ|-oJ*LL*;f}+U&& Jيo%gx6`CK:qriziW~'g T8gX0QO\uhM #>nWb0u/K.֒=͋o%OT1Ta[n?.;{7-gé?mAxq͗o9y%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-02-20T23:26:17-07:00M%tEXtdate:modify2010-01-11T09:29:53-07:00bjGgtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[b*v%yKtsz3tRNS3C. IDATx^l0Dїb$W"=CMKVޚ `IXg3LtNN?e̚yxGArU /낺};BLK,4y~ZV;3pVN ơiLMsr:]A}!'}/!*4 AR T0:>OpUYFWMX`vA aY]=IcFGacƀg,y6; !7u+yVEuܭrq;|TiT br4}ڲ40(!wTU4*a?zqq7CL^Ktoj):tdmۍ" *I)Y;W _NY|K@@*,}x#>KWRe**<iwޯE%~П))V%tEXtdate:create2011-04-02T15:19:38+02:00K4%tEXtdate:modify2011-04-02T15:19:12+02:00>CatEXtSoftwarewww.inkscape.org<IENDB`img/console_refresh.png0000644000175000017500000000322512620453120016021 0ustar mquinsonmquinsonPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<'IDATxb?c6#bf a|V f?0W~011@11@Ï_"6*Bg~na`U  ax$.`2{1knPQ   \ǐ/"?+ 1//[ 5 X,oќ1B59! R ,Gs^Nݟ2`!Y>ԯ^#<~3 s3CFЗM _gFJ _d0w#ìS'3q . 3v,27&] .`% $  d*Cl vw#3$e ->0t^jar`H,f8|$Ùgg?~1X0)0hr1(ܴeȜP') <<{B@ c4PchCGC] L s>bL@5gIILy0ĬIϯhv i HIJ22F01\zGx#?+002=9C~g Öc1pp3' pq}gr. L 0bǗZ>D&IK01rKD6Iـh+ ? v> A#gSf_ 20. _M fNV`FbٿSvv`dfRP@h7 l;nQ,+(,>3'`IɈ6 l3P#WW~d%0~ϟ `];rIENDB`img/world_buggle.png0000644000175000017500000001530312620453120015315 0ustar mquinsonmquinsonPNG  IHDR szz pHYs  HiCCPPhotoshop ICC profilexYWPK7s%GIdI"iHCEE ("" &D$ &@s_zZz{W?tu7?rDF1L=<ĉ/@UPMS@߁30( 8@@`,5 R8'^wo>^x fx~&VFY!qdsWT - @0@n𷧿w/dNG'5"#Qv Ӂ kG1`P6?|CTn̰tqǙ:?Lst+RkOU# @MpmJoAt YZ\8kW@%ãmB" A`f`gT`$@B8D-DCDę7!_Ł wοh2_DCQeFeyLS41S3tAAt041]je2"/'D'빅!-0?v+8hz2'nBGmn %}uh:4-0@2MPHax ;pȃ21X 8+xP!" ! r0R&-pn]x0 /a ` BD@D QCtCCO Ax$ك"GR$Ҁ\@ڐ[dy#3'CYQnTE7: j;4MAh ZEЇ0:΢qc$p8 1p\w׎p`2maT,KRucC86xa^oY"| ~?A x rm'!G8Ah&tD"QD4 :q,qYM q$ƤdŔTti= 3 s s2!ZvS+$NɀJ #&Α^H8Xvg2βŪjϚz9W2,K6&{ryFafȖVvm;3 { {%sfem#9)yg8pNsd,rpuqMRp)JCܡLq席øsyx4xxxxnxeyy#x^}Oτ// "130Oq pׂ``9!n!}!PE¨N^""V"t"]"sƢa3b1C1XM<&%[$%NJIHIn̔l|-Eґ *-5/-&U:UQ LL=EY9Yw-rrr)rrF1O : 'QEMP2JM Q7(*('(7*oh1scO7ym*toӚJJKU.ULv/jjT2'duK V % gͭ5okbhӚі.qӹ5нwQﳾ~r6n4478i0f(ngXe8f$aoTm4a,eh\gD$'SSE3=4Nsyy6RQKIFy+MV[[llZ7Xhۤt۲ںؖN)1ڷ[m^>ʾ:vsqDprt*sz|υr凫!חon~}cGCOAOgͫvǶOykzgy?!#iA~~gVXSͨ@ #A O 5 - Ji a[*OGG4G2EEEqEGuGF'EЕYc1 [F],#5;//~<0,a)-RgRTRobrv˔S;ԝS%RwLGogHe͘e~7iwG*G2qӾWd﮽5fe1F<V>ӓ[G9zz~p~!C ?-0*?y$ѭG~;{AFQe18xĮWKCKL˚˅˳O08W)R[VɫղE5wnNj˭u:Xs}wvC3ƙg̛Z);ۜ{ǟpӋo_ҹt++9WW[B[Z=[ln_n8A۱~3Nzܭ[}ozwwܻyzztzZj=ګ{+}Z}Wk?no<1h4xk|'n{l{dY^$XyUkE£o4i7px9I}vuj;bզXaj>2c'O?Z`,*7o;~ce1gI`~YgOWW%~ٮZ\_3hp0dOJ?p nFd=dNB lAbĺĦnu=ghV =/$a.yXjBFUvkMJsk6zkj&i m22ilrt֢rzN;d}yIgNmܪ/yݼΧ_L.P;H22CVAtҌ^422b>w$'z')%LI)IKI# WfD2-ɽ}/>,Xzrك/ ~XpHs5ǎ)y<4ʉʹ5k?X7{zmƅ&sf[.txrUEUͨI%7ouNƺ(݂w*ӾoGÜ^ޓ5=f +bX z5R,/S^{4falp|"xRurݩwA?t|țuxSgyᅦ/_/[bg/upC' wx#HXY l285,)nQ<{ykg9 i"b:qR?*Ʌ+*)o`(_ٸb[V.EQ?s!89eUF63vV>{9uG='=guiW6^uzxFyl^1[`L.5 զqЦnGDEZD F}IϏbH2fb%JHH2NƒJIN+Nߞ!1kwe=Q{Yei8z`1{"7j^C;BKݗG, m,oAȺYpvm;wq[A[O}ᏜtK/ L>x8)uss/f1xDd۴w˦O͜>5OK _M4spz #Qy!.3 % ̞$u6iKl9pp%Pyxhz&I,&-n*'GF̌6ŝJg6qhzTи9#OۜnP`Xct^,oZ]Rmcekk'nm]b)XWmFj~APŨcUA~boBBhbѰ(h$=.F.@vx/ U+I n)hJi3|vq]Gg/ީ}7 0s+0/v>)P##.G5  ׎-)n.9z<ԳL\|pŕʲ'jݾi g,4ٞoN=_rG.\lmr-g:߼s;]oi{^*{?<қ(o}EZ$<~bkCoioϤu-]^_@pP SHp4|}~ 3pH&0[G "h H89t!(Jh6OП8 \ ׍ aVXx٥uU37tM/)[ZXZ]҆hf羕acSKWmni35|3{5w:?D`M j) IME/V_Qjh[qxWΝ=C4L>q7NJέ}^*5: (6X;  4tSEґ CQTAhځqpAMGLۊcx=~AA'#YMLL7 ̎'?H7,,,oYXO")g9c)3VǬMy|* |,l-*.,)Ҩe;~KûgM_htmז;H=&/i{lgxQjhXDۤw;>XoPewꋎK>Z%rZ H*+BB܃ XGD$9EfQ.TVt GS3ⱳ^ _J%J D)bqɆiY $ITHgq`9JaMf ۓobc/T򥠔3IT`NmH5r!zw 9nk|dHjk:5cmwYod,ˏ:X0t4kQ|㉥Yܕu'j#H9wN텓"Ha3:nt6ݮ.[xPA'*G.>|話 Ʌ͘X;g/}[>⑥K./9rs{WӚZڛuu`u5@XM_eG~T_@(Hʔ0+r cHRMmsuzg0[PWIDATxJ+K8-"*W>.`K s&> $.q!hI0$Xw59'17dž3^^^ dAA+<>>Y]]'"N\.':sy޿}J\faaAlۦ\.Hښ4M(J~.T*IRq`u6iKVၛLdkk ˲hZ p~~Zk&''q]ϋp}}]QJ ,// Zh/aTU(0Mqm;:3<<ٔR(0 R+J1P,2eR,Ka$£#9;;C)ml6IRFX|'2 wP(P(D y?u/ضy?uov-/FIENDB`img/logo.png0000644000175000017500000011126412620453120013604 0ustar mquinsonmquinsonPNG  IHDR  %8!gAMA abKGD pHYs%%IR$tIME  -atEXtCommentCreated with GIMPW IDATxYuSK @P$kq#9Gߕ#(% )ҦDJ$%$;f]= }"& ɩ̓yr+`8&von^IӴyLGٟ4EQ77ED$ynߢK48NEQ$4 q]x+SDZϥ`]8NڂI& IW__~y^%Ir]׭\TDZmYYY-[YN_E7>}}Ru^^gq|rG4;y/kkkr5QE}@ð'oAE358R˥K꫽^zI-i4;8ww]֧t]7XsJTu~4M]וf)KKKP^:IHp$ 4 ޽ӧ;41ܸqC.^(.] D$jl7`ooO޽+wߕ$I$5/*JV4=JݖUؐ( Qnq޳gvGӧGf8lZr,..$I"zV΃yDZʽ{/ϪoJb[Wmۓ]Hpzw\Ugqgfj0 %lyd^5f*V^u~HOs  3Oiګj=$ r̹9H.$qV'ly I%egؾB߶]Q8i+.{@m0]v3YPϤ4$41neݲiQX8ی&I>>$ $adjn,L艂ypRI Q@D$ H( Q@D$ HD$ H( Q@D$ H( Q$ H( Q@D$ H(ViR!qF~m$`M@LCKO Q@84M"(`ꒄd N/i8iB(`s( I8$)Y)V Jx1yYLpXQdI*I10LoSmG= N+ $`J,$E׹883%g+ 8Œ'<깹70 4' i|d[ao4;Jc2_En#H’=B^dt;N̞~K_A0* Q@yA$A`& ۘ󒌲3.%EWGe/-Gd$ x(t8B*M=( Chh B&y kINu#g8sGmLDZx' s7cgz.q=_&ʌ }yln604>D἟u#p{'Jǒ$+NGhH$K Qjv|yWz?OϞ=Ġɂz|ߕ .anGQ4=I#۞MHV0 } p!noFQ$FC(9LogQ_h{cc#(Zq,iyYHD@uVI;ۖl3RYyAຮ,,,H[i"Y$ Gypp ZM| [ m1G.uqqW_}U|ߗM}_\ו(Uu>A=G (cXǑZ&VK._l6I Q ܼU׳$:k$8ެR|GD\DH`~^9IWʕ+W/t:Y}_|Im]{}ߗf)w~//^z}G#~&=)#dۏ|ߗvk6<ۡD/Nݖf UeP38;Ǐw+ya٩ouKPْU_]]=i4A4؂'O|CȲ& yɂ9(ctdaaAoWz˽VnOh/FEqjzez4M{$ xYa~/<> w͝ZMn{6#y*_&?FC|{s$qw\ep (CۓgϞӧO=3޶b`f){{{$ )& ~_={&=*4 _yƟo42 H4W`*Ϫc/򛓼Ew欞V/RgNjy'[$oc ׀$ TSgle2`{^_L33]Yƫ⺮i+ 0mm?*ˠȖ#{LFIB dUOUTץV|߿Uո Qꐓ$zMoGeѬ^ dsR⸉C?-ێ3ӥV/1;>9uB\ݱ,qe\<(ID* ێ<"ۍ\ˊ ѤAd F$ofp+ p:OkدGD*_4H`FԒ$خGMH$ 0I ?z !=Q`Df4Iu$,H`=aK& QN| ax33$ H( Q@DśSDZ8}.MӡW$^\\ .]$w}8 ' zQfSƍ;H*AGu(z̘RZi@$qv=Ujfm5F&ÇTPd9s$cW^yE666nEG&e^;~ K0 zWfϟ鎈^.u$?G9hK_yi⺮H)i("}g$E4MYXXk׮Iސ`n{ZY3'qzb$ x۾s?`0٪v涛(dnnA꺮\xQͦ,--enCTvޝ`lFNG~pΝ;j=ƶd8*;=BU h^oc}cgiiWٳgA 0{տkֹ^'l-$ܜt:^sN׵ ˖tdbbaaAu]ڒn+Hu%"Os`Kݖ%t:ǏӯJ޹xm'i'fmH\וf)/JVHp+How}3?஌}okk+H$9<<ì\T0 &ޫo+I0i࡚ PeooOz0 ;d4>$cHDDfpҥKt4{-Se2͈HV8 !kkkj$|'rRՉH̃ ^zIVVVl`0 pd2odViFL;;;˧~:vR'K23qi`0eaaA^{`cc#lkA7 }:_NW^0 @>o޽{Gf~˶hm*,lllA ,oe۷7XO3Mk ZQHD,,,ȝ;w벼,_[rݬI߲e?J|ʕ+v… |嗢ICVԪo!?duuUjg??plV\=Fmi\xQ~_|]SmKxw/z,MD,//᡼h4D/Ο'ɓA+ \ו~+/E:QǶ\|Yͦx'_}|ӡ5z=vi3ϐiց///‚8#ߗ?\n߾ Q_A0emW%+ 8O?T>#¬LNN#/_gɇ~(af$T2U[=Ui4rlRτ9#_d;/V%kkkod+\i4;Ahp:ZMgΘVj5t:YҤ㒍K^(/V+K lrpْ@;՗,WZl1S&[&bf= Qt^=zjIekm>yL/lxߕmWw~Ѹ߱~RTV7CF%eN[T|p7 pgd|nuazoJlZ3_RR^uU_ٔZf̃ (}Q7@/Z<)!wqmz]0f79Là(op}/0 Ƀy6fԠPY2cZqQgW2w@8AUI[*$ v\zrj靺yj7EEZSղjF.* |͙pf'=QtBA[Y/pe80mef͟/mFXT%8z%Uh Q@ %I2]g%YPOq5Gw]-6s?za&qU1I=`+T:qZf50ub-kT75EΌuO#pyݧ@_[5+g\ l5[ 87늹6+TR:oDtT*kP4aU$ x^G0m?rnۃ,J?))s[ufy+eg`v~0v}Trq7~OۀX>}K֨6Wb;_j+zs+; m{u][m{lUl~HPDawf'gmfqrJ&+e%-=yu [ώs-l"T$$ Q(qޥ`D6SANw˛d1j6g9l+$fKj*2k&NviԹ *16)}^>Z.ڶ*/~pȪ?A,rECy+S,IJq3ogl>F Q@D$ H( Q@Di IDAT Q@D$ H( Q@D$ HJ><ߙz1Z}0ʬԟYǩ!8|5! ҹF0KgsE[xOU}>+*O@ؒ48n/Bޠ$Hd$0(I{f_$ da:,b @Q";@I@<?! IH0zg~߿~MeDGY-8_@y9Q$ w pA9 gUרW(Z+)L$$8ncbpvz% ۚYDf0fx 09Vpf>u#Mӡ|  -6(P_,1Ɨ,aoN(A]($J2"H08 ̮y]uK z iIH$GIUϧK[&ЭY$(;ݢ+0ej;ʒy;țҌ8ڔY;;NLC]:ΛϬR5y7"`3 8$Ir=/Q(RNT~uܣ:,FїLU[%Xgqtusclz20UsFZe4eg(ϭ:($I}LYF5h?N'|ҟ6K7C\EvW}`fT/z=/yI>`\y$I$-նi'?Zu]W|$ 3i.SW35N %_RqG`xD$A'0 wݨI~iG!o!o*3F jʵoQpҭeKy1 $g+:L`R(`bj+y3E2a(Id4 4[?\)VzZɫy%sOTrXzGʩ,mGO 8>鉤bYw:mu$$ZRw՞|ZaPN'YUR됭gS_+Ƙg=1H(@Jg=ICͣfU 'GelqGm3N^A>Q[ r48̴p1ˬ2WpU|)'Syg'Hpܲ2gU>k:N'DZa(iJٔf)Z-UVsٶ,{VVI^?2۩ֹ[M,l–(ɒU7l3q=ض35!8퍮J^f)[ۡɻ-hSdJoQSq3 Q.s˅فf0MA 7 C ٵ2ꠣ(0 ^mg֓9%zG>`Xߖ'J*)0g@:@6g6]/"ުݎNcc2 00qW iOk$ 8jv,qϫ[f3y$yuNEiJ}  ~}*BZd[677eyyY.]Zq⢬N'h4}{jUK/$UclUB^dqqQoI>y$oF!g6&J"i|hoizdDI?~WotO:,Sj6yKECA[ZZJƍe0qiOU1W[%VVW\׽,dَ .HE⺮Z- P(Ewm̋86"jvWHa(FCͦHrY]]V%iʵkd0H\H+ lmG#b0 #"jdnnN׳jmmHP>hhUIueiiI^z%rJ5;su|7?H˒꺮4 lnnV+\ lw_n߾-|ZIY'l/3j5YZZʾ}}]n߾-|$S6w͛7ƍ'a/K~WV2'P֖t]y7`6nxg>?\~_˭[3/D: sͨRN$뺲,/_qʕ+^~_#]Uf('?I5TPїGՇa(ZMץjevmNi#aXgѦdN[&"Ihd+Jwb_U+)ZmvX2k@Z!9b uJ-j[c~jS{ MW$fvyf.e|M^]Qi6hjr9փUf{iD:pmo8Y=շضM)Oc˻LC:lvn$E٨|,W p\5[籯DyWDQrԻ-l稗V{XMp,q$r%GR6kV TyqQcUY[fͩtާ;x.sG7zT<05/rrk˞4jI.K˻^4yQ1ȤDIicl25@ۢgPT;`e=m`8nI:*̊ڒYv$ΞB*{cE¬ &ynS$tR;j3[h/>o=oowNDtL[3ˬ!GEdI~,tۼtn2cyhӟNE"eW68>"NDvh\~(K,C;;I0:SyfM5ʅdp\j\yW FI>w**+n#Q9 tl9<ۃHZ9SFm"LdF% <'f=v9az<c߮NOU|FxO HNfy"Ay hc?MSޣPi%8)wR|cʻ瞠3N$=QŒmmeNxbJ<'c& U3VfE?0+gTYbXQ zpIGǒ$ ףụzcvZU g&xc;j+qeh`K8LJL.՟vͼ}*ڮ4kwey!n2LjfT<U3hrCOID(=,^UMNFL-jm[rYM1eE78췋&e-'lƸ cEb0H"I6TU9kCPy+C*ǨrqzmFy/ZMx'Qee$noꍳz?Mcʦ-a[WcPuߝg7L:qՙ=V*?'$u<냊jVy6D,l?_դVeɛIN4G-}Wa[m l{%5T0gSyvg{3#ַ?Ui@[+f6Wn9sbѪ[g& I`0~/auU93wKTg_<Ȫ,% (d~}H$&%&TzWPqD~/iJ+諕zdW$a/s@}Ww|ߡ(Lt40 5*{L[V:~jV{(dnnN =sU‚DQ/ea8Z-QjB% Zm(VcjA͐{}HژyC7/Jke5z/.4Miےi7 mug4M(""ea8Ng޶U;qygX(n֛ܼyS߿o X0O`μIAquܔ~cyЭ [l_+S=҃PreyeyyY4 $6HUhfq,n+VK֤hduyKٔ4MeooO04MNI}`0f9|ߗEY^^`0W\l_U^g6 jlJ$,kkkC$ e~xÇoR-}H IDATsZQzښt3de1@4gT`YXXem988Ȃ^]m$I"[[[,an2 5~g3[4Ug6͛7(o;>6ANٔyy7v~|ߗu.oSIq1wLnݺ%~ivڸe@ &8;#?+|Kysʕ7[S=0jՠ+ K5zq,^lveYF+++e_޽+wܑ>H5٢mQ/*cenإK͛UՃ뷯,..w'~C(o>rh%Q((mI8rETܹ#ܺuKݻ'O<2g4%^MojvNokkkrm}vv﷚TOԇDtjpVZt:~r} P~g}6= UYMw]W~u9<<_y睑+UǪmf\|Yy/ۓ|}@qgY @~??g{j˟ ޵`ݺlm7鿳v-nWx5"o{mAA͞Q܍FaYx3eAf9M_JSAWcue_yav΁qi={m< Cˮ=88Ǐ˓'OZ񴵯2^`Irxx(ΆJSy᱒2mlޞDQm)sǍj@G|(O>0*IiiC2ڏ&`F,*f<՞}=A4{WT}Q+2jȵԶU$A#u*}yT?{WƙrL IJUgԙ~/=J6s}},ӏf⼃eLTk̻m7+]},~Ps6[U\NYe6z`۹&5V+ f=Ki/kԷè~9en`7ᩊ=Ϧ֜V;2>7:i+2ND`/ѷ>J2TQ yzi+BjcYZAǖ8ySY JWUSnEAzT#90mv3jKQ^XTd&?&Y9IyM5F}݌3U)+-R=0ɕo0+]*M^ғ\l7m?9sn;rt涙azTr rOƸ䳌E*vhQ.=1Z̝ PLϪ_{j^]Rɨ1ͬ%z=0ߣVLlƭryUi)rVyԯ$泞tovYgFeV5,%Sԑt88m}O޳. $ H(*'$"H$ &Ɩ#8_>E`0DL7TQMH HSg-& z0.9=Dh $ H( Q@$ H( Q@D$ H( Q@D( Q@D 8bHC1G;¤1:S 33^ՂUϧzVky_rQoͬvP߿sU32ͨ=Q1լf?C|aN8rcS̬(6$L1sN:,0~6s3sr[ƛ@{çUye3<2-j1УNC{92ɻ|v 3 yyb0 8N!0nS&;Vuc.N7FW9>d Wr)v$'zɫ44,Lƨ3?rpzucnr}/q;&0c¨w(L8Oq7?1iתPvB:I*+ޓpzbpaE!{]u ̖0TWkufTʖQud!?dfhܳUG$diK17|(gdResU5at͋yF'Ҷd8)7M`gN)MSID$}%rX$u&CTuXw  =Y=ZkSS3f]p]7kKz _Mՙ"kO*nd$]DQ$Q[Fe}q Nk:0 a8T.n){Kth˕>Sespp^'fљA4I9<3y//^K.֖8#ׯ_EU)vW^yEj`0Y[[ꕾY{TtdaaAZ\ 2& y1R,..mi6*a#P,zhΒj5YZZyjl6eee%[ey㹮+FC֤h }jz+++k׮I2 :&=h[*tY H8:eܔ .H^uy饗rg(}I[]*w^ǏewwW|f.APŋ֖<~X={64gn3Ee\vM|ߗw榼벻ͤq,ZMǑ~/IdU$џƎJZդVHݖMYYYn+/^V%Ϟ=Z}P-*q6=g N pVVVҥK⺮t:wP m[M{wu|eg`$PHY%NĪoRT*Wx}ϖO',EHTl*PBĶ&bB83g % )Ylf,]q CyDQ$O<?n\d͛t(s40 N#Qo-8_S]fM:/l[9U;R}DMXu]s玌F<(NTkj׳lښܾ}-|lllAs],e-#s6+{ݮZq ،*% izw:QQ5H郺˔(jj^KٔZwj>ЩQ[o̶T3 ^{5|6quDQ$NGFtݩ2<72zb~Ϫ_֗[a(z]jZ~h@v,ˤly)@`8|6lm%:c P䭷ޒW;#,>FUaz~d[}- CY__7oƆ;WWyyGO.-eϫ&ZC%.](U>@KO1YƆ O벾.yѳ8e<KR, FQ陴ʠGDz+Q g ;㲨Tҙ__f"ϘJ*$:<<`mmM&<~wpp g(VsyⅨL& > gqȾrZ$1f)VKͦܺu+_ jt«?kۗuDOT"lʳgd8˗nd2'Oȓ'Oߓ$T>OnqO~m7Y |k֋/ٳg^][͂ zKvvv^˭[< PfR^dvgQ3IFN'ݗ.]+WHݖo6O\WTlFXL'*P[˲#W\{u*pN~&Kb$I&Gg|Tmk3osYRcjƆrmOO?V%Ap8H~_{Wכ%v[0lOU,s ڋv?_?? eYEֶiY!}0}S% o xl6UcT?=?.|ĭrՊZrJ߈ꫥ*VSO%I2gOYRQo6V:A0,|a(GKwi\ejW?e4Y u1eucV#aJF|J~MMeW-f٥i:皳ے=ַUDSPmiI-z8h4H$'pfUϩgjh4$˲oQe''M.rB_I)UM%*Q1Fca*0j7n%"S}$ z=V6([iVXPNOϓ)NT,dNLVӫryV1뾯"ħ6;ɍJOD\ADל,N"/bPlKDVu tM -k9Ϣ[B]*JQ܆bPu$ 3,z≛ULlɁ͟#WlBc+lmfb[APc2L cmY FO"2,cH;0zEDٷϮՆ̺ʮ=1 ϳԫ2f \.˼ݱhK-a.d??+Y(ںS>l 1U}VYA"TM0CoGzOTOOD8$IV&]B Jffqijܓ_@e;P3YI3r]f mk2wF}l^_¬~ӜP¶$IVmiiQI: 2Zƕ9>kgm,ғ*(* 3IX&I$ [o}$ITlwaaж9qKVEMaiqT%1u8u:iypl6e}}}%Fӑ>j5iR׭~iIٔ u]iZrҥc7٘rz1c55 Y__F6$[}7)$5a ̋e|ߟ^QX__DQԻsN>0POe,/^QW^7}ONܹswxx7}Uo\͛7rxx(P\וz>ձ¬%o緶ҥKnu]ڒ[n$I涜ylū߱hmVY/ܸqCҥK2孷ޒdb&*8< n+۲-v[n߾O1lnnʕ+Wh;vDYoG;U^O֭[W_](ۊ5ڼL,F!op{$$x'v[vvvwޑmKβL]&/_z2Qn+^O8ez' efeڜR˘nw}u;öe9Ȳlv^/C-@n[ꍢHqiZE|7S,: iA,2ir- ZDc>ێ/:QHg7ߔ]iZh4@?>YoY`u]߽Zuu7XfV)oܸ!nW}V_dY&aJѐ7xCloo͛7F&a&{-j\ݮlmmvtԻ~cd2K.Iە0 _& jؐhtl&lbY.{=hӗl4|yv{"c֙ϪmnnJݖ-yqH+3kyh4z-?c/2gNO D\޸'nW N5.z&qī}Wo<Ǔ7K=_TrsDAz_@$IQmLMڨvn8 År]?չ8#cvtW2 ѣG׬U5QPK'OF=Y]EqFѽOF~_ زw((P\"9}8 I߶_SU(3I4EݮLV%,bZ1|faYmmq(s{GÇybeꓠgM/"QЃ;sE<$a(NG677e28x,?~/ϟ?DV5Q0q_zU={&esy|_ZFE2Swg:.ov5ͨhЪL&0/>H+yIfh+Q,7uI x 4/^ȋ/ovRRn$y⅌}WO-O$g`OV/af{l;<?53iI}jF](&V8A ϟ?ϯ.ۗj0Dq:Y_d8(hߠjqyr ,~y^$IOƼ2Ec :h(u(' }uA 0{}gT/ێ[gwVjEZl;IݐYSytDkc~~eVТPlIzP&L&.YF4M[T:1k/hWlϡ_yTI4ՍIq~vҌi2-ePLj^hWR 3Ywݘ_}ߏl3D@B^w8I 0ꅭNTYoW$h$oWKŪUKrpE pKQlif>/^ K2ʸ_' ]* `jӝz1*EZEd$^_𧶁A9X\7>* RI&m;"N0=AS y`T61IC s6GU񰽼GopYQw5˶Xw̻^uQ:c=MYN0n^[XjkM's˜xUۇt*oޤho6qs'"$ FUWJ:-C$"85^g֜&߶/WM>ͺ5KD׃Y{lTEKvGM.ߜ(IXN3.f Xon7mϧ_NPP_$'=8[N37kn.JtVJe@+gYw-s\XT168t+{l{xV_ Gq>CYyY#lKIVmsV5,OT>yy˪>sn󢛪m۴bbΞ4H,C !p^mY5$ H( Q@$ H( Q@D$ H( Q@D( Q@D/"8NeHϪs]$q(cz\KQџ7˲ߥ2y$&ic+!QVm@p @@H9' QUqIP=|8@1 HbI*cMR(8D s`unflD~{γ,?DD$,Pg9]q$MS*&jqv us*0ۍY noҿ9˲J?PdV4M N$by/뺒e &fM=y2iB=&63';1{'5UXu]6$IEeǖ$ʍFIznqVy2e8LB2eeRYթcf` 4BsMOF];Ȳl@ cPvEKsb@[Yn"H|5#>Ƥ]/45#_&BmITL&988dwg.Ɣ$q|bU=QЗ V!Qu%q]*[9&/wDZZ]P' *%E+ ekp!l$)2Xao^,;~d2ljԍG9,Uife @?DZ<2}חy*anVϨgܬrO\UYvlJX%*/}5ml=A= xkZzq>3ÚÞ\׍KeMTQe }?_MϘ.C&kmYwGu Pj׽Ϡvce}A aK* eooojY0̷/KM hVn?`%aQEIDv+AHίa[ƥ~]ؐF!FY/ 3UZ˲,㸧VN˦LQǽUQ.%RYiz/ hssSvvv͛U"' Hs+΢LыD_w~~ەjf^ښlnn`+Oﻺ.QIljF#wޕ,$2w(]WWaUA6 Y[[}{}7*Qlq@De Ρ7f;9Çoe<[HvEj5m$VKˏ~jE V/~/>/)_|ű[:܆*QHT\"׮]pc./d4MZe ZMݻ}1Wu]988~/>SAyA@I:Ӆs۟j'7nܐf){/yFUZ=ARm'z _ZjwY6sY;'V%U 법*+3Z&׮]~dYFp2w܉ף[n>}Z;u}Y%Pnt_ɟIO%XDL>R;Wja(w܉4p =EdrϞ=i|7Aqiq 2䁡+vTN~ɜ(,Jy^j<k}ue`?}_Г$4N@/ĕS QN p?p'r]7J2 ja>M,Fq\p4>Tq ԯw߳Y'N\qԢx ^7p<$DjiGY0;}LY=4;$޼L`8h4hKx<7993}tధf\Wy ˲,JӴ'DAQa؏xpωH(˲H lDqD$nqw? l $I>s%:ޏx'iFxN9^icO2qga?˲Ae@,{(zKhǽ4M#u+? 󪯉0keNsi DId28jAVq'3$xE?~gşIENDB`img/console_add.png0000644000175000017500000000260712620453120015116 0ustar mquinsonmquinsonPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?-@tV 3Bdc+ +?L |) ,ۀ@0 VecouUpZS /;ÿR fX|d٬e~e`fyn@1ց秶r[|p-00cHg04gՉd_T@/1@'gaba8("'v\ 8y@~P@,Hga~ ?Ծ_&٘d3#3X˷_3a``{#f @r1-fj쬜 ~fVddFڿኌ3@R2M&ނ1~|_R*[\]TV %_X.|NJXؙI) ~32311aeSl$fC*(öCF`001{ql 2^fp?`|0  I 37- @`YAp> dd t5;$a K/3131|aZ1ffl0H(\6 RF(L,L`5 ?0>@#02] 3202`&~&:F&D<*/Ïo?Al ||# ZAAo  4h99Y3YpUf# ¯2k3*2B 56Z_Dkm[?:8VE'gf?t ut*@f%5oZ&In>Ɵ?~0(2LO/h(Fe \ ,l E/# iU=IENDB`img/lightbot_f2.png0000644000175000017500000000103212620453120015036 0ustar mquinsonmquinsonPNG  IHDR szzsRGBbKGD pHYs  tIME F) IDATX햿/A?C""J%X PI hHTPhD')]8A]2\vvWdw̼<(Fmru0]kƀq =F`p]+b hyF4ީw-e:*FnLwVYd 呑]P0d/?"ˆ}0}*Tny*T_H1([B 2w%k^*@vus̱cϛ,!`k^?^~`=,(5{kZ*ؔ&'}>rIYV*4Nwnq'ِ&L| o X@qxN0qM; vsc_cڀyR]΁# p:g###477=ݭxxwelNO<,OWW'g/>⇁Hg,|$(xy)Z.gA@ ^yRyi V,=~ls)]Sao׍K|C7g"P~}&}-K {@Pcz6F]qp``@ضp\.GKK ,^~jm3sk ٬kJ.c֭Wad2)@mmm.mӣ@AX [)I{zz+qdU(^F$j*<;wi 5ҹvz8G׬aI,F{{;Bp8L46zD"zʕ/A} &+Hx2,Řc__^tv/^͐ǚ&͛`)ic eYض|`hn+ u$ly}röeY2v֠3秂ȼtN+U!(1WVd*z~PP(DTvbƍܹs.!nߞ@33B:TF=KRٶU:$;W֧R)[IwgP1^HWb'O8NU qZb1(^a)8PN9Acwo  Y9Pv OeŘRUu`d*͢˭-cc?C't R%BݡeeD8{[!᫯pw8z`'#qrgoQk`PD;:=K~|SuC-7lɖea6DluNΞ.pwz#&)޹c F6d[EN:̟sd|b Oq"v-#!኷ӎ[68rBi@S>Hq[[8 |hK:Љ[`k 'c *N뀭--;+А!æG6EiHtgEFAyDb OR$0rlByIU\)Bd ѣxuBHPy[*uZ-’bbeĮ=nZ}J(m6#+eBoۭݽ!JIbFTTsTkO?,uAli A{ߧ63 酤e"FFjn`z qBo2/n¦ Go}IENDB`img/lang_ruby.png0000644000175000017500000000144212620453120014622 0ustar mquinsonmquinsonPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڤKTQƟsg^?ɠ(AE(DP&X p᪢?HD* (ۈ"!Z&-$S"u4tdxOgf E8yy缄RY_x7?t^ܕu=$eeo0,Df>]<2-њ4àJB*=`w{7#j82`AUC#M-,R\hsjo;mfz`WAQC|D֧4gɜ&nlxjLr1c^HvGcXZ1MR(7_ +"{gD/Gt)cEvPpӫƻ <6 OcX`MVP$)h0p־ +{T%DLLO{; -Pt(!8PV6IENDB`img/world_bat.svg0000644000175000017500000000477712620453120014646 0ustar mquinsonmquinson image/svg+xml img/lang_c.png0000644000175000017500000000046612620453120014070 0ustar mquinsonmquinsonPNG  IHDR(-StEXtSoftwareAdobe ImageReadyqe<0PLTE(P5[Pq^|¯ky桳CfUtRNS#]IDATxX3 0IENDB`img/world_arrays.png0000644000175000017500000000145512620453120015354 0ustar mquinsonmquinsonPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX]KQgV}S7J4L60""o.a_^@͊ !)ATtgf_ܗ33x# 9sVͼ( Lx}!33/Q 0Q?,"28 X sXf2 X+ v{3˂7  ϓ"jZZ:__`mRD<Iu52vRf$r ؀hx Q*U`+1,&m\9g}n/KL\J5(.\Mwjv7}S `݂"ڷ`^A8(1 o6I? k\Z9ȁ׷ɺoy/=um!xT-8W%"Gz!r{aE mɉDdf ZGSsJ;v]vE~cL&&>ab@keY$IRmH$Zׁ'R=eعsg("0u]AkMX\.Gkk+055Źs(Jchmm%NcYJJ;F??|2tO^u]z{{ꢭt:g !>Fz!4Ld2Rgx;Dd.jBڵk?>f"J7!a0::ʡC ϓN#{<W1X^:::hii!H`YVTVRe4`l>QVdhh(>qڽ{@<ϣRp7u֙8ig#,YΜ9s.ömR "J۷o/c}q( EgORgmtR epV&  =ΏY*ط[~zÐfM7ıc}uNk}[" ;1xǂ Vz<<2myT%ULb4V9Iz_O" LdXp!###ضܡ1K0>cq&>itaE0nwБQٳo e-ݍy(_0 ˲hI*mhoM淞6TGwL6hy-SmV($ڱ,+ٳga*jcLCdوDZ0cdws\+ p?Hx`E1 BLdƘj4bŴ,YMޞ% yxs8ӿ,VJQfHͺTλg- Mf!5@{śxee.-\-eDr<D)ae :@fbyIOwgT)Rh9GpA# E1bƘRBDNk,̙3\r8>vGZmP\1mNw$B`>oPȔRȂ1etN:9De122H\stLK GSxPp}BΥQ n0eEy)!"G)˲rZ!֭[G2.~~/~ʉ5,zW}# F@A*蝿 9vzl6 0%"G-[~#"?}ǢEحmL̞n>ERMOVR;v`v$j޷oߏųzt6Zj<_H\6K<3HTX'OdkRc6+WY&r\*PT8|0:L&☽c===וRZk{=* B hbL"Z܅uqE^Ye=q(>|^x!JwKؼys Hj:;;I&$KtM]1}YFFFbe:LYyD䐈tAycX~=7|3L&QѠk@I$o?dӦM"_VYls̡1<<0Zt:w8p`٦Mbk&"(f&H`t[_ʜnܸ16"NVLg;TlNJ;$%"_+ {*]䕃J#e 筺?w!IENDB`img/focus_working.png0000644000175000017500000000355412620453120015525 0ustar mquinsonmquinsonPNG  IHDR% SbKGDԂ pHYs oy vpAg% 7 .pIDATXŘ{PTǿw>x,r(5*aMc:D&&N;hZmdFU TC|dt ab0V<va]_Xr=3ss~瞽 !v_}^܈s";;{0i+BOQW٭Vjiiq@&x$y< bb<n@P64Lڪ榦Guڵ ^E5ۍHwC$I 4(2Ll>PMMk8n ԒlwۍT{jz(Pc3oZv I)^q{II2BQ$ ވh.LnY\E`C`uGG֕u6|rxN :w)"Q` x0`Ctd4v,"l])g֯WYi|@P>[~z, Kp^hoof˲8Z~/eɂRp(k ʉ٘_CuuuKZ "Dm|1Ġ0.6"3#AAA8T`W@+e>[{Žg|>ZmmEө.C, Պ:;<?rj W gZ[߸<:hϧq'[ ܵydm'rl~'b#d3'&Rss{Ћee_'2eg\DvAh]>T@z XUuЙK||>"Q@P>g$rXqx 7o&\Z*0bY*):\vt: #uZ:g"o$M$>ˏ>:Р8ct+Lr_܌ T,^%e%X}qڝ6c66rՕ%XW^iHJR̆}}@1MyHV?*_B$It`zc롲2]ϹCN9%EX5y<+xȌ0 Id2PdqFj"*SDQw(ENn^'"3҅ x$;bFhOSNg/m~iV*OUQrqC555[PÑO?=4g;kbx4Z_I4Nhi5EEFjцhښ՟Psso9=_3?~]<ֆ)= ̼2rL$7#|hP7;VW{Y7ׯ/bS?ΫJrAWTR{{&//V|p67?Nض4ϗ 20荍u.պx %tEXtdate:create2011-04-02T15:19:38+02:00K4%tEXtdate:modify2011-04-02T15:18:44+02:00tEXtSoftwarewww.inkscape.org<IENDB`img/lang_javascript.png0000644000175000017500000000132012620453120016002 0ustar mquinsonmquinsonPNG  IHDR(-SgAMA asRGB cHRMz&u0`:pQ<PLTEعÒVd4ԓvIӑWVc3`/VÓ׷Ua0`\+Y'Z(^Z(yLsF^\*bTVhZ)[*x_.UÔ}PɞX’Z|Pc2rĖhYͤoq‘[*c3{Nb1]zMyŗdqCm>],_рB_tRNSqqqȀPbKGDMh e pHYsHHFk>IDATmY`+VH!9uᢹ|Ϝyf(*F4Hl2*:.tTMjHz h'@;nY'vx2"/5! OBd v`3Xz(ccm^4qӿx"5%tEXtdate:create2013-06-15T20:10:21+02:00M0%tEXtdate:modify2012-01-13T11:40:39+01:00>IENDB`img/edit_topwall.png0000644000175000017500000000034412620453120015327 0ustar mquinsonmquinsonPNG  IHDR szzsRGBbKGD pHYs B(xtIME 0)PdIDATXұ @! ߇ؿ=2C; di }p)"')`9y/3 9#9yyk   .> ,IENDB`img/btn-debug-step.png0000644000175000017500000000335112620453120015461 0ustar mquinsonmquinsonPNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs B(x vpAg IDATX[lTUL b"DJmMh$i-lK/&hb Z0!_%@*o"jBU:s[> ?3kY^(g@UV| v6VD&#, G1ߍ "!{o0DL6fcui/ZW .aTD&1+DDIJ5s+`~XsUAD˜DF7B@UuNϛ*D`D1nW};}^2U6X@I[WvwoIh-"0*r/|.\8ӹ1"70$Ӧ|qhmAUz&2\_`}ʍ|r8a {&M.}@< Ec3i1D"ydQN<~Mu7$L?@I<:;/BV.ǿ#(yjV+QTQD׶ՇԊ{zq\ s;)+;9Lq\0?!JSUT @T ?klyj]:$;ũ(c5ПL FA'gTUaќe#"0z.V$#_ űm;c6x 1/{z.ChL_mGF) wܑv8K<NJXD |YiBBADnʂaܼ'W;%QPO,X,ʸqw!b׾O:"JJ,Q ւɅ]j8qV;!#eʔ)L}`j%J=yK,\0k??>%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-01-11T09:30:06-07:00|2%tEXtdate:modify2010-01-11T09:30:06-07:00!gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[ 2V2}5'6m 8Pa;B-Cw1e-%܉KN%2ncdstan2A#Rk"Wwy*,;F&t l_t dSI,k=ٿsJl6Jߠ}~hK 4~Aљ4;C߻{=o|ՊhQXM~XwPL\~=3f5 OheZ[b9^OL;%tePVDU}ulBfpmWQ˄TLՕ+g>[| _ӻ|쩳lg2zf(.~n,m=';;tl0 lտ9g‘&`zWWۮ.V&.fse{m z> "2 *f'IENDB`img/focus_intro.svg0000644000175000017500000003445712620453120015221 0ustar mquinsonmquinson image/svg+xml img/world_arrays.svg0000644000175000017500000003511512620453120015367 0ustar mquinsonmquinson image/svg+xml 3 2 1 8 7 14 9 4 10 11 5 6 12 18 17 16 15 13 img/btn-demo.png0000644000175000017500000000627212620453120014353 0ustar mquinsonmquinsonPNG  IHDR szzbKGDC pHYs oy vpAg IDATXõVkpT~sݳ\6&! PH0@@:*a/U-0ZkgSoնZZTZTDBpK*.$=$8NS}fyg@M 52bɒ%P(u8]` h2(XʂBfp=Ox=||'^'$W@@B Mm\ k!QtONN^F< 1J)N8~ C'MoŝGMer<V}dAhC؞A#gE;{9F=|Â=x.}ή&}t5RNMX+ /[vKSk' P@Q|̛~IFB: }`!GI'(VGC+֬@Jrq#=Pzw)FW:y5|4]2 y-ƒtI&%NQF ]OǎAy\όd3s7MM1%%%G,RTͩDҊ ? @[fZ5\6]68OQr=dq@(3z"4EbX;͋uSns؎ }+4,X+۷8ٌgϮa7-R@N te=ܭ{]1F+~cԌ!^ɔc&n#}vvFxasٕ?&%9FEx<ՊƱdľ- P3/O+]lc[sB$/k>M}koR9 -l +: ܘ [{9u&W6 3:@c8rYTt/yѹ4*06Eǿ-HF{A-Ս\0f]jΙ3i݉VX gn_x>A/hK%6PtJ$X5`,pSQF Qb#ِ;|D?NhoNzea{3QfबP@EkHgW' ǂ,GQDAcJEDfjDȟ,`'l;^_ * ʜǕլ)E`&zϽ yQ?kG~[ 0C;BK~.M_V|1ʈH?|I[rL#&&",sXv͋nɅ?bBzFyߩO h@񑪆c%*d0Q]}bqminYm&?07o*,(\$bPn7pgDPD$~xb:[>ZV/f s"2X,>O ߿,' *$0z2|`hQzөb#@ mmmGÇ/WxxP-=Y,D#Q#Ty5^^>z؇"8n jhjjFBeYVE !wɲ< ×䤂 @[HpajXJ8q"NJzӐQTHQŃn1*jX?\?%|XtJ<˄ kev;==\s@HnUhC =B(C@Ĥ$gYY]vuB8J|#FG ' rvS !.q@`ʲZ?-%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-01-11T09:30:14-07:00I%tEXtdate:modify2010-01-11T09:30:14-07:009gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[ 1 L'YIDATX V[LUG F+y M"%&%cAOcHC&~YM0BT0 AEA|`rӵ{E$̙=3{fψg}m_j3jwu9v^|ő&:$2 ٨-[fYgY,Ct#DtBG_dff*Lh|ضmSR ܹsD_^UWWK.#Gp:pjllTgΜQ6l!ud,&F1f50ʉ'$<<\}f2%!!ArsspH]]477햔핪* >}w޿Ξ= l=Z!Cb1Ʈ]!!!ޡ!uM[kk9sL.>O~d2%-gɧG%6..Wr:d nf6M `1c Saۍo@y2ks'S@!Φ&syI`:EQH> 珋Gu4@#Iݳg/d: ~{oka&b>N,<>"@Cm"3):`p ͸o4qۋ Iݺuv菷=^1#" Teqy! #$wp3 AOfkge1ix2b=3dVjP* pd섾 L9;>*XKB>|qF7^޻waOg\A?XxغN>-K.s'yo߾9@ S }^DH!v׈fMҊ !doV2z H image/svg+xml Open Clip Art Library baseball2 2010-08-03T23:23:16 Part of set of Silhouettes based on sports, in a nice vibrant colours of Ubuntu palette in Inkscape. http://openclipart.org/detail/76927/baseball2-by-shokunin shokunin Olympics baseball clip art clipart colours silhouette sports sports2010 img/busyicon/0000755000175000017500000000000012620453120013764 5ustar mquinsonmquinsonimg/busyicon/anim-22.png0000644000175000017500000000132412620453120015637 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs` GZ6 pHYs   vpAg@IDAT(υ.Caj ASH%l$} xc؊G ,,XXhrUT#f3e2?1. 2#mh]Q$S6=H4*=gM--ru޹iJZ:=yGv"QZVX$(!hwXqj>԰'@vУ;7j}83•m= u*t>+s61ƥOw%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-3.png0000644000175000017500000000130212620453120015552 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs0Pc pHYs   vpAg@IDAT(ϕ.Lʈtf!Mv!Xaaoii׭%쭺hѱf"qvs?Lȱ?ƭbjXCdl,h;}yг#½KW:΅:,I3GŞmM}:eųQwLI[~-^E"/o߁XDEC1*kuKr]V`C˽' pc:% Yu%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-16.png0000644000175000017500000000130212620453120015636 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs Ol pHYs   vpAg@IDAT(ϕ=NoW KA+<[- &66؉X+v0͛7ǂHf tuEQ)M5 um'mrF, W##D"})7?T A9 ݖ fY|ಕm]tZbk8w3{tM= ݹOb:\/G C%?%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-15.png0000644000175000017500000000130212620453120015635 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFspʩ^ pHYs   vpAg@IDAT(ϕ;NBau7(|FL-mH܂ -ll\#@ ͜sf`UU\+jj*!Lڲٗ`$hhaѓeB_,񡧇HݽOYέ[{TA;!e6g۷hlY^gKmnaNN (븵BɚIXGוa.a&%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-9.png0000644000175000017500000000127612620453120015572 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs> pHYs   vpAg@IDAT(υ=Jon~5" j$6A,|Q3%M-\k%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-4.png0000644000175000017500000000130012620453120015551 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs@r pHYs   vpAg@IDAT(ϕѽN1;I4 ll-M,|$+@{ %BOQ,ض$.\kKдH*npE6;h} N8uX۷k*S "jœYѰo@@BPS\`0΁XUEiHOE,Q3tQƕߵ`&J*%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-20.png0000644000175000017500000000131112620453120015631 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs@ @ pHYs   vpAg@IDAT(ϕнJ_kARqjq-|I|G'AKtڥC :$D]o?IM՘b==_-=@ вPVaіzQI&@aTnfP[;rktk}ȣJJ>D{#:*Tߓ~ō̕3sFE+s!riرs:CwvDQ#%4ظꒉ½a]2*Vz%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-18.png0000644000175000017500000000131112620453120015640 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs HZ pHYs   vpAg@IDAT(ϕ=Jo7Y򇩄@0" Vlӈ7glD-VBĠMBvffxޱe$4t1U g6zZ_>%xl֛ţjqbC[Ngpҝe}lbיQ=+=Eڭ(o%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-26.png0000644000175000017500000000131012620453120015636 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs 0 pHYs   vpAg@IDAT(υKKq4EXDh2hWiӧj2+"6VtA25{[^jc %y)ӁmK^L;r:"eaTݺ9I]mYˀu3Aݭ#vACCK"QQf""ҏH՟YQօXuhU(Ȫl k;W&@'R\pZ o.nƬ0`/%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-21.png0000644000175000017500000000131312620453120015634 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsP C pHYs   vpAg@IDAT(υJ←-"kSхJz=AD 7 -T%0ggOD uQoBĆ9Nsա@ *9V**(zֱ//JVutuI4 ҳ%y+35GRuF),3`<+sL&nmz6iNoPWpe۫K%eM9aGŵȍ3ޜJdl PV@q\qY<_-+b#%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-8.png0000644000175000017500000000130612620453120015563 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs褟 pHYs   vpAg@IDAT(υ;N@[ AЄA+PR!qAGES!:$(5fb]R}+ԹoPT(ǁ G}3"sKuS]c7ڞ\\#ovaYV1]\{2"9wX^x/hSGDW- Ŧ_-ovm+EO 䆚G=]^M ֍0'K .S%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-29.png0000644000175000017500000000131212620453120015643 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsP0 pHYs   vpAg@IDAT(υѻJa_7,n#V+/>N %De-6JN3̜a S03'b/ڔz=EzLSbK$2g[稩bOčS^+ׇ e  b'Z#t+/Xkn\ 5e=$rL[žӀ\}C@ 5hP]mfm(ӗ apMWŮHo,M~-.{%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-23.png0000644000175000017500000000132312620453120015637 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsp D pHYs   vpAg@IDAT(υJ߮a%LRx :u(wy:wTO3x$"AKX V\fofr?H2 mNG |YEA  ͨ*OXW𤧥cC^9 )jH$eD)S .y)2"gױձ@+v3me~/%ޡšC쫡dfJS$,9NúpAVtFE_(Y :xE('>@r/C%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-28.png0000644000175000017500000000130612620453120015645 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs@0 4Q pHYs   vpAg@IDAT(υMJ/1M%tF . ]Kxo< uB, V,֟H&R:a==ް*s"Ps`Ë*32@(԰]>=%d LMAW1X_ߕܒ4&!DOݻHÉpvtM|,rHkTboP[ƮS`fR krOFBon=ks+ ."/Z%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-31.png0000644000175000017500000000131112620453120015633 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsp0N pHYs   vpAg@IDAT(υJBaw- 5UPe MECoS!3,)k ^Ms \*:%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-14.png0000644000175000017500000000131212620453120015635 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs` pHYs   vpAg@IDAT(ύ;Jo8#> D 5*Vn@,܀p7XqQ8"33zsS-9V.b -@l۞(oY4pZjŬxFOH$HN],Rݖ؛^*sxǁ@qZмqD]E47 mxzѿf&f4ձuVmם  *^$.yvF|.k<%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-10.png0000644000175000017500000000130412620453120015632 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs D pHYs   vpAg@IDAT(ϕ1Jaojb?F1EB x< "AD!Hh Xu3o K!rBRXڵN!Ω#LԡAXח{o wP&Z}0FǞ[-XtG%I'J92hL$^g$;δF*9Q({IeuW.(@آ,%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/idle.png0000644000175000017500000000074212620453120015412 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 pHYs   vpAg@IDAT(c`%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:55:37+02:00id%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-25.png0000644000175000017500000000131012620453120015635 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs0 pHYs   vpAg@IDAT(υJP'ib(J-JKuc {\y^Ko%bXHk\?͜;s6LwCDӳϥ.b[O&z+JeF޼JƫԎBHQ[~"g=7m!6JRYz?=vݭ0s\iX [0Ză27uDr en.BaQA-Y%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-2.png0000644000175000017500000000130612620453120015555 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs ݆ pHYs   vpAg@IDAT(ϕJqIDi!"}`oS.E۞E-"pr ȈЂlZbͅ{:yl-lzlbMK{v"y,QaDeس {6lKVlᄈ1WEjX?|B,r%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-11.png0000644000175000017500000000130412620453120015633 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs02 pHYs   vpAg@IDAT(ϕ=NqHvِh"!Xx `3XYy(?"DXX77o[d[v2%20ELӵDjCYQݗw%O&*^}{Þ;=`6Fb-ЗnPp[ȶy9 mI{t#5_hQ R/&z:+ DN5?Xe$D(. X%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-13.png0000644000175000017500000000130212620453120015633 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsPfh pHYs   vpAg@IDAT(ϕ1NaVFDI4Q hl<7&X`HTDbAY ޙo&Ü/sٲ+N /m݉5מY+4 $j*O>J 2 ÙuUbx2%:\SB?R7(( f,^u&iف_܍V?tU5̈́ə}Cm%D.teBYƒUz',+˭%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-7.png0000644000175000017500000000131312620453120015560 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsp pHYs   vpAg@IDAT(ϕѱJQoMvM7jDژ*c-o`F| ID`,vW7ܙpsg ,ZX;B9+u!SDЃ{Vzv'n©']LCdir mUu"JmӽȆG&i*-KjS!w< lix)nȼm<T#)%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-30.png0000644000175000017500000000131312620453120015634 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs`0 g pHYs   vpAg@IDAT(υѽJ.`DAI!'"hBR[VVb鳈RT  E49sEaTa*nĨeG!rX$Zw`+Kwԝ>++x^jhG֦m t0$pRCf\Y(Ԗ|ŶEj4u%RGg&c0CA]+Mv L퉴 }ma%&Ku%~24'K%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-17.png0000644000175000017500000000127012620453120015643 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs Lx pHYs   vpAg@IDAT(ϕѽJ^<#@4.M4`#؈#4G xgl22ÆؖՅ*2)@(Szh9p!51W%"\SaT" UQi-<4|[k-ՍH WƃnQ]M{vKCw ;zs̳'IMȽºpaoF".r%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-27.png0000644000175000017500000000131312620453120015642 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs00 pHYs   vpAg@IDAT(υ1Nз+@U`&ZA, cXHigGa(!aW ?B/}OZb<+k}ӷz.qf/-qHÍBwPQHB9t$.+{3B"L&ƉĮ%}$&>mH*z6+BllPdžT<jx A`am 6h |s7o&3eU"^RuuiH%Y[ؖ#_z1T֗)H|\P&C"3 S(*?lk806λj}&-(Y.5AeD~qlS1 Wh9uk?y؃GMޝKzsհ)Fb )/5*iѶl=%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-1.png0000644000175000017500000000127712620453120015563 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFsU pHYs   vpAg@IDAT(ϕ=Nq @fk+1D/ 'ƚ҄(#(kɲ-nǛ0.*q]3P \4nPS"=8yn:u̺2;jjBJKcN06^䖖sA^l`KtDnQ|𮦯$gsG$j; UDab(R[,<߬T?~(]%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/busyicon/anim-12.png0000644000175000017500000000130312620453120015633 0ustar mquinsonmquinsonPNG  IHDR7gAMA abKGD#2 oFFs@ pHYs   vpAg@IDAT(ϕ=Jq`%JDFMJll<`meF<_BXlb)fccSֲNu1StH`G'@0P&vMh1rƄ7G/ uj.$hĭcA,_ "m#g)Q>ZĖ xvQ]6eسJx6tgC͑Y}\{?~%vs%tEXtcreate-date2009-11-15T23:04:35-07:00V%tEXtdate:create2013-06-15T21:54:17+02:00bB%tEXtdate:modify2013-06-15T21:53:04+02:004tEXtLicensehttp://creativecommons.org/licenses/GPL/2.0/lj%tEXtmodify-date2009-11-15T23:04:35-07:00̘tEXtSourceGNOME Icon Theme&i tEXtSource_URLhttp://art.gnome.org/2yIENDB`img/btn-alert-off.png0000644000175000017500000000226712620453120015306 0ustar mquinsonmquinsonPNG  IHDR szzbKGDC pHYsHHFk> vpAg IDATXMhTW;I2IhQXŖtM .(;5mB7-tBACh+EBi1d&ۅ & dɅ%1ٕL>2e[8{r@ $6 iJ յw [FukJV` }kun^lPJWZSnuػ݄ KxkF % w.l¤ .$]ms}}"1{Hta4$"7Xwz$k{NҼyZFMB>1we ?]]7.\%tEXtcreate-date2009-11-28T17:18:28-07:001,%tEXtdate:create2010-01-11T08:47:57-07:00J՝%tEXtdate:modify2010-01-11T08:47:57-07:00;m!5tEXtLicensehttp://creativecommons.org/licenses/LGPL/2.1/;%tEXtmodify-date2009-11-28T14:33:24-07:00ƀtEXtSourceCrystal Project'tEXtSource_URLhttp://everaldo.com/crystal/[IENDB`img/edit_leftwall.png0000644000175000017500000000035212620453120015456 0ustar mquinsonmquinsonPNG  IHDR szzsRGBbKGD pHYs B(xtIME /4^jIDATXס Cєp݃ffStG̋'.Ws>:{Zk !̶*Ukݺ4Ɛ~+-e IENDB`img/world_hanoi.svg0000644000175000017500000000713312620453120015163 0ustar mquinsonmquinson image/svg+xml img/world_cons.png0000644000175000017500000000300512620453120015006 0ustar mquinsonmquinsonPNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xIDATX{]W߾ξI"RmBRň6QF-1"B->(C-&!P+Ԁ >Fb 6hDc<&3;s򏳧 3=}ouy#(j(VfwSA"`Kp&m0k: ~D0|+hr#=A;6`\ϝ#8W/3 ph\Yds_4)0Xi&X-`{HKdYfgy3q܈aXn-N)zVQc#Q)q'KA߸OO7=̇5̬C&(Xj2$ HaJ&:7S_ S*6ۅ@=U>S=3wTD;w`[4*Vc?% &*jL7ZtUb+m:C$ӷMLAs_[s}AOb]g(^=1F믇xk@48) 'u{ ]F*1\`ې J2L2ΡUqw*&*{0;qaoۚ+70,='pĊ5tɮ*D mC =gBuC8x6wwW%G[}ʺaVc꤯jy! vpAg IDATXŗyp?{yK@ iPB @ڢVEǎOv#XtSVm k ""@彼w&օqw9sJ)c'a5VΞOTz oлW/>>h3myydž&&"[ϭlNqCO~KkG粶4COKpIX 9͹.m_VZcoL eoz!ck,ȿkpW#F@tvHS|rH=+W,E'*) ٖJeBͮVks+=^fT/˛"vn-UUNk;}tpyA{>lG96nꔭo^ׁ}ꊥkZ&P}ݸFD-FyX kΘRuf֑jafjskR 縋aTzIgR|XvtL$V^斨]e[@KWj&u,^\=j#Dܚ=!P̞ V0O6y`ʺB0JG<jVٚ0j;""c^thBNS2onQSbNm>[B,֑\K.*Bc{U*72׮\ѡfœD頸KymP'; KF.h7š F_:LE2&)i+ݙ0cD*^C}s7+-q;Ŏb(@q+@J%@H!4Lz2p*tGiO!fضbȀJ}HL:hTLir]aSZs[Ċj+2`HQ3jh:x$o7vA0>,(oD ]@bD Ma1`B9l%Qث @m)A5sQ:c;84 ]1/6snwtޖPRl]lp%!ێԬNv <|ppx #0Z<2vuG(fԺsݢPPys id৕gf߸6N Cz9aj86NEX8(~7Ŕ<T E;ek. 2 +K \N +4_D]N{ tZHWX^mc!߿R̋{[<2w Lq)h\60 CrzvO‰o22kR.܆lqNI>I}Emx#ԁnTD[lw%<{׽ nrwvՏVdrn7Q詠WXa,S) uhƪ嶭9#ju64 ڣ=Uo~G-6^@vڲu#eEB^y'%}Jy̰;[Ӫxyu/6̪ws̊uQ f5,'i-H2w?U紎h[C;;;1;H*<m0g3XL=M=x,!cwm[vꣻOk\نG%|$O[@ d/y!W,:LUmyϪkEW='O?5ٲ|O}\0` #SR, |e[%On=U;n~8upxF5?_k뀀FRA\&BXYe)g@#暛g *r\'^S&1cq SMa5pg2$~'`|;%)+2.wa1I4Ɉ]%gg:aM,nQ5OEdNP}Y.9֠XA%tEXtcreate-date2009-11-28T17:18:28-07:001,%tEXtdate:create2010-01-11T08:48:09-07:00N)%tEXtdate:modify2010-01-11T08:48:09-07:00C5tEXtLicensehttp://creativecommons.org/licenses/LGPL/2.1/;%tEXtmodify-date2009-11-28T14:33:27-07:00. tEXtSourceCrystal Project'tEXtSource_URLhttp://everaldo.com/crystal/[IENDB`img/bt-load-lesson.png0000644000175000017500000003151212620453120015464 0ustar mquinsonmquinsonPNG  IHDR22NTgAMA asRGB cHRMz&u0`:pQ<bKGD X pHYs7\7\Ǥ0IDATxwtUU9'H%JwQ(X)*bTAl(b{BzO9{߸{dg5sk_>οk_q!nc8GzbwH)P<WnKz[}=`VYqn R8_3` HCmx)(͒mAK,,,S”&GpXyu#I4V#ݭHgY~Ξ_ӪrѕWIXDkQu:UitEBg=Юhџٮ{d=F[)vGU]N0^hv/;AK:=LG 1D:ܪU]n[ұ]QѿSё;b+ ɬXo-eS̀oVnI<=~dar{?ON#|-c*v8ޔ 20Nt@;GWy_ޗq)z}5{LJT#Fq s9t-vDΠe sW"V!cuyC*|S+=S=A y+>DZ A -o*QTi/W?8B'ظcJ>juR37رr`Fz ]`8A cO^裙2;5ɷijg9Uϩcƻ`/ԧH6w f0='O N N g̙1gƜI8:qthhT,52J˪)8K.!L%_(WQ"U՗"Ip@8ԧPŐ G%^ OJ_-gTɖ6rQu!3kS#cm; PC%*z\DRJ+;'L ci(O؊f6QREJxyOUpP8-8CJ{Z7:c'܈GdY"J 0]PzwAitDgff:_{)VgYX8p@Mj -'-奥Ge|ppߖ\cq pBq'mf}6R`"rݫ8ZM5F)tiWǵZi/,mRpHwi@'|V9sߏ~9r:t!gf2@+iUN_C65ov26W 5Ptv>Ӂ79%,s^H:9/Bf9쿪l{,Z!3($0?o&ueQA0wܩ1Pi\HĀ]n`_pjnC!87= Lb0ASQCCel]?g?Z~Gybg *"w@4䓏/xxxZ3fjMȌ̌̌D!#@w]uW{z8;loF~ !OoDԎM4&_xҘ K̅iֲ[zNH3d^P4i֏X j1\=v‘jZW BBmp US~ƛQRNL=` "g<f~`,Lb}*X=]W<F5 (K4:5j@~F <_x {W]?quG#]N8|1b!*!(cꦺzZMR@"%LAmQ=`8kT()ȟQ2Ծ u3tU*5 rDP Unp @U|1z rƨÃʹ oGOz1 + KXpgY/w3i{ e\1"okAoDu R]!/~svxszp-0љ_ Շ&I?h:t蹯JOBgB~9Y *Lf M?*!fGH]Pnc@b'oV z0s{Ӏ2CbAW!Cƫ> uސ׿*rb"Jed|@J{i/i:bT3D-QK@t=Pt$D|P_j5G% r1%r6P~f"5"^W k[)Xc8Yt8d*ҸuB5:v  ^[..H~iD?P3*E0fJFoSx"-ž  (in[M- mb^ԣpg46 WU_Qێ`=8A@KBIҕd"Y$cXʡ ɒ,m@%H+f\zGexd;r_y2]V2_%PZGrۃT+4ȳ'^՗|DR7[ wdٻ9}vc7k9}oUj9}pN2Gy>vp,{"dsw U \ );͆Ij$S`ғ$SP+ P`Q PAd(Pu O-1΂w$:%{$9)eͼ f(dLЏ&ʯQTz%`"`:P<]= G';[ %u\# \շ8A-t.W!]h3 ^\1=}8FCʟE]{ Hpf%K?hs2Pw`Is"eu?4O حjbnn $7Q ?dTWY KEd-`pC,Kns6kdǫ@NÌQR%b*=C"7'ni:!X/Å}eOW{g;I\N s8J;4)} FyАj=dUp]Nϼ}[}7Wfz~XxΞB&Ѳm?L,"d#AQT/ BT Ej -Tv %: ߁8;ArBh9&@|T'YVCqcW^(qP}!tSIq Wuz(,0 k]VVC%(ffe $ O/ F@`/`BLJ8k&8273)Ŋ+J.b%9%GʋUzfF,,J8lb3S 9\G2a WW45 Vւ\VAA jM\52Z}rHfI uZZ5&@0R(%`_u %x \>)ړ3e`kwk@i/}(nA.+=(<}@PkA2~iє=9C00V}Bxr pY|cU<xJf{Mϡ1r1P/~;2Np)'dq%$_d,Ųd̐ bm,I J0 [nn҈=E>uPPY7̜(]Vzd_] ޑV+Aq}8&ʺ h_|.l@}N~PO rzZ{aCAw6t(y;i}S,~r9&8];}UH!rWxWP;FG#JeL Uz%~-jKPcdD  ò$ $\&(9 AՐj*En+y?BEg7?#pވ-BYSP04 Uك 1w*;sw-/CUm1L+*] \q#qAneso J=v}jun+>5tPo:uSb m_w~؎ Hoa綆SliK >B^%_~<,Oo7#橷ԛ Z RI 7W} j>&soާqH#8ɢऀR$dizǯϔ ,Ķ`:.,< @FUsU=2lpAkJY~57S 6_ H`< *I@(qܣ1YZЉOГ>- /݃ћl?ȏ=Z ݲ[g* wSHf-I4)PF!g. `? Du]S\{DVk퀬 \IכAiIm U%( 2 \߃X52h8 h  hI`G ]M*H2q5_x BFrMw6C@XR.+6A8]J{d^o} UoՍ@ TZDpp,J8g:)-!ITW\;lLܤrow`;(윅'> .dL ɐ 4X2|'AC# PT7ud4 ^F8DӈZ. dJIC|"RK5NH7YATK;i8.'<eN"UbPFMAT\$ AB$F@(A4e X R Zks\O[Kc9?Z\?U9eЏ$xG& wY R rN~ N=RIig0JOK(ur_S!8!C>C4k/y$d\,7AŪ,fQʗ 7e>I:ɓzbu $e#N I"H$gIC.( =MW3ʪf05n:qMDrd.mHA@S DTm,M$ pHo}Jlf̖2[~_W,%u^5i+EQX5MmN de. Q̷@E"JH(iKcn~xe4$1? ҈^]\}Y s" V4~}Af)}Lg44" Xr'6\Ĥ D,*$2rB_Po[K+i%x@2 t O2(RQ!e= }k @- D  b E {.&$qPm  )14. 4{2ְLk s@OeqI N`I~:0pSӞ#21cP )) 0 #CpN%9( #sqgJLVIPjzA NW}AOf#H IpM@ ":=4 tI<ylQt҃ -yD~@GH=?  W#tEq`z>ij>Iܓ@'/D :҉M'zSҒDSJ[Swt! bCQG^_FHM eL @ 6]΀ /ԛ dT]O?}JρXbuPx=PpRFd偊hʁމJ #кPqvT* ᯻%@cz&t32-@F9`E."=ux@' S<xPH IQBMytթz%h "hIWNrN!//pRT3L[@I2I&@Ho2NjJPd^6Kts]Vj5,.@7bI'g Y ,`,;B^Rd}ץ~\Z  ͹# M])sKҘRG $M_JAjK?J#+P^zc1\ [BNtT"9D96_VoI~mvE+z!s\q9.y;~`K7&Le*STd"S@2@dJT{.ї ; ݴ*Ђk@y=r$rҖ@m H9p +PN oJ[E{n8i -Փ=# %4tJglInzI)2;BOpC?Q䯃:[' sVmUm/ aﰷ6Mеtu] zv} ׾W6-j ֒bJkZ^=Nz5H14 $YЉ@G$mASRaҙ =LZ1rB9@M ح J{ Vih~i *ЃnV2Eb}*L. ߀@̇^˩z5;;;L_zxyyƁ\b.ae[V6H{.0].XVO gg@.z>\.\УhT$Y=M ~ @'}_iK3 HwSʹ9 ,SZKs݉f h$X!HH]i '^Q6 #%vizo[s@jOOOOd}SwjKW }@$IuppR+iBS2$g4Lw)yM6y[j%r^?y~,}@^mR7刴ԳdSvSe]B亚g 96o{񯙁7\)9!w EvSB<`ca_ռ8y/wzB<|Jŋ\|XJ/|@ك}S>=g7/gOMec|z5>{}Nu}z|>K}gWQ_/iu1DlL/~΢"r$,Ili_{wrC g%tEXtcreate-date2009-12-08T13:02:37-07:00j %tEXtdate:create2013-08-04T11:42:26+02:00 %tEXtdate:modify2010-11-14T04:40:51+01:00}gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[ K7kF0ԳjwE@tfl6eTr\f-R-mF&u$A3k$pڮz F]~lamePcP62J3ڊ4MX o J,mب}k2{n">S]RldHekIHAXE#?엗~݁岜%IDrÁh)T7[Lo|@rVۀ8JlJL#47 {#ޗ:(g,Jss[$4CiCMz-5}_J)ܿ.e?j:C;ĝ FRn޼)677eۓB pbS';b߿_>8^,Y>l6lQh/oLHbgǏR)#;|X6t"mD+.R)H$9ҼqF6N: "" V㣟;3gXJlBΝA}~}WojmnlwDѣl6.^Œ pID zΎr066ƣX,WbqqFJC^fsmF$ȈM!E*K0MS]/TtH?^/C$$ !*[kO<OR`apM-y}-s&''uPxեnK3C)988x(02kQ4qĉd2(]t5|ONL w~aLf,pi JE Jq633 "eK/3?򀁁0$q@,$Z 1;0(* 0phϿo~ϰgy>3%RE@ݯp @:iLi1fX+Æ 90yΝ~pre~`h 8  bPW wn5Cãw 10\~ oο=,l823q뻀ǩkK22ꊃ| o) W/^`88S} -@vŪ[@CJ)2û󕁋Ӂ: PW0_ gư,K ߁3`6cP!^00i`Fafc, Hpb ֆj*0y>| !O7.;v`p}b`Av+EX |[,󗍽nsaAH)E<32 pZn" b_(kyӀ /0bVob q l ?&Xb@ĶSL'_yNƟ @GM~`d&@v>&E`brfo`u /DQ"Ll Smm&@GlUe(@& ,88~٫ 4IENDB`img/edit_colors.png0000644000175000017500000000526312620453120015153 0ustar mquinsonmquinsonPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe< EIDATxb?@bb`@, \U?$R!_ B3hb`0 )130(3J11g'Ó_n}xІh0@,_f6@C8,$Ute4$89201f`fp0>Lb!~3..ji, )h!0 ~T ^濿ͰhPQ`ȳʐΐbhaǠc. ?~-U2a+uc Tc`cϠ!Xn'4=mN{!hw{/vMGm7%#aoO޸=O?3gPQbeaxZy3 @3<4`rKan3CN)Wο~JUĂ8gĉY'2~p Ér3 o0laAcO~*2MgJNq LO3xAP!4S^?v 0 r˒Osf`}tojgx. t aO gb`` o #. R`0F\>Bq 3RV/Ta`f1Ëo> & \ _vLgƗ {u9Ë[>`w308#! NG0+2yu yy!Ðb wg Ldx Ԁ R ҿLff W E`007@abff`d @,xA65^++2X0X}SAY3faeבd0&&&n+_?3; @`-7W6 g|*0}_|@ @u< ߿cx30bA@Y m!˯ f`\AN T^0e7? @??; r% [n/HSã[2H dPS` cpcC_򒓁ERA/Xh`<eD #8 F (u 4Ó=~Ҷ  /|t f&V_GX@A:o)Tp3.dx Lx zdE ^~9pd7@4/qNT,@M @SفlY`}  ) @0< l< fR RZ, _?a401𪵬3$ 0T~#>ic5X7x.P ALA,M? ̌[^pl7?k 3JЉ)f9^?{pUW1{-BZ@Ñ=z_5( @3+';'Ͽ,Ý+l_Ogͣ 1 Ypk̬ 7Au?@C$w>) N G` nn|`?m!~{ps[?3|a9z@`\tfr{}l`$TZ? _-?֏ /f u|wm^>nwÀ(*"0seQhNP,߼ps[{1|ya0]0f  0ǭ*^ sF7 +73P? οv(K`x}ͧv&68,*|eXaQA? 0\v쁷 .J`K p AXyvb`f5` Ư /_3y@CL&Rzv ~d"PF!@ ǰb7Cïy@Gle`dР_ kJxج!:CLÌV{yyAI/2gl*,Y313pÙG z: zXbo#P `e{3|~;c`_jĐ < @r@̒ V/0iI~C7}`b WdP .- L(kQNWQhYyt!o}I #P FL^к1ñxbƖ w)PI1ͫ_֮#gb pVF bj@W0BJ$0e ' Ͽ Q&HV/@;}ąYPY‡F&hiȈT42rZ`r3`xBn`- /1Z O]"= Fv̞ r3 b0??pYf-꽀Pb!`yxXeC%>1Lh/r~`'+LC PB!X/JIq:K3p&0ΙcV93<}?2w>HL`|{ 1kK35$#[h;L@Gb $By$+%*.p` ̉</2i*P'Ilfc&m 01|ֈ ˁaW@y*0Ӂ:Bf$6 <P[ 0h1@,<XUb0rL# Ï? \`'7_mon?6!˻/ ?m\ 0Q`/&[P(0Xu-`qV DAв}ǿK /S_@9Ѐ; Ğ,WX:IENDB`img/edit_linedel.png0000644000175000017500000000051112620453120015255 0ustar mquinsonmquinsonPNG  IHDRxPLTExv~s{ry}pw}zPPznu{__BBxS@tRNS3C.~IDATx^5@puMzƵ"s !*j>b t+1kM+\Kb5_1!a.|IENDB`img/BuggleQuestBETA.png0000644000175000017500000005631212620453120015531 0ustar mquinsonmquinsonPNG  IHDRJZވ* IDATxw$G}0aMV*""&6`uz 61w.Nb_q@`BHծvݳs&t{kzV_뷟=]]KU߯<ϣ aFo^04o>|W9mG,|U=Ӆ*Onhtï*J'}7v+irV7qmIs;#e4];^<^T|d?_.z*60؍] n X7tӳN|1S2gw7Ud&\l|u//Uz|-bҠs.b_`ԶCb#s e[olWB;,us[x_ŀ^Γy0qޅ7ᎃ*t}AF+*xk\91귌lA ^¿Б˜,t0-bu"S!ݿQ⊫+UNvkqr2mU8g 1p8:?L⺮21ɚm #ËZ4_JuVrAC'gʣj@r~xT9MS*d餓#t|/cmX]D/FXr\VlCzuJEqtj{8 יOcPjٝ_!y:ՏᛡSK[S%Lh: eq|:zO::Q*nx^,rG/B,GCguz{ӿL'+:zmd1UDAW/*9e "N:  z78'Z`B`gp]73 _C^0Rm:Az‰O.ɞ8t".TuzM;ʈu:ѕQg7'K7\'R%ʤOd\qxC6K'L^ųl|u§qmvLp _ʓP~wH$l0O Uj q^ lY):uu4UN4Ug[:qe*6adTYqhuȢG1;ɷYt:9dFnYP^K7}GNΦi}4[`=:H_﵈ԏa~iR L`YV̨<ꌊΕV)'NqT!H'*9T|t꞉|1]{6#K\U~ ENrwSNkڋut[_A[Td뜆KNMW#uSP~#4x>HExGP44m;h*t&Q !eoJqJv9 :%S]:*NN7:}UInTumRSZS{qy:QՋu|4Sx7s# 0[o08mc۶^Ϯz*cltn\Dc.x{9;yqU呟y: < :W'-O'KW/*Y:KԯU2M뺘|0c_{nyWBqpk?v뭹-0fwzHc3sE:iL&I&q9Os={Smyt M*YTxU|t҅̃l:\F7t"t*}w}8FR`'X1:L>Dx l5/pv!+{ ^M"9ҵcY0wyz]}zP'6 g'O38'-ϝ8Ut;)`O2=qbCuKnl|ѻE]'K7٩^^N<+8z*]uAwjCpҁ /cXoAxiӜ)>_'_ul.;`AugߓN 2Cy&rAc?Jͺj? @_5O6yT['xq|ppe;ԛG;Nk?*:UZmqGyA zꌆg3e]G&BŌ޺ЩD=E@Џ.i['JNyd=v=Xo40EECjyaGJ΋Mm^ x%Ccs5=Qf" @0]r7ngmAEs8ak"8i(=|+/?>F\P&Cs`<]O2B$9SEn\q42r6i^8q ףBh. Gݠ:}˲" Nv˲bbN8 =p s] [a4a``҄i``[e`ݳAӭU֫^NiWOMszqM[A ߈s'=8p`%;{Qyowx8_`t"͒NM "}yỷ5Q?viv[ yH:Nye*^Bo!r'44n\׍\/PWALivLVZr7y#j={fM J܄ާ L .[#F6.g@ P{2 >DMբs8}+]y7igz5$eBr`Tgi4`,OUqmNazC<0z"W(*8CS9D~CӲ,_{ed<ͭq4H0`r"_ty._&^`RAG

ـtph$e^u׬k 恙Ot/NF=W {p'<2nj@OǛzBncCkgZ?T/}-T30ɕ=z'O2;;|xygzyg$Mm;m|q].YTq㷎E2<k{NW92WBRݥ $M3lM; `LRl;Qcqޠ1<.CvNV84Sc Iˠ7eb Ƒ$W.Os {v'ōG=>qGuCgX98]c1_qH) 3\4eYLt~qZUln\T8T+}.tߛ%X>Q%_gE3ՠ%/s]L0 ad_|ߑz5Ԙ7XhÄ ٤E.ifP5ń5e*gj*4W] ˀmҟ6Yk?$Tޟx42a'{ooIy)4#;e8Dh~_w۶ G H 0[n4 ]{轲Ćq z e%,T>Tjnԛ8kkE 5Ѭ|P)M\G̕>mF[ K0U | #UI-ZT]i_SGi3U+`m[y sᲖw]:Vn1s]Հ},?O ;"p3ԝ0eYH)7 Z%8RWt *G`b01_牣%r kVpŊ4I}i@GdH~?5Bx뇒\*ú2X3쌇tZ}jVߓ47A1@s;93Ufl6=G! 4V XQsMmk*H^60‰rZ^Yz ^iU"}U%.KQTnkeiԎJ+@Ç\uhQ:ZϞe*ʿzrVwNV0+2[>3˽/._oe퐞˱|#S'apٲLW/[!4EGa0LJũ:w?9Mw3U!nےw-x6Wv+ ;xS`u/2︸%9[y?X~_@ Ś+~*n3.3B:tjI^ +011A: ?ϟ o2H+zԱ20dh*̯3Xdon1 DXηTwS{,T URݣxv鞽mK?5J ?Zӏa7`io7<5n5Z,2Yh6 }S<':EEi!ACLaewoc^\eT@ŜsI`jjR{{=TR0x '0,.]ensᒯ87qѹ:klva_`r CoGO>rBUl\&g׭W\{TǦ/1h$__v9ߨ USwi}tM)?Ƒv}1[6yPYYGty f`~͇KUrԂl 7eї6If+m9wX1 `lj2Gi_B-=!% IDAT%\k[>Coany; =9 )8^cZdٲ_b{ݶm+ PAmMAwM ._ $E Pk\j#h;/6z0isi56(dW\|j.4J~Sߐk= O` &I+rC&J|ṼvZ5+3ac#)zS&ñ'JUl'%2_v쪁D,ޯnCoBsz8(msR8s³͗EZ ȻAcܴ^X36O$;7JǪ~_jKC"e.9ZлPi𧏟QeqÚlǓIlMa捛z}',m8J.s]'8Sk=e}plB3BC3S!.\m纘#|^olAs\=pbͥ/m1Hy˚cܾهCrA/kaޞEObEkVgypLkuwӦMlܸ1Rȑ#ضM6Ų,E>\f<͒L&q]d2IRt0ն :&=WYɣ%%",88~An>7.u8@Jq9 5OOB8/Z~ޓ)z@+aZ:*JKg`s}}}bi*T*p18W<(͒rdXcL=J?6Š{L}C ]9'ln0Urss<4/>Mx.^4pm.M7] Ȟs2²L-)Md ݾ>}0,ЊhddD+uo[9M=]z `Yu=OgòPwI"VNy~OK| *|.D}Wȗ'R{̷Mxˊ>;7D4~Ln\ \s,4xL'*l; r)+alq<݆~zބ PFڄx d0H$,+4Sy, U.Ȇ*zEkRi?Zxks!uNB3Bȣli3_.#w$r_ޟ²ߎj0e&WˣXFd#ZʿysojbD9^Vap\U61諞2qef^.@[^ߪ:u@U|xc(%źfuE` ^wOM f,3Tw<\&ˆv|7I +C[(xDe-+\4MlD-l#GQpqS7uXa|{obx1o\g0cuiK#+ݲqmH+]p<}zN7 w.Bo݂h36:_=5L \|atf fNsŅZ",6^7 pĖl[9##eBy\}v$O4POqT!>< ϔԝ/*| B5` dYg*cbC|Ѧ`@IBӅFĠtw/G&aO)źGBm0ZLzќd=kL* U>9Tl퉖CfDC rsg꭛cX7P{6RW[A4pMj r~SF7e*S lj-^3 FøimCeu#SstJi}~ SZl@+n5lV>u0[f8H \9Y>8SZ&D?.Hn*EI֟l Wͳ8%;ǹry*4k!~|c~`ʮSOט.9<|ȗẇg:ޡ޹W,rI+vM1]j0Sr(MٸƒW*_f?|LQ5Ldx@IM'.|*+Wikaw(DK?%{6w.m3_vW"^?=o(uۉ2]ltMzvQ=Iy{h:VSq&B,Rix feۄ).WVUjuf [+x#oMr<eY];F[Q-NϯY块 Fh޳/l!߫&=59~AtZKY̕+|KG=/ya_. NRbl5I-NKn۞VΖ2_GSb7a0O?\ݙKnae_{0|ovW]8q4FZпUW<>]hseo܈MmC KWKѩ@[7NV5ğd_~>_ qUp\ֹG3B uriӥz7g'-s]¼VnB.D, &G6zYGV叻 ey}rn]ך'ۙ<(m[uђʠ;[2 zRUd,6oڔPҎl@ol7Nw* )<}6⵪p^L ԃv6E˲lE:sPe6dSG6Lx5zۏŊ ~Hxϋ-8 fH\Hqn @_ayxsO_{%{.WjMyg"޴LCOdIl݆5B+uN|>ctSR=4o;ɅFsӌyX+TGSma9͵eNT| #tEؑ|İSwW rHޔY nTsA 7.Wv(I&6<҅b'ljv>E|}gVG+|J5.dvEv(gY?{I?)?"{{>3yJ\ߛk/,Dp.r+%b!lb/NoNr4(۹amexAΌ.>Ư|T=ږ0M~)>X'To7?ѪWPs98S anTvtOW]v+h">58zٳІ|['yۅ}\&xo4*yq΃<לOSю[LNPu{ gxy|6 ξkmnXcUDRu k:Uвȥm,֏fed^U&m1L'T ?i\qi]_=YNxD7|yIzS&5c{̓*a]|9㱴9Xdd>me<͚}miӥOMҶ6|/E`4ɮSK(}#M?"0]f욬2Ī51ʫJi\?mؠTo?Ng}@x]>1ůLpr=S 4U'EE?CWE:q_փHoX]3naVxPwugU6$dp:6~g%kyV0ܜxS5N~[=*oX8?y([qi9XTd:}uKWf_=Ή$ӑێϯyx|'s)um5/SoX m+z"~k&HKoYxnsvF°| mb[e,v˅;ssu #)2.KIr(ڑArq VVTnYN*~^<yU3byn7T߾4/Ɔ獤\cOsr/Zuiu_GQ/w qo\7EK[g(C_ں,ˇon y: -b0mp׭c 46mFz?qV>N*~>Qt%eCoGaUNxݶ̓JnS3h][[[IT"\<_/gԯо}}.2vZCLșwZy\9#g5_GlqnM{óu~3UmΥlI.O9ODDܪH;amqp1n#mGߪfXnq4UiOhiq$_ܹC5ٸ~*?y_Mk|uw~Q|<+yjjg¯f5jeOAOHG½^u]w%`&39Hy^u#V'FX4^yzphCI^8]|Fp~[A2x݆^~QZ*΋zCZuB3&@mY=rc(ci48L@KK@G ϣ܀B5 vNV#d\i]>`ڌO`,lHrblEПa ޴߾~N.xi ˀ[7aTh۔|4c z{_GsFD䏄yLx݆^>r_5i/Aw^Y6(N^+=|yM|~?uPf"+8>_D0uty8U+2yz M\n^\cFr⾰/G9u]0}, Q3zS&lIeI#ퟨ4IxHg?V$-ޔɲlMqٲ )WN{߻ZKklj=X⥩SՆG6abXͣ) %4\S(rϞ|ہAG|Y߿mI'+<+LWܐFmNk<|@@KC.2SvH?kVf*NUy~* U|mY$Ϧ.Ka8.MG;-\+]qB婣%vNV82WTAp67iRqp[GS{k?.(0 sSq峄 szǙ d Wڗ\<Æ$kM xU*488SŽWN߿ C8(D 'a0kz y"ȴ׃'9UfbFwI,Y;`hϭ;ji=STs㑶MJf0Y.7D*NLm}GD5(qh|3I&9U6ZS:O*iOW&lY⦵9 ߑ:,]U2$L6جOzПN0k"Lb'iHmu=¾n?Oi m[ e,m=BxkFm#hiR4غ)˸LݧLՙ;m&|uYn\g?U aMl&^X|%p(7\ 9I.@Kr6YUAeī`ir0 i%,˗cc/`9a,w\1:U#A.5=!-p'PՁ|xKs]z_>5֖%WoW׊'pqu9Y>BAG*kO\-z&xeZr߻pior]H>.KEp|t+xs+S+~Cw=xM_p dq^|M)>4re7 yIDATЗ4xPN)Tm&x.ĦѹJ1ϮS5m{i_֠ e-SmfUvUYn0c4RFh"[)P.EyD>}Gka%_a>E%w'})߾~mFhWܽn dl>rh8(ɝj*|^庵9ްGk uo|cQ|yzo}t ]x|D?W.O-tۨ'N;*ۨL3{f Ը~*?y.e 3@eOs,a !yS׭m*u]gfr}kMO%غc%W`%,nELL(Wjsn\0 j*=P$|ڲ@3 .2(w@{2DX.!=axV2"bOq<$$k2iHXUL˲xt5O璜Żo[9N>}b͋RZevXH xh8>y'N$P.‹܉6[ gÃj|=Z 4DQ[7៞_^J/-^PeY|u<3%7VcZ8\oYw|%_q+˙\aKP=T|A,:0 ~V $ss/c9y.8_qHXBY_N~يoڔc7"t-$LR&z}\/@ 2e]6o\8>W=% U~~w^2&_ٻQd![Ph+uGGqۆ.dy/K2c2]rt}y 6:s'˄Ssi9F~C\AQIڦHf(cQnxW؅sC4ψg`ĺ$ݲJ I&M^2)2aPmp,ds - ] )V܇e8~~6 9.'u;1Ur)7\LïX₱t"D;0IYj!7-J/4kDiNX MlIb?BEA8iv 2w6\f=hQʆX?bIM3(T8UcT-yՀ.~]5^͠zp2LЗ21MBe k|pp%nl~ .g׾ U/F$,x͊4,Iӟ21 B\]mZp^4^K6Y7b@J,Z#\M#pʈ#H_4u E2 ZLը8v^p}LJã'E P^ŏ<y'SiL^<]x$L 2M a;/.$P&>_ŶD57Z#I޴)ma9 B;ӟ8e3:*9GxaMkVFRU韲N[ L|ep#_?<^h+V< u&כ22l㵵sˀV#e^by$ɝR{S&F4\d<ֶx%&~/1mt~0Qq}]$LldYg׹E D!ޝ F%9~ zBaf \y~gUsFAi$Mx^i眒jL&?w=35 )$(xY>ew=XKZiN[r:i,HfİptdPU]GO5#I>nu6=.i8ȸwU+;lb6 `U9m'^d_P.;gF͆na穪b8'aFBlݽ~^)1 {U7^hbɇE"eP5t)L Nxt/dO@&@"Q_tW?:c>y%;Π(՝o|a4eFu;fr=9ϣ32aK߿f=yg8-ucKɥoOG%>z ՛x?—mK16ڶ$vb u(E\u꧷u_z βh}Оq)(}:NeɟGv΢C56ā"62iėq0y-;^`ޒRh8 $eS('/o,?zoYa^k9M}y_>Yp2`F&^xBRtK%u䊅DbX0]a-㝒=ٻ%>} F֍Y5)ɅwbNXI9(2Au7ԡl>UJѬa^<E,}캷nW5@_Ul35- qPf28[`l;Mp$7<ş_/HC8>yW{mO_5|>-eP;>}ıvNޡ|Xc zO)1އw |xrLN >+5iviAxxj#v^ozUIy N1IO9dúHѪ6u/޴3Vg*~+]N7A7BV85% y2KޒSxDxrR""ܴ/j ~ŏN_>4 ?_yӂ=o|v˜Уeuޡx_/|vZ:fzk5GEYgNz Zɼ.vth:ZĦB˛~4>x,<wh!6O.(kzA)nPjq.*k}$Ot:"HkI +m71VY.ux@ }R.d^d&Eo~#YX /=Yd(8_h<\V{QBxM;9esdxK {Z]9 3Z<>uiExIN}aC~G%ehMܠ[;iAX5{7ϵ_6!/ǽz6:5 z?z{n/OKU{ruC՘>WsՖwx^xX裌_OGESQBo(η0Owiz> 1V$2#>72 ~кѮA=5ٙ?[ ",rln`瞝y탒' KAR6 *.ҜWuv,~ǥ-Čx|Nȕ#MҲ\ar-"km(Wy]FܯˣTj ‡+oI{>0-r[ˍ"W!",\GQodꋫȎ`ΊFT8MCFSjc<2_>QfHi&^ӻN#ӯTBjkrjʘA2l:3ɔ?? ::mmVN2q晒}fk"\=,i$ .a]=,,'q[f8og }/<OJ< Yɇ#^d:x%R2l:*s&xsekz*g޶&Y\= Wޔ7cuqt*R bJjU&r,\C,OtBжzGVjYƮW۰m>`H.?ކn\wn[zY_A-fcnz$3.X2Ž>Pixy fl(wAU# $_~ UcP#~U!צΡAoE.2x_ fw<+}]h5}k1zo{cL+,Gw#bf޲h܁7|#/WSnKv2ŞЩ'[]nZj}tWOKk9) ^|֍1ii-k\I{N Nr vPm̓ƺ5Tg,^!JG.Dt&./yB}uMK ?azXÏSRz$͐,8ra+QJzN'Iag$8ź5X׉x伳Ky:cn{GKyi{/~9.o27[z8.Y4 \,捴.^ȲȔ'I/y[<C n9/Ə >7&ri'd^Mj >;nd:cň70+,K>(n)`Z]C0f#p[Q5ZDێܽ[y( /Vz;(E -hYqzX 4"^4F|$y9Aoٳݴ[`tU\N Uw.;z[˳)޻ty >NRyR)lƶ9I;_? eVqf[k9f+6:Z+lLy㠘mR2G(nV؇:tׅ?z)"ؚ +" ^H-)SBVi0D7[˓C YA2d+u$wxeq;Z'7#kolC4|~w;saVj@]da߱dcx 51ߣ|KKEw5}| ޹rFNF,7k OŜ14%P]Bo'8;lt2MpaIl'L21o_^^u{mllIu |wզLh1*[|cnW~II3[%4M=|a0TS s.8bHIENDB`img/edit_coldel.png0000644000175000017500000000071112620453120015105 0ustar mquinsonmquinsonPNG  IHDRPLTEknu{pw}rrys{v~xz}}((BBPP__ff}}ttRNS3C.IDAT(A 0i^A!z\\sB&fc dѷ>IP֍zqS›,;eHjT[WѴ#Ym%E5‡p'XWrÖp XW/[‰`][E+9X_ƅp%J t?3 5qIENDB`img/world_lesson.png0000644000175000017500000001277312620453120015363 0ustar mquinsonmquinsonPNG  IHDR #ꦷbKGD X pHYsHHFk> vpAg IDAThՙwt庇- 酒@H$t4P.ArH)4APJ$G8W׽W=3kfy7 SDG[ɷo%C6mO}R;?w|Ȼں~v$;jsvh0VDZ 7x} U(RhamّpŒvAB755B'䁘,&  A vI] fb6("\ɾ}%O/^ N?;,;pÿg~yO'K_: VFxSR !!R xQ<ȔcLPU+tP\}.Mi6 lI$[vՋW/nnn;:w4? >_thogl 0<={@׵9j?L2=U/u>qP90|c%%%_ѯW@#ƀqqq1L&555Qs"""+J[be?:? nz7ۯqh: |mS 9S hI =;qvuEM]ɪA*8Ʋ2pw+; GUӲ2x\aLvpshΈ*V ,,, ^R/h'Ip: py<@Y,Wqqq-XR,)~>.=eO7LXrE-`T}$ c AQ^YBTR &/&TWY*w2W "9n|G0?;<*/i45ր;{o͛@zyP[*.G6(ɎlPʷN'珯|X\sG#Ns4l۶vpW+Y Y7fO' rhf~&gUW2t.-!qߜeeez%{=Rs P8@X$䍎v:k:c O^G8wt0V[z ?!30BEBeBwЧ/C_#oA@:T~Vy?Tjo dٷff|'zh|MTjW{튶O;]| jSuy諾ǟ=C$]?WAxz='0.addNꁁ;ANch/<@ST59}!T[`v_ 9xa[xxpsͭ!zZёk3ٸ/dl2L MHg@5rsȲ|.~|сekρHW1@#d=uWۭ݆[Iwz>)twգ`%Rh*x$K< XeޗyPq캳fq^Ջ\oUv.N^t >YJ|S]vp~W 7*r.{m'IJgNk|O)5fл˲+HR,Гy{堧jj8 pbM*°AkAy;$~>;gIq0%-u޻U0bIC!K}\>y;eu뎮CӚm3EXk}mTWж54rPc@.XeU3@wu9ҹfd3bk9?a݄u ߀5cnje}f)ƽ f7ԅpkΗiBS-Y?=poMlWv/s*eN;@'x<:vI;W?>>rȽ=ET t}" ]=V}[$)WOV-@Β>ўZY-'? N>]t9d6mۛg:0>4'<2LZ;0@!B8R xy {(9-/lj*YsSw.Xw;jFb0T`00)v ԋ TuB- û5Q5A.7{˂A_`"~0% QFl0Ƈ&mmME(0?* ʗ;-ˡ+$wi{73=vp*䐊umJpo NT."Zn &)dw[t灳So6 $k&ϿaӱY`|jlǟJ8=zh-D׍:@3 !BKo*y43oN0 M(ƩMr̞ r'2>r'`s@f/A'[bAk(w*UMMƀp\Mqm;ЊLhMGhpeDnI8l<6Ovi)o~hz8 @#{v)A kdZ*M4[M2- x}%3RUUUu 0A_ЃZ 똘w|c=;A`hN ¯z&PO{z/ԋPTyi}FT?5O.Xaoٜ!tpRCϻ^7yDNp0Xh[:7*Q]N`zO=4Mfixa_ @dkI_mkq1}PҲpڷ|Ep&~*s:+l1-#!oH^5\\qXKnjpr;Q [>[B 0Wa_77UX )73 Ty+{G_uPUz\QZOy0E`` w 1Ï`[iUZ,AnsoYH>9`%}*::*97%a49 V{u/C@_6`ܠOԻABp8=A  ÕQW@HYQ1`Z`\(eb([(ne#ŞVrL> dd_iTY q+c'@g4@*L&S.!{}6s zj.AB&8=| 8FkX_h]{fAFZs vuCiPZP?t.QXC/ teiR(LuZPSn-s>Jl v?Nze탚%6*@Ě5jϝ͹6tv} `wxW(\tolpO74ziQF>\{Q8p}3xl0p)Ctb.q6HW =+\y)oi4K w0JnCe$W 3D=MOJ% t;Tj+7::f/=qV%.U| E=퓡"S]^Z ) vrϺ(YPvE*nTZ EAk& hk+eeΣO3ߺ&aM]^S6@eO;.B5aCO(,,:V/[ }ۻ ϋ>q1 ~ 2@pQ@ppz'̵K + g8q'y6eu\i x @)C>4= 2ܿO:^@q;e#)#a0HHv #6H6l[}?6^4j>No||ul@?=-cҰt s0U-mB$QI/T7ն@9> .p@( +=x *R Z##ze 4]`|EZ]{Qra$_ԶazC˽@.v{W8-3#ů{]|ܽ?Sq$e7Y 4~ǣLk3nh*q45!Rx 6@7~ S D~iE;1.O:/M//?ז ,O=|6%z "% image/svg+xml img/world_lander.png0000644000175000017500000000073212620453120015315 0ustar mquinsonmquinsonPNG  IHDR szzsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<WIDATX=NP1H9 G+ .@P]zPD,8=ljL,ޮmM"jԽ %'3{!u@R $H\fVz1p >&5!bI?!/ 3ss`5>m6@bٙ~TMUgW3SUjKy_DK {<p<_ 0~pK`L9O5k4;\;7IENDB`img/world_hanoi.png0000644000175000017500000000075212620453120015150 0ustar mquinsonmquinsonPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<gIDATX햿NP%H kIG6$> nB>1x҂D8ܳwkInEUgtP "VmD]Pʭ+\?[<`Qt冈'F:rzdUm p[ `:$O[()w:4 @Ihz~n2Y- "U 껈lp\mz-x0`E78SG9yC>z3f@Ws DqVcJza`O,>f{/۟e[@al.˟J7Q Yay|IENDB`img/world_lesson.svg0000644000175000017500000022322612620453120015373 0ustar mquinsonmquinson image/svg+xml img/lightbot_forward.png0000644000175000017500000000347112620453120016204 0ustar mquinsonmquinsonPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@bb`@p 2g"vUC?  ; b ng``d_c`bd`yJ3hFȃd' |vl6;; úu7sWhRR O3 ZRSNNU''yҲ |)MD|7q|u`op  V2qu1SID~ucV7]PB`CQf, +/g;ü^ |l- ?$1024 P # nǙqa&Na@ۗ >^ g2qr21@FfgbfFn?f)V}~?/#l3,9a_ ~aPg(*3gkP4>X˯vc)N{&`V?L e o#ʰ__1T1x*3|5  @a7_#{t71QN7_0L='#+?,?@ ! ?̽o \,&3(j1|]9$@%;,M%~03 h_`O-o<ʠ(0y=7k0=Xc Bu(b%_c2_=Oq?` _~ ][_1<Qb'KDA6Tf6f)eJ p|'FK? E21a #( Q_LY͇ 7~cx Cf!5#r{Qf6߻ Q`: dW p(|/X1I~f`Zh@=1 r0\w? 'NFƼ?! r(yYW|JB sj6fDʻy @/l0f6P(pg` DR7f9X ,ɠ(!'$J721 pM#@_9 lfF0 M eT z@%0W0t(فs3!R3C_ ?|зoX%&$=  A>fF+- e((Ahq3010N[v`fEHˈs $؁ yQal ey ;a@L7lL {Jaeb#W30 | rPc`W~-gfEo @(d9D6-,gnS @7Ѐ; gK2IENDB`img/BuggleQuestBack.png0000644000175000017500000003326312620453120015656 0ustar mquinsonmquinsonPNG  IHDRJ/u/-sRGB IDATxyյϭ{zzvfeQpp"1A &&#i^4KP b\`@P [۳P]]q 'N|Nkkttt "J)%K;VZG8^|qўcNpX,,?! x{blٲ;7uvvFy ƍ'soPw 7)|k͛I0ɹ=DkXd#03ە`|ߞPJÚx]qxX`Ayyyؽ $HEawney3%*rS4 <]m*Vl ho v{ܫUUڸUQ߾l @Ͳg@w.\U=zСC-~Woký/frrr,(V .fYZh4QF){nfJ_>gׯ߰aCv~mަM`|-hј{WN>UKDQqt_ve%>ߵv"%ў:w+3o޼{?CJ{'{t:Y544-Rawvfaw>?֭[ooid8rKm"g.+=Zfؾ Hk>1M, |SCLSi2wzߵhە|Ԁڟ%ql7|3d:l޼<7ߓ8s͂Rbxi Ѿy CR* ݰl~ò+|hq:zQ[Pު;lcTW-lȌ!'/// 6*7y:R7P6mO'A$39c~Ok' [ZZe Bf)SU/rx/onHPQQER@]d]aAȗ^me€Œ)6o=$^۴iSdǥxqԩW7IN<6 yQ߽{vJΝ;~ͅ Ϝ9sԩwqr-rDK)p= /dpˬFt!UWԜ^~'\}_dX7\~p7`UUUAnڵ0e x;;;%I$²a}_?G <&b{2|L_Om9p%I6\ mccve,\8dc5LSt3_zu"n,IRr4Tbp6?Օ# d06矟 kXMgP[&Ps\~S4/sg@sρkuTh4OX/{V g, t)B6+L-GEX;pҐӟ\.)_8 Nw}8Ib=:^:REJA#]mȿ%w>}fHD ņ1 Ae.]ǿ+{)/ *[tZj.$Ei=qȞW#eK%DmN*/BQ$cG;h4'f?9 7!lk&9|!h|UUU:ޒnn,q;vj-dfgHlj 0}?_p„ax)B`خ6“6lnsM7l۲eK wd5CtÞyϳ glDP)* Np0T>q l6Q),B2]XX8yd;s'|>QߛC)]]]!I?P$Q[o qgpVW* ѵUW[qq2X"Sa铽 I]^q7͐.˟&Ij1ꪬL =ڠ}yR HUҸ6";Ԗ$ ZW fjjѢE\cNHP?^m`m.~زlNڲ%^mZg;=QGIvzUT =G I6'd0y?{[7Ih2|'O (;NLwuFm"f^Lf`l)#m ȠQilI3cUOD(LU[YkԖ'I‹ AIYgP+ɉZjgAj8HaVQdB Z+(@ι4G`8c6k3 WOҶ^'`$|i~i yW5EmH,U;nۺ{;j D,}Ql&Pl"K%h &t"C_o}E8+\&[290nBؼyҥKF޽{"v9c=KO7n|V 477tʛ1Z$@%K}߽;\.^SNm޼agϞv2 ٳ'r@e͛珿4n~-{ Pя~D)$),,YB) صkWv<ә CLPyS]iQ[$${ae***!6l~… I&ixN$ *o] yW_}[o 9o-{r?W[ddZkyb1+|zJ"w3 ӹeA"3MEqW!lA-u78.,,+dq2&wy {Q[l$FʛI-27n޿ujjj.cV^ ėѶ 6WK,袋OMje# ͟K=mrı7|WPp>3 b4=Ϲ钣gH%31g`>_O{ԙEAPy_;/`7nј$aǾu]wŋ3,Κ5"a_myOhy]򞞞+V矯.#Cˋ5_@IǺ[36mf.ZHm] ɟ'oZVmEM ; NH[29cUNmF}Fn୷gTg32rrdxve [f /gdo~sz|;j+DPyF.$Y۶m 6d^džZ!?ÇFm̏b8O ʛMecJRJn]m-hQ9AKEyYw}7,Z2*b?ǎ;yrjUO:uCs@4:]vtkt'|R:uԍ7nڴ ?%KO*D(c&&<ݿ ,644<3gH)NGL5Dg"Nm҆ݻw766F>&??k_Ze;xয়~15ySl?1"iE@'Kuׂ6H4xd6CIbpjK$L?OvVYbEee?4Q,N꣏> +Vyz̙?G?ڊ QMQ[^XD#It9 {3p6"Q= !aY"JI~8\1Ui!R|n"(#^`Μ9ѼYhF OpZI)7A455=z4.2 Qrr8:] Z1$Y2$ obazV\ !gE'{Nv>aKn; =XީO@Mo37xVЙ)]ǥ&1/oeCO<r0dO2~%*oƐF+/˥j#kAua۾}{KK Ny?W0#. d@yo;7~%r>ƟOEEBHa4@1LC&r0$"":ޕj$1eF灤5S5:C^md)b`L y hkmm\<&ZM:q\4!I2҂4Tl^`C&盳X,sh(={?ɑN4:2DiY`0EsdDK}XlX,LZ_r/e*++=l(l6ظq#H #|Ilod*j5gQ%?C;*OV(x# I K6y_1g9[ I sI;BK$iecqj2":"'p<[\-tԔMQoq7 D@QIdL1:"fL%!z> My/nyrHNttٳg3 F׀a5Sf:GhZjK1:Nt W>]mD~V[$RC!G`>vЙ%W"! $Oe5sC-4f *ŞVt =-tpL(פ޳bIH+ߝ'}_|9=)-XC '3#Ȍ'p=Fie '29P&";kes<$E??qFRBCz3ޣ;4\$o)QI_w-Ե{<}, 3\|8v2Eh T__kX~h]ƮFqN氽{+MYaaᗿh@ǎqo`}%GyolN80LybK`8>(HCO4F7- IyAr F/s p[` YN@ySz;&T$ _;fJqS@2 */Z<}9Ϭ\" d23EV_ 8H?J!O%vMydZl7Uo}+c(S="`=aIDATHM$`ygXمby1-iby/%*RQJyNH`]DI<FŇ,}_5()Udiby;>~bI?~gXwvl_ӄ.laFlE{Ϩ8N/g|6ޠ}-;d_;{ !p(-02&{כ}!u;.` l`'Ax7i*&Wnd8h_.. ,;. ,;. ,;. ,;@Xs XU arrr~޾ LN1_>0C\./5kE{eꪗ^zsQQ H~-AQI$,K4,ۋ/\SS3uT0a'Nڵ˿ڵkVQRvϜ9#BƍWUUUZZZL[81;aS v7K\4>hY|\'{zzVXÆ S PJNfyD'''P޴htmgrKaL+b,m~~k+imm]tјB@W'i)_nÕOetJH^l*:z"GDr:{@81XDq\eeeNN(V>Vb-+RYYym%~/?<,[ZZ%vBt:Ǐ >|\RefԩSv[ZZAT=,[:7)p֭[㎳gF 7y;::-'N3gΔ)Swr]:n{ ~zHlGimmceܺ-MC؀oƽR_wDٿſk=y]gǭXbŊvO~o߾Fy/˲.[lŋ ~hioų L9@)-ftᇵ#:uJ N`cm+vfelIuغ %%%0YAΗ04sfn7|f#<|hz?=܇~qƚX?!B[rŞ.q2p;dzgV\Ν;x 3 nw۷Xbh#iDdղ5 z+WHS4!h4ܣlPPP_zҤ!/Wt7oΑG$I^!=x&Tz9#$ccʪn +ˉg3"r1~q /`ejydRuѶ6A_1_{K'|gj?d<,SXy1jkP'H2ǎ{"\rŋ~8Șpv}K8zjKZLՏ&I~v;w>XɪQn! 3R{SU|m۶@aa5kZ"H01V3[QO?[VƘ|I <ӧOW[Y.X+㢂hѣG>>o޼o}[,)$(DJ@ #.ӟ`XBgЄ By~sffYVnin+^{Z5kCnX`UW]t_4iҵ^G$JWoslTMS׿{wϞ=cǎ;v˲wyի#l6_wuvjժc =S '>a5l1ݾo߾W`f3gˡpNqdpE= ^ഌ>h0(;wx䕁_l?HJi¼xcc #!(|>QRu:]nnnAAA FTnf|BHqqjfimG&Rk'N_Z[[X-KϼhҤIUUUҴpdaӧWVVFsR dv{aZ4yٙjq_0L6XgX+peӠ1dUBIw^m)R mhR  0VZZ$.(Dkћ)a+ĘRа*Dt&d !,_~;# 4 0>7Ғ˗ϝ;WG Fz9g~\rtÁLÏzG֭[x(ī:{O8Q>r΍,$Iݑ\ròKqMTEv9𾊾AZylA%Wynޟ='y\s`B\.{cutt׭[wM7 Un744|1PJrIiZ^yVJ瓳Yb!FNsSŘ* @Xk۷o7!' 4io9su][n(..޸q yiqOOϧ~ёo*hWK&!&n@WWh4+VKM6];wDT JZ;Oy>~oXh9tr\MkQ$(nܸ\PN!~9!#zm\ 3$A#G<y=IꃥFLApP V1P;.v5˵f͚_p1+7RW/1X kue˖}j}衇h# &+I^44=mڴ{7^J(999 .FABR"Z[8Θ1cƌQ]AUQCB!3Ah-y˖h&^ +vEc(hjr !(8zJ0ĂBĘϚ[+3qSv޽fux \r2 H꣐Ơb9_'!jmm_vUl6/^XE$-P9漣(^sbs ׮]+Bk4: hZŒLCa>`MdrK ZlT]]]]IRTT4iҤǫ-H&0M~2xP\΅,™zi5/&Vm!@l~ڲ!2&Woߑk$G7p:MpPA҂s+mDgXiB}x;љzJ޾/vyFy*5]v:"Z(<5.JAQuu5/KAb^#(.NZIy/Ŏ7JDc%$9 iR~:*Iuc.yoIK[΅{J& ڧ5FweL- *N\riY&́tWR~Ncfh6NWVVf6y988l03X=˲%%%f,i (|$?k]@)ee8FtJt$쓕Bk}J3aULOXY\R: ԩS'u\%I*((8qjj6rB09ZMEpIīNrAv{WW?E0 qSp8\.W2QXێ' uv1葤H5!ATC6j\.>/liͶ=K\8:~#Z(":1$j\~ڻo B0&w AR'4@ؐ  YJLj H,(Xν.bH"B) 4y,HfNr^Ѯ *z '>&zrɯd%LXʩ5uhs5 dTr /7jK j 4PGiIW0kjK (.H␝Ֆ"y&&Xuz讋d<;#bRJu:bjJvAHmNߋ:[<,% w^XlJBCcԋWNy<" DGD-Re q7d,1Tot#Hz0=ɪ+ҳAr"1NuC(P-7j 8% *cF$Ad,B=yp1!jz;~|v#<[(Fr0࿆ s.ںCx#$c 7@tqR)DUF]5]|% ?J9iAT$v!\@E3+% ^ki A2XN=uA%Q'KRR9Ym${u>sJ8Guu\eF$*p  VoXF]YV*0B!@5im |^75aX)r̢sAtkA`F7d,X$c  VoXz#HƂA2`F7d,X$c  VoXz#HƂA2_}TIENDB`img/focus_not.svg0000644000175000017500000006126012620453120014656 0ustar mquinsonmquinson image/svg+xml img/lightbot_jump.png0000644000175000017500000000420612620453120015510 0ustar mquinsonmquinsonPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@bb`@,J3`aWd_n & L@0db ̄ff>b!>Xnh%+,Ͱgmuvh1R r*cKY6W9._a5þL Ӷ#(tč899^:Hf2 ;ci̛eΰ2# l>>ov)M7Z$S>|V `2 DC\?ýS^oςf ;B!` (Y@L8}O%ÿF[8C}׃rP`w'Úwg,zՃԂCC oa Pq174-_* c l`ћ sV^&6Xau @aا@A†ğ MSHaai`T)D'|`$X}ǰ 0΋r`.+d;?Q94@aQO`H"0m1=r߿B@GTq(d&PN~ oƒWJKؘ:r]Ud`{AQ3ׇRR , /- \gZ & f`Jde0eqWaXyVJl~ܿ% _ @O3(kC6"Mg@s;÷?SYKgԙ10VǏ?+_ /^b_o^t!X'/#?~A5u6X` , 1B , /OK/1|xF a`~éGo0jꘅAD#xMf@aY"ǚAI]=H-^={{0jcc :vӁk3(}M`a6SaM@_p) [a`g+-tdM*)k?\?wA+G`|XGr0蘫0+)f.h*'[o1枯3|{8Ycc w ,O_ݘR ᄚ06X>|m 0cMQ8`,+a`eS e|4P?H Fe lLy"}8нc1@:*8yIENDB`img/world_bat.png0000644000175000017500000000134212620453120014614 0ustar mquinsonmquinsonPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<_IDATXŖ=hA/1Ɵ\$( ""טJ&Yk&  j!(DA!p h@x-nջ75333kXֶǬK`Vfg1D1f2HWpC$MxL?*nx+f(A~ U1*hӍ:jEpMLp.(e j}NФU0Jx+xWE5-7ApIA>c&NxJ]'p{(Xx%x g쑠 q'`CY+xh@t! `]L#xh%@L#?FO=u&ubb6 sDǪ DApSP| "bB=A1b؏wτa1nBȠ?:m6;ͤ8B?WG۰Llv 8P. 1阎tsts}w'0lveg|'m N!; 4b[_F}ZHx؜ާEb}ʰ^ -y򶤟~W0#NIENDB`img/focus_working.svg0000644000175000017500000001474512620453120015544 0ustar mquinsonmquinson image/svg+xml img/edit_buggle.png0000644000175000017500000001530312620453120015113 0ustar mquinsonmquinsonPNG  IHDR szz pHYs  HiCCPPhotoshop ICC profilexYWPK7s%GIdI"iHCEE ("" &D$ &@s_zZz{W?tu7?rDF1L=<ĉ/@UPMS@߁30( 8@@`,5 R8'^wo>^x fx~&VFY!qdsWT - @0@n𷧿w/dNG'5"#Qv Ӂ kG1`P6?|CTn̰tqǙ:?Lst+RkOU# @MpmJoAt YZ\8kW@%ãmB" A`f`gT`$@B8D-DCDę7!_Ł wοh2_DCQeFeyLS41S3tAAt041]je2"/'D'빅!-0?v+8hz2'nBGmn %}uh:4-0@2MPHax ;pȃ21X 8+xP!" ! r0R&-pn]x0 /a ` BD@D QCtCCO Ax$ك"GR$Ҁ\@ڐ[dy#3'CYQnTE7: j;4MAh ZEЇ0:΢qc$p8 1p\w׎p`2maT,KRucC86xa^oY"| ~?A x rm'!G8Ah&tD"QD4 :q,qYM q$ƤdŔTti= 3 s s2!ZvS+$NɀJ #&Α^H8Xvg2βŪjϚz9W2,K6&{ryFafȖVvm;3 { {%sfem#9)yg8pNsd,rpuqMRp)JCܡLq席øsyx4xxxxnxeyy#x^}Oτ// "130Oq pׂ``9!n!}!PE¨N^""V"t"]"sƢa3b1C1XM<&%[$%NJIHIn̔l|-Eґ *-5/-&U:UQ LL=EY9Yw-rrr)rrF1O : 'QEMP2JM Q7(*('(7*oh1scO7ym*toӚJJKU.ULv/jjT2'duK V % gͭ5okbhӚі.qӹ5нwQﳾ~r6n4478i0f(ngXe8f$aoTm4a,eh\gD$'SSE3=4Nsyy6RQKIFy+MV[[llZ7Xhۤt۲ںؖN)1ڷ[m^>ʾ:vsqDprt*sz|υr凫!חon~}cGCOAOgͫvǶOykzgy?!#iA~~gVXSͨ@ #A O 5 - Ji a[*OGG4G2EEEqEGuGF'EЕYc1 [F],#5;//~<0,a)-RgRTRobrv˔S;ԝS%RwLGogHe͘e~7iwG*G2qӾWd﮽5fe1F<V>ӓ[G9zz~p~!C ?-0*?y$ѭG~;{AFQe18xĮWKCKL˚˅˳O08W)R[VɫղE5wnNj˭u:Xs}wvC3ƙg̛Z);ۜ{ǟpӋo_ҹt++9WW[B[Z=[ln_n8A۱~3Nzܭ[}ozwwܻyzztzZj=ګ{+}Z}Wk?no<1h4xk|'n{l{dY^$XyUkE£o4i7px9I}vuj;bզXaj>2c'O?Z`,*7o;~ce1gI`~YgOWW%~ٮZ\_3hp0dOJ?p nFd=dNB lAbĺĦnu=ghV =/$a.yXjBFUvkMJsk6zkj&i m22ilrt֢rzN;d}yIgNmܪ/yݼΧ_L.P;H22CVAtҌ^422b>w$'z')%LI)IKI# WfD2-ɽ}/>,Xzrك/ ~XpHs5ǎ)y<4ʉʹ5k?X7{zmƅ&sf[.txrUEUͨI%7ouNƺ(݂w*ӾoGÜ^ޓ5=f +bX z5R,/S^{4falp|"xRurݩwA?t|țuxSgyᅦ/_/[bg/upC' wx#HXY l285,)nQ<{ykg9 i"b:qR?*Ʌ+*)o`(_ٸb[V.EQ?s!89eUF63vV>{9uG='=guiW6^uzxFyl^1[`L.5 զqЦnGDEZD F}IϏbH2fb%JHH2NƒJIN+Nߞ!1kwe=Q{Yei8z`1{"7j^C;BKݗG, m,oAȺYpvm;wq[A[O}ᏜtK/ L>x8)uss/f1xDd۴w˦O͜>5OK _M4spz #Qy!.3 % ̞$u6iKl9pp%Pyxhz&I,&-n*'GF̌6ŝJg6qhzTи9#OۜnP`Xct^,oZ]Rmcekk'nm]b)XWmFj~APŨcUA~boBBhbѰ(h$=.F.@vx/ U+I n)hJi3|vq]Gg/ީ}7 0s+0/v>)P##.G5  ׎-)n.9z<ԳL\|pŕʲ'jݾi g,4ٞoN=_rG.\lmr-g:߼s;]oi{^*{?<қ(o}EZ$<~bkCoioϤu-]^_@pP SHp4|}~ 3pH&0[G "h H89t!(Jh6OП8 \ ׍ aVXx٥uU37tM/)[ZXZ]҆hf羕acSKWmni35|3{5w:?D`M j) IME/V_Qjh[qxWΝ=C4L>q7NJέ}^*5: (6X;  4tSEґ CQTAhځqpAMGLۊcx=~AA'#YMLL7 ̎'?H7,,,oYXO")g9c)3VǬMy|* |,l-*.,)Ҩe;~KûgM_htmז;H=&/i{lgxQjhXDۤw;>XoPewꋎK>Z%rZ H*+BB܃ XGD$9EfQ.TVt GS3ⱳ^ _J%J D)bqɆiY $ITHgq`9JaMf ۓobc/T򥠔3IT`NmH5r!zw 9nk|dHjk:5cmwYod,ˏ:X0t4kQ|㉥Yܕu'j#H9wN텓"Ha3:nt6ݮ.[xPA'*G.>|話 Ʌ͘X;g/}[>⑥K./9rs{WӚZڛuu`u5@XM_eG~T_@(Hʔ0+r cHRMmsuzg0[PWIDATxJ+K8-"*W>.`K s&> $.q!hI0$Xw59'17dž3^^^ dAA+<>>Y]]'"N\.':sy޿}J\faaAlۦ\.Hښ4M(J~.T*IRq`u6iKVၛLdkk ˲hZ p~~Zk&''q]ϋp}}]QJ ,// Zh/aTU(0Mqm;:3<<ٔR(0 R+J1P,2eR,Ka$£#9;;C)ml6IRFX|'2 wP(P(D y?u/ضy?uov-/FIENDB`img/console_delete.png0000644000175000017500000000134712620453120015630 0ustar mquinsonmquinsonPNG  IHDRĴl;gAMA7tEXtSoftwareAdobe ImageReadyqe<yIDATxb?-@11   @43 X@cÏ?k9lXP#4gʁՇX 33YŹڿA[kAfm\`Ǫ@!Sb%7 nO)xp 3b~N~yQ__2a`ddd`d`o!|&fbdb ԸAG@AHPo6?0L750003@0 3C ffbf`d1H_4"A X 1b #&gg`ebDzrBe;"(@,|W@ c`L1 0U0fؑ*Pr #Ƿ >k ᄒ=صӷڿASA02 R!AìM ?{x$@ @$]a=+G 033E@1Ҫ nD3f 0҂mIENDB`img/world_lightbot.png0000644000175000017500000000413512620453120015665 0ustar mquinsonmquinsonPNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYsvv}ՂIDATXõ[]go_g9'3ɘ&3e4E4^-)^˼}/A-B b H^j 66-f&3əso-&dl}[oTUl隞0xxH ;xp jE1LBpH T3V6,~򷉯J[~a=]. @Y(ХVg< y%$">2jۛPT W}gϻEЂlm_w~|߉H[IQ=FWjeB;7Zټ6%') XCm5#|ldy'6u„P=N6Qѹ|kh,[@ֽ_nG\{k_5ޘG'rHqj{Vl3C}8ǿȻ@5o ?Ao\`o@P9ku5v "4T'89dlf*{)]ψ&틝72SS7V%zj&`DS2\T+?ް O= /-c^5O_KUHQfsC7IB>YqA(O Zw`h h;6%}Pv9R.KTh^F Osd/ Ez}_`Hg2 D!Hl'P4@z@/4F ovi8I?v% IR@TJڏTEOo~?XeVVMyP hҶj{͌Y # Y;0NuIJL@e^'2VQ8Qgg M.I **bXX*_~\ٳĪ Uo]qdaE;C,/@jՊlH-ϡ ͭa2WGNCIn2O=UQu\wGT D""uCoGb EaTsN82fa%+s&RdWf8vޜ/Vk;$wQUUQc֟ WWnų,iHo%cWE9fe.+lf5>R![RqmtK|>?vv, C빈HT]д_$gv 9^/駾# "c>O}'?yڅN/g̞}{QlQ} +qDsED),CX88NFn"93[Xq4K1??Qq5uZ'r.Zv9s湻 a~SS㣣c,JN:5}ܹw~Ya^ {Ǐ1L%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2013-06-15T21:17:35+02:00J6֗%tEXtdate:modify2013-06-15T21:16:19+02:00Q,hgtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/['!yEc ff@ k7vܢJD6K' (W>\[W~S&;^ƺVR'0ʵ@k%Eޮ>ou @Z}5z-{Yl%x-T-|Oλq}8_vI`n-Y]+sGX,Ixb>?-=zלsщǹ/?#A]>H}IENDB`img/world_cons.svg0000644000175000017500000002673112620453120015034 0ustar mquinsonmquinson image/svg+xml 1 2 3 img/world_baseball.png0000644000175000017500000000203312620453120015611 0ustar mquinsonmquinsonPNG  IHDR szzbKGD pHYs  tIME4%r6tEXtCommentCreated with GIMPWIDATXõ[lesnw7J%eK 6jiU[% c"! 1!CA%“DӄP%*5J1h6XkB)m-Kwto;>,ٲֽ;i|soF4M#M;GO H"[(3L~<f@5^= Mgs7!Ѳ Ҹw^$ϔ篫\t,(d)]cq'3*P8?7s*=RVdՌOٻ}4 ]m/_v_dT2JF%(JS5U)5edbFڲל#_жa5oBy`xǤ+/5,j{Ί"KG3͵ oRk֖Ȓ>xhmyة_Z~ק= cn_6Tw'h?ys 5B'9gRͺ4fŒ\>?o+hXhs+}nj{>PChZSN"e}Ο\_!5Ѩ^RNv9v|_w"P^@Uƺ²$+-(r2P}' @ե(DY974}?d `6T<󁸷ȞgY݇Ǔm\y(.cK$/Y *_7({>̡]m 2?wd /7?oI{PdO3e(HṔ- ..Ͼ$sL?Er럜^:m7>x%pGS| >;ر*|3U%,0\>z<`+re{=T/# SIENDB`img/focus_not.png0000644000175000017500000000123312620453120014635 0ustar mquinsonmquinsonPNG  IHDR;mGsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KTq}.̠CA}&dKBҌOD#JDPB H0 æj̻69{u$aOsnT͜>ٶv3&Ktnܤ*;XRhMUCc.rTNx7' }RTQ rCj] X2`k\eu;C7a֚@B>y 0#Fm$"nPuRDК@d4'͔Si9_EZ/$LIENDB`img/btn-debug.png0000644000175000017500000000435312620453120014513 0ustar mquinsonmquinsonPNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs B(x vpAg IDATX[Wks4Z)L!X# Jl Mkž OMĤO>jl&V m2"2e!308ù|߾a& 1q'+_kZ]Gpt[w绺N.€8!"nu[Ӽju7~~) c(~<A?yjMhֈ>!EJ)JGF1A"Jhُwq ĊEpN!,PXR(ࡉucϼϐg5 Q*%"49zADE{qut|3b,oQ Ѱ*uAG)A)3kWo>;iHWHA((Xzֶ<s8`ZpÒ6K rY Fq1aEa 8ƞ_i1:%՚$Iq_//Sipg~ihm0RJB$Y_w:" c8&Pa78$!IR"7r7FPw>wXcߴiӆ .MF"|8OjD/۫FĬY3xx˖-|Rk͚5;{xu%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-01-11T09:29:55-07:00%tEXtdate:modify2010-01-11T09:29:55-07:00_}gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[IDATc`F&Šgc@srq!EbH:ed\U5u M-m]=}5D3D#GFE'$&%|32sr !fWy$L1%tEXtdate:create2012-01-13T11:40:32+01:00|ISx%tEXtdate:modify2012-01-13T11:40:32+01:00 IENDB`img/lightbot_light.png0000644000175000017500000000405112620453120015642 0ustar mquinsonmquinsonPNG  IHDR szzbKGDC pHYsvv}Ղ vpAg IDATXõ[]go_g9'3ɘ&3e4E4^-)^˼}/A-B b H^j 66-f&3əso-&dl}[oTUl隞0xxH ;xp jE1LBpH T3V6,~򷉯J[~a=]. @Y(ХVg< y%$">2jۛPT W}gϻEЂlm_w~|߉H[IQ=FWjeB;7Zټ6%') XCm5#|ldy'6u„P=N6Qѹ|kh,[@ֽ_nG\{k_5ޘG'rHqj{Vl3C}8ǿȻ@5o ?Ao\`o@P9ku5v "4T'89dlf*{)]ψ&틝72SS7V%zj&`DS2\T+?ް O= /-c^5O_KUHQfsC7IB>YqA(O Zw`h h;6%}Pv9R.KTh^F Osd/ Ez}_`Hg2 D!Hl'P4@z@/4F ovi8I?v% IR@TJڏTEOo~?XeVVMyP hҶj{͌Y # Y;0NuIJL@e^'2VQ8Qgg M.I **bXX*_~\ٳĪ Uo]qdaE;C,/@jՊlH-ϡ ͭa2WGNCIn2O=UQu\wGT D""uCoGb EaTsN82fa%+s&RdWf8vޜ/Vk;$wQUUQc֟ WWnų,iHo%cWE9fe.+lf5>R![RqmtK|>?vv, C빈HT]д_$gv 9^/駾# "c>O}'?yڅN/g̞}{QlQ} +qDsED),CX88NFn"93[Xq4K1??Qq5uZ'r.Zv9s湻 a~SS㣣c,JN:5}ܹw~Ya^ {Ǐ1L%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-01-11T09:30:19-07:00wE%tEXtdate:modify2010-01-11T09:30:19-07:00gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[.01A|7v 9v-BhHz2Ű]<vlN$&֍đ[ZRzx'l=/땙9 Je % Gkq]/:YOx\.Fv㌁V8ۧ {f3Y"JADP)}_$lFr\@n bժ/n6[ ?7ᱱoy#;(,[̔JWA"qVNeuY_NQ ŭh%q&"wJNeE1Mi|j;LOo`Q'TANx@F;ͭY"wۗI|'JTj 7bhd쌱S@qC*$ܾJt/ol"jjͤkoo%]EC=įNZʿ^.ʄg).9T7/Z(gq7.rcsBYJE/JsW].Se3p>\GnÃv++`Eu+kq?Wf>;;qB a#v=LwշC ?#~%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-02-20T23:26:17-07:00M%tEXtdate:modify2010-01-11T09:30:03-07:00)gtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[R'vrLɣL_(*&b]c/"T"%(+~0褹ڙ;^TJP?n"P y^!FFJ)6܅/O:IgxQt! hj6oR Ʉ$곅JLn }Ҋ-y^DAJDsȁtjj1mTܥg|>hIaP:;&Yr2g6; Wy8u&rOqYfLpnӹ2@Ep6xOqCmӗf$)+X)ybCe)J\3i4TM9=2{`gqb6uan"ʓꓷ;uo?]Jc V?Ҏ7Ͽ3QMDR$_.Z|u*ԣTj&F ڝA)2T=F=A Pm 4#A & (ţu]Z<~v+:.S j!hhc"d lo8· ގ;; QBlk{J,.yύ*=*Ɏ_|z1ω ftw? 9]^%tEXtcreate-date2009-11-15T17:02:37-07:00%tEXtdate:create2010-01-11T09:30:18-07:00.|%tEXtdate:modify2010-01-11T09:30:18-07:00_MgtEXtLicensehttp://creativecommons.org/licenses/by-sa/3.0/ or http://creativecommons.org/licenses/LGPL/2.1/[ϟ? 0011[0 npP{1( ]Cp9PHHH( b"**,r耿@1P{ * ߿9%% @8L9@ Ǐ_ŏ#ĸ͛7PP<<<@q;B1oVVV +P_H E r/41 3 :1T ?0 ;hJH t PD߽{zg ڟĸ@PY0!K8aP9@@|`Q B GJG㽀⺸, |jQFAAJ1=jhPX5KD0 |r(SPCqT_jC hAQ T`A.  \M2u@a @R ,@zA1++ X8AC5#L(1B(- lQ tq(z D7AÆ$j1YCn@as@ (/D6~C B*O5L Ag0 5l%"08C3%{# @(G&Hl7` djkX4lb2[)X!0r.H*D@4'[f@Oд r"d"Рr7  ˻A?,y a=Bu *_Z]8hF2'ro 2D_͝IENDB`keystore.properties.sample0000644000175000017500000000014312620453120016616 0ustar mquinsonmquinsonkeystore.file= keystore.passwd= keystore.alias=l10n/0000755000175000017500000000000012620453120012127 5ustar mquinsonmquinsonl10n/engine/0000755000175000017500000000000012620453120013374 5ustar mquinsonmquinsonl10n/engine/it.po0000644000175000017500000027737412620453120014374 0ustar mquinsonmquinson# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-10 21:37+0100\n" "PO-Revision-Date: 2014-01-19 09:06+100\n" "Last-Translator: vinnie \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/lessons/lightbot/universe/LightBotExercise.java:56 msgid "A light is still off." msgstr "" #: src/lessons/lightbot/universe/LightBotExercise.java:58 #, java-format msgid "{0} lights (out of {1}) are still off." msgstr "" #: src/lessons/maze/island/IslandMazeEntity.java:10 #: src/lessons/maze/pledge/PledgeMazeEntity.java:10 #: src/lessons/maze/randommouse/RandomMouseMazeEntity.java:9 #: src/lessons/maze/shortestpath/ShortestPathMazeEntity.java:14 #: src/lessons/maze/wallfindfollow/WallFindFollowMazeEntity.java:12 #: src/lessons/maze/wallfollower/WallFollowerMazeEntity.java:12 #: src/lessons/recursion/lego/tree/TreeEntity.java:12 #: src/lessons/welcome/array/basics/Array1Entity.java:11 #: src/lessons/welcome/array/basics/Array2Entity.java:12 msgid "" "Sorry Dave, I cannot let you use setX(x) in this exercise. Walk to your goal " "instead." msgstr "" "Scusa Dave, non ti posso permettere l'uso di setX(x) in questo esercizio. " "Prosegui invece verso il tuo obbiettivo." #: src/lessons/maze/island/IslandMazeEntity.java:15 #: src/lessons/maze/pledge/PledgeMazeEntity.java:15 #: src/lessons/maze/randommouse/RandomMouseMazeEntity.java:14 #: src/lessons/maze/shortestpath/ShortestPathMazeEntity.java:19 #: src/lessons/maze/wallfindfollow/WallFindFollowMazeEntity.java:17 #: src/lessons/maze/wallfollower/WallFollowerMazeEntity.java:17 #: src/lessons/recursion/lego/tree/TreeEntity.java:17 #: src/lessons/welcome/array/basics/Array1Entity.java:16 #: src/lessons/welcome/array/basics/Array2Entity.java:17 msgid "" "Sorry Dave, I cannot let you use setY(y) in this exercise. Walk to your goal " "instead." msgstr "" "Scusa Dave, non ti posso permettere l'uso di setY(y) in questo esercizio. " "Prosegui invece verso il tuo obbiettivo." #: src/lessons/maze/island/IslandMazeEntity.java:20 #: src/lessons/maze/pledge/PledgeMazeEntity.java:20 #: src/lessons/maze/randommouse/RandomMouseMazeEntity.java:19 #: src/lessons/maze/shortestpath/ShortestPathMazeEntity.java:24 #: src/lessons/maze/wallfindfollow/WallFindFollowMazeEntity.java:22 #: src/lessons/maze/wallfollower/WallFollowerMazeEntity.java:22 #: src/lessons/recursion/lego/tree/TreeEntity.java:22 #: src/lessons/welcome/array/basics/Array1Entity.java:21 #: src/lessons/welcome/array/basics/Array2Entity.java:22 msgid "" "Sorry Dave, I cannot let you use setPos(x,y) in this exercise. Walk to your " "goal instead." msgstr "" "Scusa Dave, non ti posso permettere l'uso di setPos(x,y) in questo " "esercizio. Prosegui invece verso il tuo obbiettivo." #: src/lessons/recursion/hanoi/LinearHanoiEntity.java:11 #: src/lessons/recursion/hanoi/LinearTwinHanoiEntity.java:10 #, fuzzy msgid "" "Sorry Dave, I cannot let you use move disks between slots 0 and 2 directly. " "Use the intermediate slot in all moves." msgstr "" "Scusa Dave, non ti posso permettere di usare forward come argomento in " "questo esercizio. Invece utilizza un ciclo" #: src/lessons/recursion/hanoi/universe/HanoiEntity.java:55 #, java-format msgid "" "Sorry Dave, I cannot let you use move disks counterclockwise. Move from 0 to " "1, from 1 to 2 or from 2 to 0 only, not from {0} to {1}." msgstr "" #: src/lessons/recursion/hanoi/universe/HanoiMovePanel.java:68 #: src/lessons/recursion/hanoi/universe/HanoiWorldView.java:172 #: src/lessons/sort/baseball/universe/BaseballMovePanel.java:73 #, java-format msgid "move({0},{1})" msgstr "" #: src/lessons/recursion/hanoi/universe/HanoiMovePanel.java:71 #: src/lessons/recursion/hanoi/universe/HanoiWorldView.java:176 #: src/lessons/sort/baseball/universe/BaseballMovePanel.java:77 msgid "Invalid move" msgstr "Movimento non valido" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:169 #, fuzzy, java-format msgid "The disks were not moved the same amount of time: {0} vs. {1}\n" msgstr "" "Questo è molto strano: Il numero dei valori è diverso! Ci si aspettava: {0}; " "Trovato: {1}\n" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:176 #, fuzzy, java-format msgid " Disk #{0} of slot #{1} differs: {2} vs. {3}\n" msgstr "" "Il giocatore alla base {0}, in posizione {1} è differente: {2} vs {3}\n" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:181 #, fuzzy, java-format msgid " Color of disk #{0} of slot #{1} differs: {2} vs. {3}\n" msgstr "" "Il giocatore alla base {0}, in posizione {1} è differente: {2} vs {3}\n" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:202 #, fuzzy, java-format msgid "" "Cannot move from slot {0} to {1}: the only existing slots are numbered from " "0 to {2}" msgstr "" "Impossibile muoversi dallo slot {0} al {1}: gli unisci slot esistenti sono " "0, 1 e 2" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:204 #, java-format msgid "Cannot move from slot {0} to itself" msgstr "Impossibile muoversi dallo slot {0} verso se stessi" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:206 #, java-format msgid "No disc to move from slot {0}" msgstr "Nessun disco da muovere dallo slot {0}" #: src/lessons/recursion/hanoi/universe/HanoiWorld.java:211 #, java-format msgid "" "Cannot move disc from slot {0} to {1} small disk must remain over large ones " "but {2} > {3}" msgstr "" "Impossibile muovere il disco dallo slot {0} al {1} il disco piccolo deve " "rimanere sopra quelli grandi, ma non {2} > {3}" #. Create the button #: src/lessons/sort/baseball/universe/BaseballMovePanel.java:65 #: src/plm/core/ui/ChooseLessonDialog.java:192 msgid "Go" msgstr "Vai" #: src/lessons/sort/baseball/universe/BaseballMovePanel.java:76 #, java-format msgid "" "The player {0} of the base {1} cannot reach the hole that is too far from " "its position" msgstr "" "Il giocatore {0} della base {1} non può raggiungere la buca perché è troppo " "distante dalla sua posizione" #: src/lessons/sort/baseball/universe/BaseballWorld.java:146 msgid "This is not a baseball world :-(" msgstr "Questo non è un mondo di baseball :-(" #: src/lessons/sort/baseball/universe/BaseballWorld.java:150 #, java-format msgid "Differing amount of bases: {0} vs {1}" msgstr "Numero di basi differenti: {0} vs {1}" #: src/lessons/sort/baseball/universe/BaseballWorld.java:153 #, java-format msgid "Differing amount of players: {0} vs {1}" msgstr "Numero di giocatori differente: {0} vs {1}" #: src/lessons/sort/baseball/universe/BaseballWorld.java:159 #, java-format msgid "Player at base {0}, pos {1} differs: {2} vs {3}\n" msgstr "" "Il giocatore alla base {0}, in posizione {1} è differente: {2} vs {3}\n" #: src/lessons/sort/baseball/universe/BaseballWorld.java:372 #, java-format msgid "" "It''s still not sorted!! PLEASE REPORT THIS BUG, along with the following " "information:\n" "Exercise: {0}; Amount of bases: {1}; Initial situation: {2}" msgstr "" "Non è ancora sistemato!! PER PIACERE SEGNALA QUESTO BUG, insieme alle " "seguenti informazioni:\n" "Esercizio: {0}; Numero di basi: {1}; Situazione iniziale: {2} " #: src/lessons/sort/baseball/universe/BaseballWorld.java:409 #, java-format msgid "Cannot move from base {0} since it''s not between 0 and {1}" msgstr "Impossibile muoversi dalla base {0} perchè non è fra 0 e {1}" #: src/lessons/sort/baseball/universe/BaseballWorld.java:412 #, java-format msgid "Cannot move from position {0} since it''s not between 0 and {1})" msgstr "Impossibile muoversi dalla posizione {0} perchè non è fra 0 {1}) e" #: src/lessons/sort/baseball/universe/BaseballWorld.java:421 #, java-format msgid "" "The player {0} from base {1} is too far from the hole (at base {2}) to reach " "it in one move" msgstr "" "Il giocatore {0} della base {1} è troppo lontano dalla buca (alla base {2}) " "per raggiungerla in un solo movimento" #: src/lessons/sort/baseball/universe/BaseballWorldView.java:669 #: src/plm/universe/sort/SortingWorldView.java:52 msgid "Switch to time view" msgstr "Passa alla visuale del tempo" #: src/lessons/sort/baseball/universe/BaseballWorldView.java:671 #: src/plm/universe/sort/SortingWorldView.java:54 msgid "Switch to state view" msgstr "Passa alla visuale dello stato" #: src/lessons/sort/dutchflag/universe/DutchFlagEntity.java:28 msgid "Flag sorter" msgstr "Riordinatore dei Flag" #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:102 msgid "This world is not a dutch flag" msgstr "Questo mondo non è una bandiera tedesca" #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:106 #: src/lessons/sort/pancake/universe/PancakeWorld.java:120 msgid "The two worlds are of differing size" msgstr "I due mondi sono di diensioni differenti" #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:111 #, java-format msgid " Ray #{0} differs: color {1} is not color {2}\n" msgstr " Il raggio #{0} differisce: il colore {1} non è il colore {2}\n" #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:177 #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:180 #, java-format msgid "Cannot swap {0} and {1} because {2} is not between 0 and {3}" msgstr "Impossibile scambiare {0} e {1} perché {2} non si trova fra 0 e {3}" #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:197 #, java-format msgid "Cannot get the color of line #{0} because it''s not between 0 and {1}" msgstr "" "Impossibile ottenere il colore della linea #{0} perché essa non si trova fra " "0 e {1}" #: src/lessons/sort/dutchflag/universe/DutchFlagWorld.java:232 #, java-format msgid "" "It''s still not sorted!! PLEASE REPORT THIS BUG, along with the following " "information:\n" "Initial situation: {0}" msgstr "" "Non è ancora sistemato!! PER PIACERE SEGNALA QUESTO BUG, insieme alle " "seguenti informazioni:\n" "Situazione iniziale: {0} " #: src/lessons/sort/dutchflag/universe/DutchFlagWorldView.java:145 #: src/plm/universe/sort/SortingButtonPanel.java:70 #, java-format msgid "swap({0},{1})" msgstr "" #: src/lessons/sort/pancake/universe/PancakeFlipButtonPanel.java:66 #, java-format msgid "flip({0})" msgstr "" #: src/lessons/sort/pancake/universe/PancakeWorld.java:116 msgid "This is not a world of pancakes" msgstr "Questo non è un mondo di frittelle" #: src/lessons/sort/pancake/universe/PancakeWorld.java:124 #, java-format msgid "Stacks were not flipped the same amount of time: {0} vs. {1}\n" msgstr "" #: src/lessons/sort/pancake/universe/PancakeWorld.java:128 #, java-format msgid " Pancake #{0} differs: {1} vs. {2}\n" msgstr " Frittella #{0} differente: {1} vs. {2}\n" #: src/lessons/sort/pancake/universe/PancakeWorld.java:206 #, java-format msgid "Asked to flip {0} pancakes, but you must flip at least one" msgstr "Richiesta di ruotare {0} frittelle, ma devi ruotarne almeno una" #: src/lessons/sort/pancake/universe/PancakeWorld.java:208 #, java-format msgid "" "Asked to flip {0} pancakes, but there is only {1} pancakes on this stack" msgstr "" "Richiesta di ruotare {0} frittelle, ma ci sono solo {1} frittelle in questo " "stack" #: src/lessons/sort/pancake/universe/PancakeWorld.java:242 #, java-format msgid "" "Cannot get the radius of pancake #{0} because it''s not between 0 and {1}" msgstr "" "Impossibile ottenere il raggio della frittella #{0} perché non si trova fra " "0 e {1}" #: src/lessons/sort/pancake/universe/PancakeWorld.java:261 #, java-format msgid "" "Cannot get the orientation of pancake #{0} because it''s not between 0 and " "{1}" msgstr "" "Impossibile ottenere l'orientamento della frittella #{0} perché non si trova " "fra 0 e {1}" #: src/lessons/welcome/loopdowhile/Poucet1Entity.java:10 #: src/lessons/welcome/loopdowhile/Poucet2Entity.java:12 #: src/lessons/welcome/loopfor/LoopCourseEntity.java:10 #: src/lessons/welcome/loopfor/LoopCourseForestEntity.java:10 #: src/lessons/welcome/loopfor/LoopForEntity.java:8 #: src/lessons/welcome/loopfor/LoopStairsEntity.java:10 #: src/lessons/welcome/loopwhile/BaggleSeekerEntity.java:10 #: src/lessons/welcome/loopwhile/LoopWhileEntity.java:9 #: src/lessons/welcome/methods/returning/MethodsReturningEntity.java:9 #: src/lessons/welcome/summative/LakesEntity.java:10 #: src/lessons/welcome/summative/MoriaEntity.java:10 #: src/lessons/welcome/variables/RunFourEntity.java:8 #: src/lessons/welcome/variables/RunHalfEntity.java:10 #: src/lessons/welcome/variables/VariablesEntity.java:8 msgid "" "Sorry Dave, I cannot let you use forward with an argument in this exercise. " "Use a loop instead." msgstr "" "Scusa Dave, non ti posso permettere di usare forward come argomento in " "questo esercizio. Invece utilizza un ciclo" #: src/lessons/welcome/loopdowhile/Poucet1Entity.java:14 #: src/lessons/welcome/loopdowhile/Poucet2Entity.java:16 #: src/lessons/welcome/loopfor/LoopCourseEntity.java:14 #: src/lessons/welcome/loopfor/LoopCourseForestEntity.java:14 #: src/lessons/welcome/loopfor/LoopForEntity.java:13 #: src/lessons/welcome/loopfor/LoopStairsEntity.java:14 #: src/lessons/welcome/loopwhile/BaggleSeekerEntity.java:15 #: src/lessons/welcome/loopwhile/LoopWhileEntity.java:14 #: src/lessons/welcome/methods/returning/MethodsReturningEntity.java:14 #: src/lessons/welcome/summative/LakesEntity.java:15 #: src/lessons/welcome/summative/MoriaEntity.java:15 #: src/lessons/welcome/variables/RunFourEntity.java:12 #: src/lessons/welcome/variables/RunHalfEntity.java:14 #: src/lessons/welcome/variables/VariablesEntity.java:13 msgid "" "Sorry Dave, I cannot let you use backward with an argument in this exercise. " "Use a loop instead." msgstr "" "Scusa Dave, non ti posso permettere di usare backward come argomento in " "questo esercizio. Invece utilizza un ciclo" #: src/lessons/welcome/loopfor/LoopCourseEntity.java:18 #: src/lessons/welcome/loopfor/LoopCourseForestEntity.java:18 msgid "" "Sorry Dave, you cannot run backward that way. Exercising is hard enough -- " "please don't overplay." msgstr "" #: src/lessons/welcome/loopfor/LoopCourseForestEntity.java:39 msgid "You fall into water." msgstr "Sei caduto in acqua." #: src/lessons/welcome/loopfor/LoopCourseForestEntity.java:39 #: src/plm/universe/bugglequest/SimpleBuggle.java:31 #: src/plm/universe/bugglequest/SimpleBuggle.java:36 #: src/plm/universe/bugglequest/SimpleBuggle.java:47 #: src/plm/universe/bugglequest/SimpleBuggle.java:58 #: src/plm/universe/bugglequest/SimpleBuggle.java:69 #: src/plm/universe/bugglequest/SimpleBuggle.java:80 #: src/plm/universe/bugglequest/SimpleBuggle.java:96 #: src/plm/universe/bugglequest/SimpleBuggle.java:100 #: src/plm/universe/bugglequest/SimpleBuggle.java:111 #: src/plm/universe/bugglequest/SimpleBuggle.java:115 #: src/plm/universe/bugglequest/SimpleBuggle.java:125 #: src/plm/universe/bugglequest/SimpleBuggle.java:135 #: src/plm/universe/bugglequest/SimpleBuggle.java:145 msgid "Test failed" msgstr "Test fallito" #: src/lessons/welcome/methods/args/MethodsArgsEntity.java:10 msgid "" "I cannot let you use forward with an argument in this exercise. Use a loop " "instead." msgstr "" "Non ti posso permettere di usare forward come argomento in questo esercizio. " "Invece utilizza un ciclo" #: src/lessons/welcome/methods/args/MethodsArgsEntity.java:14 msgid "" "I cannot let you use backward with an argument in this exercise. Use a loop " "instead." msgstr "" "Non ti posso permettere di usare backward come argomento in questo " "esercizio. Invece utilizza un ciclo" #: src/lessons/welcome/methods/basics/MethodsDogHouseEntity.java:10 msgid "" "Sorry Dave, I cannot let you use right() in this exercise. Use left() " "instead." msgstr "" "Scusa dave, non ti posso permettere l'utilizzo di right() in questo " "esercizio. Usa left() invece." #: src/lessons/welcome/methods/basics/MethodsDogHouseEntity.java:26 #, java-format msgid "" "Sorry Dave, I cannot let you use left() both in lines {0} and {1} in this " "exercise. You can write left() only once in this exercise." msgstr "" "Scusa Dave, non ti posso permettere di usare left() in entrambe le righe {0} " "ed {1} di questo esercizio. Puoi scrivere left() una sola volta in questo " "esercizio." #: src/lessons/welcome/traversal/column/TraversalByColumnEntity.java:42 #: src/lessons/welcome/traversal/column/TraversalByColumnEntity.java:47 #: src/lessons/welcome/traversal/diagonal/TraversalDiagonalEntity.java:48 #: src/lessons/welcome/traversal/diagonal/TraversalDiagonalEntity.java:53 #: src/lessons/welcome/traversal/line/TraversalByLineEntity.java:43 #: src/lessons/welcome/traversal/line/TraversalByLineEntity.java:48 #: src/lessons/welcome/traversal/zigzag/TraversalZigZagEntity.java:48 #: src/lessons/welcome/traversal/zigzag/TraversalZigZagEntity.java:53 msgid "" "Sorry Dave, I cannot let you use forward() in this exercise. Use setPos(x,y) " "instead." msgstr "" "Scusa Dave, non ti posso permettere l'utilizzo di forward() in questo " "esercizio. Usa setPos(x,y) invece." #: src/lessons/welcome/traversal/column/TraversalByColumnEntity.java:51 #: src/lessons/welcome/traversal/column/TraversalByColumnEntity.java:55 #: src/lessons/welcome/traversal/diagonal/TraversalDiagonalEntity.java:57 #: src/lessons/welcome/traversal/diagonal/TraversalDiagonalEntity.java:61 #: src/lessons/welcome/traversal/line/TraversalByLineEntity.java:52 #: src/lessons/welcome/traversal/line/TraversalByLineEntity.java:56 #: src/lessons/welcome/traversal/zigzag/TraversalZigZagEntity.java:57 #: src/lessons/welcome/traversal/zigzag/TraversalZigZagEntity.java:61 msgid "" "Sorry Dave, I cannot let you use backward() in this exercise. Use setPos(x," "y) instead." msgstr "" "Scusa Dave, non ti posso permettere l'utilizzo di backward() in questo " "esercizio. Usa setPos(x,y) invece." #: src/plm/core/lang/JVMCompiledLang.java:53 msgid "" "Your entity failed to start. Did you forgot to put your code within a " "method?\n" "\n" "This problem often arises when the exercise expects you to put all the code " "within a \n" "method e.g. run(), but you put some statements (e.g. forward()) outside of " "any method.\n" "\n" "The easiest solution to sort it out is to copy all your code (Ctrl-A Ctrl-" "C), use the \n" "'Exercise/Revert' menu to reset the template, and paste (Ctrl-V) your code " "within the\n" "provided method." msgstr "" #: src/plm/core/lang/JVMCompiledLang.java:60 msgid "" "Your entity failed to start. Your constructor seems to be broken, but I have " "no clue." msgstr "" #: src/plm/core/lang/JVMCompiledLang.java:83 #: src/plm/core/lang/LangLightbot.java:39 #, java-format msgid "" "The execution of your program raised a {0} exception: {1}\n" " Please fix your code.\n" msgstr "" "L'esecuzione del tuo programma selleva una eccezione {0}: {1}\n" " Per piacere correggi il tuo codice.\n" #: src/plm/core/lang/LangC.java:188 src/plm/core/lang/LangJava.java:82 #: src/plm/core/lang/LangScala.java:61 msgid "Compilation error:" msgstr "Errore di compilazione:" #: src/plm/core/lang/LangC.java:260 src/plm/core/lang/LangC.java:267 msgid "Error, please recompile the exercise" msgstr "" #. #. * FIXME: provide a way to debug #. * when templates are broken #. #. for (String n:classes.keySet()) #. System.out.println("File "+n+":\n"+classes.get(n)); #: src/plm/core/lang/LangJava.java:349 msgid "Compilation failed." msgstr "Compilazione fallita." #: src/plm/core/lang/LangPython.java:49 #, fuzzy, java-format msgid "" "Syntax error: {0}\n" "Line {1}: {2}\n" "In doubt, check your indentation, and that you don't mix tabs and spaces\n" msgstr "" "Errore di sintassi alla riga {0}: {1}\n" "Nel dubbio controlla l'indentazione e di non aver mischiato spazi e " "tabulazioni\n" #: src/plm/core/lang/LangPython.java:58 #, java-format msgid "" "Indentation error: {0}\n" "line {1}: {2}\n" "Please, check that you did not mix tabs and spaces. Use the TAB and shift-" "TAB keys to clean your indentation.\n" msgstr "" #: src/plm/core/lang/LangPython.java:66 msgid "" "You interrupted the execution, did you fall into an infinite loop ?\n" "Your program must stop by itself to successfully pass the exercise.\n" msgstr "" #: src/plm/core/lang/LangPython.java:72 msgid "" "NameError raised: You seem to use a non-existent identifier; Please check " "for typos\n" msgstr "" "Eccezione NameError sollevata: Sembra che tu stia usando un identificatore " "non esistente; Per piacere controlla eventuali errori di battitura.\n" #: src/plm/core/lang/LangPython.java:76 msgid "TypeError raised: you are probably misusing a function or something.\n" msgstr "" "Eccezione TypeError sollevata: probabilmente stai utilizzando male una " "funzione o qualcosa del genere.\n" #: src/plm/core/lang/LangPython.java:80 msgid "" "UnboundLocalError raised: you are probably using a global variable that is " "not declared as such.\n" msgstr "" "Eccezione UnboundLocalError sollevata: probabilmente stai provando ad " "utilizzare una variabile globale non dichiarata come tale.\n" #: src/plm/core/lang/LangPython.java:87 msgid "Error: there is no baggle to pickup under the buggle" msgstr "Errore: non ci sono baggle da prendere sotto il buggle" #: src/plm/core/lang/LangPython.java:89 msgid "Error: a buggle cannot carry more than one baggle at the same time" msgstr "Errore: un buggle non può trasportare più di un baggle alla volta" #: src/plm/core/lang/LangPython.java:91 msgid "Error: your buggle just teleported to the outer space..." msgstr "" "Errore: il tuo buggle si è appena teletrasportato nello spazio esterno..." #: src/plm/core/lang/LangPython.java:93 msgid "Error: your buggle just hit a wall. That hurts." msgstr "Errore: il tuo buggle ha appena colpito un muro Fa male." #: src/plm/core/lang/LangPython.java:96 #, java-format msgid "" "Unknown error (please report): {0}\n" "Its value is: {1}" msgstr "" "Errore sconosciuto (per piacere segnalalo): {0}\n" "Il suo valore è: {1}" #: src/plm/core/lang/ScriptingLanguage.java:86 #, java-format msgid "" "No ScriptEngine for {0}. Please check your classpath and similar settings." msgstr "" "Nessuno ScriptEngine per {0}. Per piacere controlla il tuo classpath ed " "impostazioni simili." #: src/plm/core/lang/ScriptingLanguage.java:95 #, fuzzy, java-format msgid "" "No {0} script source for entity {1}. Please report that bug against the PLM." msgstr "" "Nessuno script sorgente {0} per l'entità {1}. Per piacere segnala questo bug " "a PLM." #: src/plm/core/lang/ScriptingLanguage.java:107 #, fuzzy, java-format msgid "Received a ScriptException that does not come from the {0} language.\n" msgstr "Ricevuto uno ScriptException che non proviene da Python.\n" #: src/plm/core/lang/ScriptingLanguage.java:112 #, fuzzy, java-format msgid "" "Script evaluation raised an exception that is not a ScriptException but a " "{0}.\n" " Please report this as a bug against the PLM, with all details allowing to " "reproduce it.\n" "Exception message: {1}\n" msgstr "" "La valutazione dello script ha sollevato un eccezione che non una " "ScriptException ma una {0}.\n" " Per piacere segnala questo bug a PLM con tutti i dettagli che permettono di " "riprodurlo.\n" "Messaggio di eccezione: {1}\n" #: src/plm/core/model/Game.java:170 msgid "Scala is usable on your machine. Congratulations." msgstr "Scala è utilizzabile sul tuo pc. Congratulazioni." #: src/plm/core/model/Game.java:172 #, fuzzy msgid "Please install Scala version 2.11 or higher to use it in the PLM." msgstr "Per piacere istalla Scala versione 2.10 o maggiore per usarlo in PLM." #: src/plm/core/model/Game.java:174 msgid "Jython is usable on your machine. Congratulations." msgstr "Jython è utilizzabile sul tuo pc. Congratulazioni." #: src/plm/core/model/Game.java:176 #, fuzzy msgid "" "Please install jython to use the python programming language in the PLM." msgstr "" "Per piacere installa jython per usare il linguaggio di programmazione python " "in PLM." #: src/plm/core/model/Game.java:178 #, fuzzy msgid "C is usable on your machine. Congratulations." msgstr "Scala è utilizzabile sul tuo pc. Congratulazioni." #: src/plm/core/model/Game.java:180 #, fuzzy msgid "Please install gcc to use the C programming language in the PLM." msgstr "" "Per piacere installa jython per usare il linguaggio di programmazione python " "in PLM." #: src/plm/core/model/Game.java:187 #, fuzzy, java-format msgid "" "Warning, the default programming language is neither ''Java'' nor ''python'' " "or ''Scala'' or ''C'' but {0}.\n" " This language will be used to setup the worlds, possibly leading to " "severe issues for the exercises that don''t expect it.\n" " It is safer to change the current language, and restart the PLM before " "proceeding.\n" " Alternatively, the property {1} can be changed in your configuration file " "({2}/plm.properties)" msgstr "" "Attenzione, il linguaggio di programmazione predefinito non è né ''Java'', " "né ''python'' e nemmeno ''Scala'' ma {0}.\n" " Questo linguaggio viene utilizzato per impostare i mondi, potrebbero " "sorgere gravi problemi per gli eserciziche non se l'aspettano.\n" " Prima di procedere è più sicuro cambiare il linguaggio corrente e " "riavviare PLM.\n" " In alternativa, la proprietà {1} può essere cambiata nel tuo file di " "configurazione ($HOME/.plm/plm.properties)" #: src/plm/core/model/Game.java:193 msgid "" "The default programming language is Scala, but your scala installation is " "not usable. Switching to Java instead.\n" msgstr "" "Il linguaggio di programmazione predefinito è Scala ma la tua installazione " "di scala non è utilizzabile. Seleziona Java invece.\n" #: src/plm/core/model/Game.java:196 msgid "" "The default programming language is python, but your python installation is " "not usable. Switching to Java instead.\n" msgstr "" "Il linguaggio di programmazione predefinito è python ma la tua installazione " "di python non è utilizzabile. Seleziona Java invece.\n" #: src/plm/core/model/Game.java:199 #, fuzzy msgid "" "The default programming language is C, but your C installation is not " "usable. Switching to Java instead.\n" msgstr "" "Il linguaggio di programmazione predefinito è Scala ma la tua installazione " "di scala non è utilizzabile. Seleziona Java invece.\n" #: src/plm/core/model/Game.java:218 msgid "" "You found a bug in the PLM. Please report it with all possible details " "(including the stacktrace below" msgstr "" #: src/plm/core/model/Game.java:252 #, java-format msgid "Error {0} while retrieving the Scala version: {1}" msgstr "Errore {0} durante il tentativo di conoscere la versione di Scala: {1}" #: src/plm/core/model/Game.java:261 #, java-format msgid "Scala is too ancient. Found {0} while I need 2.10 or higher." msgstr "" "Scala è troppo vecchio. È stato trovata la versione {0} mentre occorre la " "2.10 o maggiore." #: src/plm/core/model/Game.java:286 msgid "" "Cannot retrieve the python ScriptEngine. Are jython.jar and its dependencies " "in the classpath?" msgstr "" "Impossibile ottenere lo ScriptEngine di python. jython.jar e le sue " "dipendenze si trovano nel classpath?" #: src/plm/core/model/Game.java:325 #, java-format msgid "" "Resource {0} not found in the classpath.\n" "Is {1} in your classpath?" msgstr "" "La risorsa {0} non è stata trovata nel classpath.\n" "{1} è il tuo classpath?" #: src/plm/core/model/Game.java:327 #, java-format msgid "{0} received while searching for resource {1}: {2}" msgstr "Ricevuto {0} durante la ricerca della risorsa {1}: {2}:" #: src/plm/core/model/Game.java:362 src/plm/core/model/Game.java:363 #, java-format msgid "Cannot switch to lesson {0}: class Main not found." msgstr "" "Impossibile passare alla lezione {0}: la classe Main non è stata trovata." #: src/plm/core/model/Game.java:364 #, java-format msgid "Load lesson {0}" msgstr "Caricamento lezione {0}" #: src/plm/core/model/Game.java:380 #, java-format msgid "" "The lesson {0} encountered an issue while loading its exercises, please " "report the issue and choose another lesson." msgstr "" #: src/plm/core/model/Game.java:381 #, fuzzy msgid "Broken lesson" msgstr "Carica lezione" #: src/plm/core/model/Game.java:513 #, java-format msgid "" "Exercise {0} does not support language {1}. Fallback to {2} instead. Please " "consider contributing to this project by adapting this exercise to this " "language." msgstr "" "L'esercizio {0} non supporta il linguaggio {1}. Ritornati in {2} invece. Per " "piacere considera di contribuire a questo progetto adattando questo " "esercizio a questo linguaggio." #: src/plm/core/model/Game.java:521 msgid "Operation cancelled by the user" msgstr "Operazione annullata dall'utente" #: src/plm/core/model/Game.java:563 #, java-format msgid "The lecture {0} has no world that I can select" msgstr "La lettura {0} non ha parole che io posso selezionare" #: src/plm/core/model/Game.java:991 #, fuzzy msgid "" "Please install Scala version 2.10 or higher to use it in the PLM.\n" "\n" msgstr "" "Per piacere istalla Scala versione 2.10 o maggiore per usarlo in PLM.\n" "\n" #: src/plm/core/model/Game.java:992 msgid "Scala is missing" msgstr "Scala è mancante" #: src/plm/core/model/Game.java:996 #, fuzzy msgid "" "Please install jython and its dependencies to use the python programming " "language in the PLM.\n" "\n" msgstr "" "Per piacere installa jython e le sue dipendenze per poter utilizzare il " "linguaggio python in PLM.\n" "\n" #: src/plm/core/model/Game.java:997 msgid "Python is missing" msgstr "Python è mancante" #: src/plm/core/model/Game.java:1001 #, fuzzy msgid "" "Please install C and its dependencies to use the C programming language in " "the PLM.\n" "\n" msgstr "" "Per piacere installa jython e le sue dipendenze per poter utilizzare il " "linguaggio python in PLM.\n" "\n" #: src/plm/core/model/Game.java:1002 #, fuzzy msgid "C is missing" msgstr "Scala è mancante" #: src/plm/core/model/Game.java:1007 msgid "" "The C langage is currently very experimental in the PLM.\n" "If you go for C, you may not be able to complete some exercises that\n" "are still in progress in C, although some other parts are already okay.\n" "\n" "Do you want to proceed anyway?" msgstr "" #: src/plm/core/model/Game.java:1011 msgid "C is still experimental" msgstr "" #: src/plm/core/model/HelpServer.java:27 src/plm/core/ui/action/HelpMe.java:130 msgid "Asking to the teacher for help" msgstr "Chiedi all'insegnante per avere aiuto" #: src/plm/core/model/HelpServer.java:29 src/plm/core/ui/action/HelpMe.java:133 #: src/plm/core/ui/action/HelpMe.java:145 msgid "Cancel call for help to the teacher" msgstr "Annulla la richiesta di aiuto all'insegnante" #: src/plm/core/model/Users.java:97 #, java-format msgid "User {0} exists already; don't add it again." msgstr "" #: src/plm/core/model/Users.java:121 #, fuzzy, java-format msgid "Switched to user: {0}" msgstr "Passa alla visuale dello stato" #: src/plm/core/model/Users.java:174 msgid "A new PLM user has been created for you!" msgstr "" #: src/plm/core/model/lesson/Exercise.java:80 #, java-format msgid "The world ''{0}'' differs" msgstr "Il mondo ''{0}'' è differente" #: src/plm/core/model/lesson/ExerciseTemplated.java:47 #, java-format msgid "Source file {0}.{1} not found." msgstr "File sorgente {0}.{1} non trovato." #: src/plm/core/model/lesson/ExerciseTemplated.java:120 #, java-format msgid "{0}: BEGIN TEMPLATE within the template. Please fix your entity." msgstr "" "{0}: BEGIN TEMPLATE all'interno del template. Per piacere correggi la tua " "entità." #: src/plm/core/model/lesson/ExerciseTemplated.java:141 #, java-format msgid "" "{0}: BEGIN SOLUTION is closed with END TEMPLATE. Please fix your entity." msgstr "" "{0}: BEGIN SOLUTION si è chiuso con END TEMPLATE. Per piacere correggi la " "tua entità." #: src/plm/core/model/lesson/ExerciseTemplated.java:159 #: src/plm/core/model/lesson/ExerciseTemplated.java:183 #, java-format msgid "" "{0}: END TEMPLATE with no matching BEGIN TEMPLATE. Please fix your entity." msgstr "" "{0}: END TEMPLATE senza nessun BEGIN TEMPLATE. Per piacere correggi la tua " "entità." #: src/plm/core/model/lesson/ExerciseTemplated.java:163 #, java-format msgid "{0}: Begin solution in template tail. Change it to BEGIN HIDDEN" msgstr "{0}: Begin solution nella coda del template. Cambiato in BEGIN HIDDEN" #: src/plm/core/model/lesson/ExerciseTemplated.java:203 #, java-format msgid "" "Parser error in file {0}. This is a parser bug (state={1}), please report." msgstr "" "Errore del parser nel file {0}. Questo è un bug del parser (stato={1}), per " "piacere segnalalo." #: src/plm/core/model/lesson/ExerciseTemplated.java:208 #, java-format msgid "" "{0}: End of file unexpected after the solution but within the template. " "Please fix your entity." msgstr "" "{0}: End of file inaspettata dopo la soluzione ma all'interno del template. " "Per piacere correggi la tua entità." #: src/plm/core/model/lesson/ExerciseTemplated.java:210 #, java-format msgid "" "{0}: End of file unexpected (state: {1}). Did you forget to close your " "template or solution? Please fix your entity." msgstr "" "{0}: End of file inaspettata (stato: {1}). Hai dimenticato di chiudere il " "tuo template o la soluzione? Per piacere correggi la tua entità." #: src/plm/core/model/lesson/ExerciseTemplated.java:366 #, java-format msgid "" "Exercise {0} is said to be compatible with language {1}, but there is no " "entity for this language: {2}" msgstr "" "L'esercizio {0} è descritto come compatibile con il linguaggio {1} ma non " "c'è nessuna entità per questo linguaggio: {2}" #: src/plm/core/model/lesson/ExerciseTemplated.java:375 #, java-format msgid "{0}: No entity found. You should fix your paths and such" msgstr "{0}: Nessuna entità trovata Dovresti correggere i tuoi paths e simili " #: src/plm/core/model/lesson/ExerciseTemplated.java:406 #, java-format msgid "World {0} is broken ({1}). Recompute all answer worlds." msgstr "Il mondo {0} è rotto ({1}) Rielaborazione di tutti i mondi risposta." #: src/plm/core/model/lesson/ExerciseTemplated.java:410 #, fuzzy, java-format msgid "Cache file {0} is missing. Recompute all answer worlds." msgstr "Il mondo {0} è rotto ({1}) Rielaborazione di tutti i mondi risposta." #: src/plm/core/model/lesson/ExerciseTemplated.java:414 #, java-format msgid "" "IO exception while reading world {0} ({1}). Recompute all answer worlds." msgstr "" "Eccezione sul IO durante la lettura del mondo {0} ({1}). Rielaborazione di " "tutti i mondi risposta." #: src/plm/core/model/lesson/ExerciseTemplated.java:425 #, java-format msgid "" "Recompute the answer of {0} despite the cache file, as requested by the " "property {1}" msgstr "" "Rielaborazione della risposta di {0} a dispetto del file di cache, come " "richiesto dalla proprietà {1}" #: src/plm/core/model/lesson/ExerciseTemplated.java:465 #, java-format msgid "Error while writing answer world of {0}:" msgstr "Errore durante la scrittura del mondo di risposta di {0}:" #: src/plm/core/model/lesson/ExerciseTemplated.java:469 #, java-format msgid "Cannot write answer world of {0}. Please check the permissions." msgstr "" "Impossibile scrivere il mondo di risposta di {0}. Per piacere controlla i " "permessi." #: src/plm/core/model/lesson/Lecture.java:90 #: src/plm/core/model/lesson/Lesson.java:94 #, java-format msgid "File {0}.html not found." msgstr "File {0}.html non trovato." #: src/plm/core/model/lesson/Lecture.java:99 #: src/plm/core/model/lesson/Lesson.java:104 #, java-format msgid "Cannot find the name of mission in {0}.html" msgstr "Impossibile trovare il nome della missione in {0}.html" #. It should never happen since the session content should be created by the git spy module. #: src/plm/core/model/session/GitSessionKit.java:89 msgid "" "Something weird happened. Your session was not created/reloaded properly. " "Please report this issue." msgstr "" #: src/plm/core/model/session/ZipSessionKit.java:252 msgid "Ok, quit and lose my data" msgstr "Ok, esco e perdo i miei dati" #: src/plm/core/model/session/ZipSessionKit.java:252 msgid "Please stop! I'll save it myself first" msgstr "Per piacere fermati! Io devo salvare prima" #: src/plm/core/model/session/ZipSessionKit.java:253 #, fuzzy, java-format msgid "" "The PLM were unable to save your session file for lesson {0} ({1}:{2}).\n" "\n" " Would you like proceed anyway (and lose any solution typed so far)?" msgstr "" "PLM era in grado di salvare il tuo file di sessione per la lezione {0} ({1}:" "{2}).\n" "\n" " Vorresti procerede comunque (e perdere qualsiasi soluzione tu abbia scritto " "fin ora)?" #: src/plm/core/model/session/ZipSessionKit.java:256 msgid "Your changes are NOT saved" msgstr "I tuoi cambiamenti NON sono stati salvati" #: src/plm/core/model/session/ZipSessionKit.java:259 msgid "User aborted saving on system error" msgstr "Salvataggio interrotto dall'utente durante un errore del sistema" #: src/plm/core/model/session/ZipSessionKit.java:356 msgid "Proceed" msgstr "Procedi" #: src/plm/core/model/session/ZipSessionKit.java:356 msgid "Abort" msgstr "Interrompi" #: src/plm/core/model/session/ZipSessionKit.java:357 #, fuzzy, java-format msgid "" "The PLM were unable to load your code for lesson {0} ({1}:{2}).\n" "\n" " Would you like proceed anyway (and lose any solution typed previously)?" msgstr "" "PLM era in grado di caricare il tuo codice della lezione {0} ({1}:{2}). \n" "\n" " Vorresti procedere comunque (e perdere qualsiasi soluzione scritta " "precedentemente)?" #: src/plm/core/model/session/ZipSessionKit.java:360 msgid "Error while loading your session" msgstr "Errore durante il caricamento della tua sessione" #: src/plm/core/model/session/ZipSessionKit.java:363 msgid "Abording on user request" msgstr "Interruzione su richiesta dell'utente" #: src/plm/core/model/tracking/GitSpy.java:72 #, java-format msgid "Your session {0} was automatically retrieved from the servers." msgstr "" #. If no branch can be found remotely, create a new one. #. System.out.println(Game.i18n.tr("Creating a new session locally, as no corresponding session could be retrieved from the servers.",userBranch)); #: src/plm/core/model/tracking/GitSpy.java:77 msgid "Couldn't retrieve a corresponding session from the servers..." msgstr "" #: src/plm/core/model/tracking/GitSpy.java:86 msgid "" "You found a bug in the PLM. Please report it with all possible details " "(including the stacktrace below)." msgstr "" #: src/plm/core/model/tracking/GitSpy.java:164 msgid "Pushing to the remote repository before exiting" msgstr "" #: src/plm/core/model/tracking/GitUtils.java:76 msgid "An error occurred while configuring the repository..." msgstr "" #: src/plm/core/model/tracking/GitUtils.java:85 msgid "Retrieving your session from the servers..." msgstr "" #: src/plm/core/model/tracking/GitUtils.java:119 msgid "An error occurred while checking out the user's branch: " msgstr "" #: src/plm/core/model/tracking/GitUtils.java:132 #, fuzzy msgid "last session data successfully retrieved" msgstr "La tua sessione è stata importata con successo." #: src/plm/core/model/tracking/GitUtils.java:135 #, fuzzy msgid "last session data successfully merged" msgstr "La tua sessione è stata importata con successo." #: src/plm/core/model/tracking/GitUtils.java:138 msgid "" "Conflicts have been detected while synchronizing with last session data, " "trying to resolve it..." msgstr "" #. TODO: handle this case #: src/plm/core/model/tracking/GitUtils.java:166 msgid "Canceled the merge operation because of the following failures:" msgstr "" #: src/plm/core/model/tracking/GitUtils.java:173 msgid "Can't merge data retrieved from server with local session data." msgstr "" #: src/plm/core/model/tracking/GitUtils.java:214 msgid "Cannot synchronize your session with the servers (network down)." msgstr "" #: src/plm/core/model/tracking/GitUtils.java:241 #, fuzzy msgid "Your session has been successfully saved into the clouds." msgstr "La tua sessione è stata importata con successo." #. An error occurred while pushing #: src/plm/core/model/tracking/GitUtils.java:245 msgid "Fetching the server's last version..." msgstr "" #: src/plm/core/model/tracking/GitUtils.java:252 msgid "" "Fetching the data's last version didn't solve the issue, please report this " "bug." msgstr "" #: src/plm/core/model/tracking/GitUtils.java:255 msgid "" "A bug occurred while synchronizing your data with the server, please report " "the following error:" msgstr "" #: src/plm/core/ui/AboutLessonDialog.java:20 msgid "About lesson - " msgstr "Riguardo la lezione - " #: src/plm/core/ui/AboutPLMDialog.java:37 src/plm/core/ui/MainFrame.java:429 #: src/plm/core/ui/MainFrame.java:777 #, fuzzy msgid "About the PLM" msgstr "Riguardo PLM" #: src/plm/core/ui/AboutPLMDialog.java:60 #, fuzzy, java-format msgid "" "

version {0} " "({1})


© 2008-2015 Contributors. All rights reserved.