<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tusefomal</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tusefomal"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Tusefomal"/>
	<updated>2026-08-20T10:56:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61910</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61910"/>
		<updated>2022-03-30T11:56:33Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* The course format system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page highlights the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== Navigation changes ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
=== Primary navigation ===&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
==== Customising the primary navigation ====&lt;br /&gt;
Not yet implemented but we are looking at allowing the full addition and removal of any of the primary navigation tabs in the boost theme config file.&lt;br /&gt;
=== Secondary navigation ===&lt;br /&gt;
The main content area shows tabs for secondary navigation with a maximum of 5 items being rendered in this ‘more’ menu. A new UI component has been created to render menus like this. Files:&lt;br /&gt;
 /lib/templates/moremenu.mustache&lt;br /&gt;
==== Adding items to the navigation ====&lt;br /&gt;
The secondary navigation pulls information mainly from the settings navigation node from each context. Any plugin that implements the existing navigation hooks will have their items added to the secondary navigation.&lt;br /&gt;
Existing navigation hooks:&lt;br /&gt;
* {module}_extend_navigation&lt;br /&gt;
* {local}_extend_navigation&lt;br /&gt;
* {report}_report_extend_navigation&lt;br /&gt;
* {plugin}_extend_navigation_course&lt;br /&gt;
* {plugin}_extend_navigation_category_settings&lt;br /&gt;
==== Changing the order of tabs ====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level.&lt;br /&gt;
=== Tertiary navigation ===&lt;br /&gt;
We&#039;ve moved action buttons to the top of the page. We would encourage you to do the same.&lt;br /&gt;
If you have any buttons on an activity page that go to another page, or open a form (or similar), then we encourage you to move them from the body of your activity page to the top. All of the core activities have been updated to follow this pattern. Please take a look to see how you can format your activity in a similar fashion. There is no API here. You are welcome to create the buttons and display them as you wish in this top area.&lt;br /&gt;
=== New API functions ===&lt;br /&gt;
==== Page API ====&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondarynav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* set_secondary_navigation - Sets the ‘_hassecondarynavigation’ and optionally the ‘_hastablistsecondarynavigation’ to indicate whether a page should render the secondary navigation, and if the secondary navigation should be rendered and behave with a tablist ARIA role (as opposed to its default which is being rendered with a menubar ARIA role).&lt;br /&gt;
==== Navigationlib ====&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
==== The activity header class ====&lt;br /&gt;
There is a new activity header class that handles the display of information common to activities. 3rd party activities are not required to explicitly output this information as part of rendering individual pages.&lt;br /&gt;
&lt;br /&gt;
The common information that are currently handled by the class are:&lt;br /&gt;
* title&lt;br /&gt;
* description&lt;br /&gt;
* completion information&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As part of the update it was required that the initial information to be displayed by the class be toggable at a theme and layout level. Taking this into account the following theme level configurable exists:&lt;br /&gt;
* activityheaderconfig =&amp;gt; An array that currently only enforces &#039;notitle&#039; but can be expanded in the future NOTE: Boost has this set as true by default &#039;options&#039;&lt;br /&gt;
The following layout level options that can be defined:&lt;br /&gt;
* noactivityheader - to remove the header in this specific layout.&lt;br /&gt;
* activityheader - An array that enforces the following options:&lt;br /&gt;
** notitle&lt;br /&gt;
** nocompletion&lt;br /&gt;
** nodescription&lt;br /&gt;
The class has a page level getter which you can use to fetch the current version of the class. The base state is initialised within the constructor with the completion information only fetched when data is exported for the template.&lt;br /&gt;
&lt;br /&gt;
The class has setters for the following variables which can be leveraged to modify the header for a particular page in the format set_{variable_name}:&lt;br /&gt;
* hidecompletion&lt;br /&gt;
* description&lt;br /&gt;
* title&lt;br /&gt;
Alternately, bulk operations can also be done by passing the above variables in an array to &#039;set_attrs&#039; which in turn calls the setters.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Note: Any updates to the activityheader needs to be performed before the call to $OUTPUT-&amp;gt;header&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
===== Theme updates: =====&lt;br /&gt;
With the changes in boost to incorporate the primary and secondary navigation, 3rd party themes would need to account for the following in their templates:&lt;br /&gt;
* To leverage the activity_header, it&#039;s data needs to be exported and included into the base template :&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
   {{&amp;gt; core/activity_header}}&lt;br /&gt;
{{#headercontent}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;** headercontent being the array element that contains the exported activity_header data&lt;br /&gt;
* It is recommended to transition towards the secondary/tertiary navigation hierarchy to reduce user cognitive load and with a logical separation of components&lt;br /&gt;
** Secondary navigation can be added to the templates by following the example https://github.com/moodle/moodle/blob/master/theme/boost/templates/columns2.mustache#L64-L68 This leverages the secondary navigation class to generate it&#039;s content.&lt;br /&gt;
* Flat navigation classes have been marked for deprecation. Themes that leverage the flat_navigation will need to make the following changes in their plugins in order to use it&lt;br /&gt;
** Account for the additional changes [[Moodle 4.0 developer update#Theme changes]]&lt;br /&gt;
** Indicate that they do not implement secondary navigation via the page&#039;s &amp;quot;set_secondary_navigation&amp;quot; function. It is recommended to set this within the root layout file e.g. columns2&lt;br /&gt;
** Initialise the flat navigation by introducing the following in the root layout file(if not existent)&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$nav = $PAGE-&amp;gt;flatnav;&lt;br /&gt;
$templatecontext[&#039;firstcollectionlabel&#039;] = $nav-&amp;gt;get_collectionlabel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* In order to reintroduce the settings cog in the templates, you can introduce the following: &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;region-main-settings-menu&amp;quot; class=&amp;quot;d-print-none {{#hasblocks}}has-blocks{{/hasblocks}}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt; {{{ output.region_main_settings_menu }}} &amp;lt;/div&amp;gt;            &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Accessibility notes: =====&lt;br /&gt;
The jump to ‘maincontent’ div is now rendered within the activity header when within an activity context&lt;br /&gt;
== Component library ==&lt;br /&gt;
Each Moodle installation now ships with a Moodle User Interface (UI) Component library, a documentation system used to describe all the Bootstrap components and the custom Moodle components. The component Library is a helper tool for developers when creating user interfaces, a testing tool for theme developers and a documentation tool for core developers. The ultimate goal of having a component library is to encourage developers to create consistent user interfaces to improve Moodle’s overall user experience.&lt;br /&gt;
&lt;br /&gt;
The library contains pages with documentation about User Interface components. It contains details on how to use the component, what variations are available and the JavaScript events / options are associated with the component.&lt;br /&gt;
&lt;br /&gt;
When writing on these pages it is possible to render core mustache templates using some custom syntax like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; mustache template=&amp;quot;core/notification_error&amp;quot; &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{&amp;lt; /mustache &amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can also call core JavaScript or use HTML examples where the html code and the rendered result are visible in the Component Library. For more info visit the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-templates/ Moodle templates] page or the [http://componentlibrary.moodle.com/admin/tool/componentlibrary/docspage.php/library/moodle-javascript/ Moodle JavaScript] page.&lt;br /&gt;
&lt;br /&gt;
Each page in the library uses the current css from the default theme in your Moodle installation, if you have multiple themes installed and enabled the setting &amp;quot;Allow theme changes on url&amp;quot;, the component library will have a theme selector option.&lt;br /&gt;
&lt;br /&gt;
A hosted version of the Component Library can be found here. http://componentlibrary.moodle.com&lt;br /&gt;
=== Enabling the Component Library ===&lt;br /&gt;
Component library pages are written in the markdown language. These pages need to be compiled to HTML pages before the Component Library is visible. To compile the pages the server running Moodle needs to have the [[Javascript Modules#Install%20NVM%20and%20Node|JavaScript developer tools installed]] (nodeJs and Grunt)&lt;br /&gt;
&lt;br /&gt;
If your server meets all requirements you can enable the library running&lt;br /&gt;
 $ npm install&lt;br /&gt;
 $ grunt componentlibrary&lt;br /&gt;
Further installation instructions can be found in the Component Library itself.&lt;br /&gt;
=== Documenting new UI Components ===&lt;br /&gt;
There are no set rules for adding new pages in the component library yet. These rules will need to be written and adopted in the integration process for Moodle code.&lt;br /&gt;
&lt;br /&gt;
As a guideline for making this rules consideration are:&lt;br /&gt;
&lt;br /&gt;
The component library is not about single use components, for example the Moodle grade book (a huge component with many custom features). Or about very common components like buttons, these are already covered by the Bootstrap section of the component library.&lt;br /&gt;
&lt;br /&gt;
New features should be build keeping in mind the UI part needs to be customisable and if possible (and making sense) reusable. And example would be the new page drawers that we are introducing for the Navigation project. Or the custom primary navigation menus where overflowing items are pushed into a More section.&lt;br /&gt;
== Theme changes ==&lt;br /&gt;
=== Edit switch ===&lt;br /&gt;
On theme boost the “Turn editing on” and “Customise this page” buttons have been replaced by an edit switch in the top navbar. Theme Classic will keep using the old buttons. Child themes can choose to use the edit switch if the theme config.php is using this variable&lt;br /&gt;
 $THEME-&amp;gt;haseditswitch = true;&lt;br /&gt;
The languague menu, which used to be rendered in place of the custom menu has moved to the user dropdown when the user is logged in. If not logged in it will be placed next to the search / notification / messaging icon in the top navbar.&lt;br /&gt;
=== Login page ===&lt;br /&gt;
The login page has been redesigned and allows the admin to configure a background image for the login page only in the theme settings page. This change is available in both Boost and Classic. The login page still has all the features with an improved layout. &lt;br /&gt;
=== The page footer ===&lt;br /&gt;
In large screens, the page footer button is only visible when clicking a help button at the bottom right of the screen.&lt;br /&gt;
=== User initials as profile picture placeholder ===&lt;br /&gt;
If users do not upload a profile picture the user initials are displayed on a rounded gray background as a placeholder picture in the top navbar or any other page using a placeholder image. This change will be available in both Boost and Classic. &lt;br /&gt;
&lt;br /&gt;
With the introduction of this placeholder image the full username will no longer be displayed in the top navbar.&lt;br /&gt;
=== Removal of back to top link ===&lt;br /&gt;
The &amp;quot;back to top&amp;quot; link will be removed for theme boost since the new course index reduced the dependence on page scrolling. Also, the new footer is positioned where this component used to be.&lt;br /&gt;
=== Styling changes ===&lt;br /&gt;
By default rounded edges will be used for UI components, for the page header and main content area the borders will be removed. &lt;br /&gt;
=== New layout page ===&lt;br /&gt;
Theme boost now uses the drawers.php layout for the course index and blocks.&lt;br /&gt;
== Question bank changes ==&lt;br /&gt;
There was a big project to deliver [[Question bank improvements for Moodle 4.0]] which added a new plugin type for adding features to the question banks, tracking the version history for each question as it is edited (question table has been split into &amp;lt;code&amp;gt;question&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;question_versions&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_bank_entries&amp;lt;/code&amp;gt;), and tracking where each question is going to be used, with new tables &amp;lt;code&amp;gt;question_references&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;question_set_references&amp;lt;/code&amp;gt;. This work was done in Epic MDL-70329 if you want to track down the details of any of the core changes.&lt;br /&gt;
=== Question type plugins ===&lt;br /&gt;
Amazingly, we (Safat and colleagues at Catalyst AU) managed to implement this without breaking most question type plugins.&lt;br /&gt;
&lt;br /&gt;
However, the changes to the question bank, and the other Moodle 4.0 changes, probably broke the Behat tests for your plugin. To help with fixing that, MDL-74130 adds navigation to key question type pages (Preview and Edit for a question, and standard question bank pages like the bank itself, import and export) which should let you fix your test efficiently, and in a way that will work in all Moodle versions since 3.9.&lt;br /&gt;
&lt;br /&gt;
The &#039;most&#039; in the first paragraph here is becuase more advance question types may require more effort to fix. (For example qtype_combined which creates multi-part qusetions like the core qtype_multianswer; or qtype_pmatch or qtype_stack, which store additional data - questions tests - alongside the question itseld. How should that work with versionning?) But, if you have not done weird things like that, you are probably safe. If you find anything else that causes problems, please list it here.&lt;br /&gt;
&lt;br /&gt;
The same thing should apply to question behaviour and question import/export format plugings: no significant changes required (probably just fixing the Behat tests because of the navigation changes).&lt;br /&gt;
=== New plugin type: qbank plugins ===&lt;br /&gt;
This is not something that will cause problems for people upgrading from 3.x. Rather, it is an exciting possibility you can explore once you have survived process of upgrading to 4.0. There is a whole new plugin type which you can create to add new features to the question bank. For example extra columns, new actions and bulk actions, and so on. See [[Question_bank_plugins]].&lt;br /&gt;
=== Activities that use questions ===&lt;br /&gt;
The probable bad news is if you have an activity module which uses questions. So far, the only activity which has been fixed is mod_quiz in Moodle core, so we don&#039;t yet have a good picture of what fixes will be necessary in other activities. Work is about to start fixing [https://github.com/studentquiz/moodle-mod_studentquiz mod_studentquiz], so watching that should give more clues. As we do that, we will try to update this section of this page. Other help writing the information required here would also be greatly appreciated.&lt;br /&gt;
== The course format system ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
=== Mandatory renderer in course formats ===&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
=== New format base class ===&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
=== New course output classes and mustache files ===&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All course format output classes implements the new named_templatable interface, which allows the class to define its own template path using the &amp;quot;get_template_name&amp;quot; method. This new interface in combination with [[Templates#Blocks|mustache blocks]] allows the format plugins to provide alternative templates to render the course.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
=== Course editor javascript modules and frontend components ===&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
=== Other course related 4.0 changes ===&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
=== New steps ===&lt;br /&gt;
Moodle 4.0 introduces some new behat steps.&lt;br /&gt;
&lt;br /&gt;
Sometimes you want to create a bulk number of activities. In that case you can use:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
:count :entitytype exist with the following data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
Given 100 &amp;quot;mod_lti &amp;gt; tool types&amp;quot; exist with the following data:&lt;br /&gt;
  |name        |Test tool [count]                  |&lt;br /&gt;
  |description |Example description [count]        |&lt;br /&gt;
  |baseurl     |https://www.example.com/tool[count]|&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dynamic (AJAX) tabs is a new feature contributed to Moodle 4.0 by the Workplace team (MDL-71943). You can use the following step to navigate between the tabs.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on the &amp;quot;tab title&amp;quot; dynamic tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To make sure that edit mode is (or is not) available on the current page, the following steps can be used.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And edit mode should be available on the current page&lt;br /&gt;
And edit mode should not be available on the current page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are new aliases for the existing steps &amp;lt;code&amp;gt;I turn editing mode on&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;I turn editing mode off&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I switch editing mode on&lt;br /&gt;
And I switch editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In addition to the existing step to go to a course with editing mode on, we now have the following step to do the same but with editing mode being off.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I am on &amp;quot;course full name&amp;quot; course homepage with editing mode off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step is similar to the old &amp;lt;code&amp;gt;following &amp;quot;link string&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&amp;lt;/code&amp;gt; step, with more flexibility.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot; should download between &amp;quot;min bytes&amp;quot; and &amp;quot;max bytes&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And following &amp;quot;Download&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;Starter&amp;quot; &amp;quot;table_row&amp;quot; should download between &amp;quot;0&amp;quot; and &amp;quot;5000&amp;quot; bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to hover the mouse over the trigger area.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over the &amp;quot;element string&amp;quot; &amp;quot;element type&amp;quot; in the &amp;quot;container string&amp;quot; &amp;quot;container type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step enables an installed plugin.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;plugin name&amp;quot; &amp;quot;plugin type&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I enable &amp;quot;course_summary&amp;quot; &amp;quot;block&amp;quot; plugin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following is a special variation of &#039;I click on &amp;quot;&amp;lt;page name&amp;gt;&amp;quot; &amp;quot;link&amp;quot; in the &amp;quot;page&amp;quot; &amp;quot;region&amp;quot;&#039;. It first checks to see if we are on the given page via the breadcrumb. If not we then attempt to follow the link name given.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I follow the breadcrumb &amp;quot;page name&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can use the following step to ensure a node is active in the navbar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Node&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;My courses&amp;quot; is active in navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step can be used to navigate to a given node in the primary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select &amp;quot;Node&amp;quot; from primary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check whether an item exists in the user menu or not.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the user menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Language&amp;quot; &amp;quot;link&amp;quot; should exist in the user menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are to check if a submenu of the user menu is shown, and if an item exists or does not exist in a given user submenu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the &amp;quot;submenu name&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I follow &amp;quot;Language&amp;quot; in the user menu&lt;br /&gt;
Then I should see &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
And &amp;quot;English (pirate) &amp;amp;lrm;(en_ar)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;Language selector&amp;quot; user submenu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To add enrolment methods to courses you can use the following new step. The data that you provide in the next lines are used to fill the enrolment method form.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;enrolment method&amp;quot; in &amp;quot;course identifier&amp;quot; with:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
When I add &amp;quot;Self enrolment&amp;quot; enrolment method in &amp;quot;Course 1&amp;quot; with:&lt;br /&gt;
  | Custom instance name     | Test student enrolment |&lt;br /&gt;
  | Enrolment key            | moodle_rules           |&lt;br /&gt;
  | Use group enrolment keys | Yes                    |&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 3 new steps specific to the calendar component. These steps can be used to hover over a day in the mini-calendar or the full calendar.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the full calendar page&lt;br /&gt;
And I hover over day &amp;quot;day of month&amp;quot; of this month in the mini-calendar block&lt;br /&gt;
And I hover over today in the mini-calendar block&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some new steps are added to question bank to be able to add comment to questions, verify the existence of a comment, and deleting comments form questions. Please note that the steps for adding comments only write the comment text in the comment field. You still need to click on the &amp;quot;Add comment&amp;quot; button to save the comment.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question&lt;br /&gt;
And I add &amp;quot;comment text&amp;quot; comment to question preview&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question&lt;br /&gt;
And I delete &amp;quot;comment text&amp;quot; comment from question preview&lt;br /&gt;
And I should see &amp;quot;number of comments&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;number of comments&amp;quot; on the row on the comments column&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;Question bank&amp;quot; in current page administration&lt;br /&gt;
And I should see &amp;quot;0&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;0&amp;quot; on the row on the comments column&lt;br /&gt;
And I add &amp;quot;test comment 01&amp;quot; comment to question&lt;br /&gt;
And I click on &amp;quot;Add comment&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Close&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;.modal-dialog&amp;quot; &amp;quot;css_element&amp;quot;&lt;br /&gt;
And I should see &amp;quot;1&amp;quot; on the comments column&lt;br /&gt;
And I click &amp;quot;1&amp;quot; on the row on the comments column&lt;br /&gt;
And I delete &amp;quot;test comment 01&amp;quot; comment from question&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similar to the steps for comments, the following steps are to verify the number of a question&#039;s usage and to click on it in order to open the question usage modal.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
And I click &amp;quot;usage count&amp;quot; on the usage column&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new steps are related to bulk actions in the question bank UI.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
And I should not see question bulk action &amp;quot;action&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I click on &amp;quot;First question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Second question&amp;quot; &amp;quot;checkbox&amp;quot;&lt;br /&gt;
And I click on &amp;quot;With selected&amp;quot; &amp;quot;button&amp;quot;&lt;br /&gt;
And I should see question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on question bulk action &amp;quot;deleteselected&amp;quot;&lt;br /&gt;
And I click on &amp;quot;Delete&amp;quot; &amp;quot;button&amp;quot; in the &amp;quot;Confirm&amp;quot; &amp;quot;dialogue&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://docs.moodle.org/en/Report_builder Report builder] is a new feature contributed to Moodle 4.0 by the Workplace team. The following new step is added to Moodle 4.0 to select an action from the action menu in the list of custom reports table.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I press &amp;quot;action&amp;quot; action in the &amp;quot;report name&amp;quot; report row&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There&#039;s another step related to the report builder to set a column&#039;s aggregation in the report editor.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;column title&amp;quot; column aggregation to &amp;quot;aggregation method&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I set the &amp;quot;First name&amp;quot; column aggregation to &amp;quot;Comma separated values&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step needs to be used in scenarios that involve testing BigBlueButton. For this to work, you need to have a [https://github.com/moodlehq/bigbluebutton_mock BigBlueButton Mock API Server] and set &amp;lt;code&amp;gt;TEST_MOD_BIGBLUEBUTTONBN_MOCK_SERVER&amp;lt;/code&amp;gt; to point to that in config.php.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And a BigBlueButton mock server is configured&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step replicates receiving a callback from the BigBlueButton server indicating the recordings for meetings are ready for viewing.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And the BigBlueButtonBN server has sent recording ready notifications&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following steps are specific to the lesson activity. Note that in 4.0, some links (such as the &amp;quot;edit&amp;quot; and the &amp;quot;grade essays&amp;quot; links) are replaced by buttons, so you need to update your old steps with the new ones.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I edit the lesson&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;A new step is added to be used in lesson activities to edit them. This step navigates the user to the lesson edit page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I grade lesson essays&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;It&#039;s a new step to go to the &amp;quot;Grade essays&amp;quot; page of the lesson we are currently in.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I select edit type &amp;quot;edit type&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Select the lesson edit type when we are in the the lesson&#039;s edit page. &amp;quot;edit type&amp;quot; can either be &amp;quot;Collapsed&amp;quot; or &amp;quot;Expanded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following new step can be used to navigate to the exports page in the course gradebook and select the specified export type from the grade exports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;export option&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;XML file&amp;quot; export page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Similarly, there&#039;s a new step to navigate to the imports page in the course gradebook and select the specified import type from the grade imports navigation selector.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I navigate to &amp;quot;import option&amp;quot; import page in the course gradebook&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Boost steps ===&lt;br /&gt;
In addition to the steps listed in the previous section, there are also some Boost specific steps coming with Moodle 4.0. These steps only work in Boost or Boost child themes, so you need to make sure they are not used in scenarios that may be run by non-Boost themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following step checks whether a node is active in the secondary navigation.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see :name is active in secondary navigation&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Boost theme shows the language selector menu in the primary navigation when not logged in, and within the user menu when logged in. The following steps are to check if the primary navigation includes the language selector menu.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And language selector menu should exist in the navbar&lt;br /&gt;
And language selector menu should not exist in the navbar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And the following steps can be used to check whether an item exists in the language selector menu in the Boost theme.&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should exist in the language selector menu&lt;br /&gt;
And &amp;quot;item text&amp;quot; &amp;quot;selector type&amp;quot; should not exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;For example:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;English &amp;amp;lrm;(en)&amp;amp;lrm;&amp;quot; &amp;quot;link&amp;quot; should exist in the language selector menu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Modified steps ===&lt;br /&gt;
The step &amp;lt;code&amp;gt;I change the (window|viewport) size to &amp;quot;size&amp;quot;&amp;lt;/code&amp;gt; now supports 2 new values for the size argument. The size argument now accepts &amp;lt;code&amp;gt;mobile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tablet&amp;lt;/code&amp;gt; values in addition to &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;large&amp;lt;/code&amp;gt;.&lt;br /&gt;
=== Removed steps ===&lt;br /&gt;
Some behat steps are removed or replaced with new steps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a result of some design changes, hidden or restricted activities are no longer dimmed. Therefore the step&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be dimmed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;is now removed.&lt;br /&gt;
Depending on what you were using that step for, you may be able to use these steps:&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Label name&amp;quot; label should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; activity should be hidden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;&lt;br /&gt;
And I should see &amp;quot;Activity or resource name&amp;quot;&lt;br /&gt;
And &amp;quot;Activity or resource name&amp;quot; &amp;quot;link&amp;quot; should not exist in the &amp;quot;region-main&amp;quot; &amp;quot;region&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Other things to consider ===&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. It is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] is integrated these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
Old behat steps that may now fail can be updated to the new steps.&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
Or for settings, instead of:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I follow &amp;quot;Test choice name&amp;quot;&lt;br /&gt;
And I navigate to &amp;quot;Edit settings&amp;quot; in current page administration&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gherkin&amp;quot;&amp;gt;And I am on the &amp;quot;Test choice name&amp;quot; &amp;quot;choice activity editing&amp;quot; page&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also similar stream-lined navigation steps for accessing question bank pages. See MDL-74130.&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Core plugins review ===&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;br /&gt;
=== Core blocks cleanup ===&lt;br /&gt;
In the &amp;quot;Add a block&amp;quot; menu, the list of blocks was really long. A few changes have been done to reduce this list.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Add a block cleanup]] page.&lt;br /&gt;
=== Site admin presets plugin ===&lt;br /&gt;
The third-party plugin [https://moodle.org/plugins/block_admin_presets Admin presets], created by David Monllaó and maintained by developers from [https://pimenko.com/ Pimenko] has been adapted and integrated into Moodle 4.0. It stores settings and plugins status (enabled/disabled) in what&#039;s called &amp;quot;presets&amp;quot; to let admins quickly switch between different configurations.&lt;br /&gt;
&lt;br /&gt;
More information about this project can be found in the [[Site admin presets|Site admin presets plugin]] page.&lt;br /&gt;
=== JavaScript browser support changes ===&lt;br /&gt;
From Moodle 4.0, Internet Explorer is no longer supported. See MDL-73915 and MDLSITE-6109 for further information on this change.&lt;br /&gt;
&lt;br /&gt;
This change means that changes built on 4.0 onwards (including the master branch) will be different to older versions of Moodle.&lt;br /&gt;
&lt;br /&gt;
For plugin developers supporting multiple versions of Moodle using a single plugin version, the compiled javascript files are backwards compatible and will _work_ on all supported versions, however if you run the `grunt` command on multiple versions you will see unbuilt changes. Running grunt on all versions of Moodle is not necessary and this check can be safely disabled for Moodle versions 3.9 - 4.0, as long as only at least you run `grunt` against at least one version of Moodle.&lt;br /&gt;
&lt;br /&gt;
If you need to support Internet Explorer and do not wish to fork your plugin for Moodle 4.0 onwards, then it is recommended that you run `grunt` on an older version of Moodle.&lt;br /&gt;
=== The course index element ===&lt;br /&gt;
The new course index feature can be themed using a set of scss variables. Use them to change the look and feel instead of adding custom css&lt;br /&gt;
 /theme/boost/scss/moodle/courseindex.scss&lt;br /&gt;
With the introduction of the course index component, the previous and next links shown underneath each activity are no longer needed and they will be removed.&lt;br /&gt;
=== Activity icons ===&lt;br /&gt;
The icons used for activities have been redesigned and updated for all core moodle activities.&lt;br /&gt;
&lt;br /&gt;
When viewing the new icons in a file manager, for example for the quiz activity, you will see a simple black monochrome icon with a transparent background.&lt;br /&gt;
&lt;br /&gt;
On the course page, or in the activity chooser, the icon will display as a white icon on a coloured background. Styling of the icons on the coursepage is controlled by the css in theme/boost/scss/moodle/icons.scss.&lt;br /&gt;
&lt;br /&gt;
The background colour for activity icons is set using a new variable in function [modname]_supports(). The quiz activity is of type assessment, so in function quiz_supports() there is a new line defining the purpose:&lt;br /&gt;
 case FEATURE_MOD_PURPOSE: return MOD_PURPOSE_ASSESSMENT;&lt;br /&gt;
Available purposes are:&lt;br /&gt;
* MOD_PURPOSE_COMMUNICATION&lt;br /&gt;
* MOD_PURPOSE_ASSESSMENT&lt;br /&gt;
* MOD_PURPOSE_COLLABORATION&lt;br /&gt;
* MOD_PURPOSE_CONTENT&lt;br /&gt;
* MOD_PURPOSE_ADMINISTRATION&lt;br /&gt;
* MOD_PURPOSE_INTERFACE&lt;br /&gt;
The background colours linked to these purposes are set in theme/boost/scss/moodle/variables.scss&lt;br /&gt;
 $activity-icon-colors: map-merge(&lt;br /&gt;
     (&lt;br /&gt;
         &amp;quot;administration&amp;quot;: #5d63f6,&lt;br /&gt;
         &amp;quot;assessment&amp;quot;: #eb66a2,&lt;br /&gt;
         &amp;quot;collaboration&amp;quot;: #f7634d,&lt;br /&gt;
         &amp;quot;communication&amp;quot;: #11a676,&lt;br /&gt;
         &amp;quot;content&amp;quot;: #399be2,&lt;br /&gt;
         &amp;quot;interface&amp;quot;: #a378ff&lt;br /&gt;
     ),&lt;br /&gt;
     $activity-icon-colors&lt;br /&gt;
 );&lt;br /&gt;
If activity plugins do not define FEATURE_MOD_PURPOSE the activity icon will be rendered against a light grey background. There is no requirement to define the purpose of activity plugins, it will only affect the icon styling.&lt;br /&gt;
&lt;br /&gt;
Plugins implementing the variable FEATURE_MOD_PURPOSE are only supported on Moodle 4.0 and newer.&lt;br /&gt;
&lt;br /&gt;
Customising the activity icon can be done in an alternative way. For example using the styles.css in mod/[pluginname/styles.css&lt;br /&gt;
&lt;br /&gt;
In the example below the activity plugin developer chooses to keep the coloured icon for the activity and render it as large as the coloured background on the core activities&lt;br /&gt;
 .modicon_subcourse.activityiconcontainer {&lt;br /&gt;
     background-color: transparent;&lt;br /&gt;
     padding: 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 .modicon_subcourse.activityiconcontainer img {&lt;br /&gt;
     width: 50px;&lt;br /&gt;
     height: 50px;&lt;br /&gt;
 }&lt;br /&gt;
To customize all icon colours use this scss array and add it to the ‘Raw initial SCSS’ in the theme Boost advanced settings page. The complete array of icon background colours can be overridden using the ‘Raw initial SCSS’ in the theme settings page. The example below changes the colours of each activity type.&lt;br /&gt;
 $activity-icon-colors: (&lt;br /&gt;
     &amp;quot;administration&amp;quot;: #5D63F6,&lt;br /&gt;
     &amp;quot;assessment&amp;quot;: #11A676,&lt;br /&gt;
     &amp;quot;collaboration&amp;quot;: #EB66A2,&lt;br /&gt;
     &amp;quot;communication&amp;quot;: #F7634D,&lt;br /&gt;
     &amp;quot;content&amp;quot;: #399BE2,&lt;br /&gt;
     &amp;quot;interface&amp;quot;: #A378FF&lt;br /&gt;
 )&lt;br /&gt;
== I&#039;m a developer, what do I need to know? ==&lt;br /&gt;
This section is a quick checklist of the areas in this document that you should consult when updating your plugin.&lt;br /&gt;
=== Modules ===&lt;br /&gt;
If you are a module developer (activity / resources) then you need to review the following updates and changes:&lt;br /&gt;
* If using settings, reformat to work with the secondary navigation. We have significantly changed the way that settings are shown. Settings added to the course and activity administration branch of the navigation are now by default shown in the secondary navigation. You will most likely find them in the more section of the secondary navigation. Please avoid creating settings in containers (a parent navigation node with children). These settings will still be shown, but this goes against the pattern that we are trying to establish for navigation around the site. If you have a lot of settings, consider creating a specific page to handle your additional settings.&lt;br /&gt;
** The order of the items in the secondary navigation may not be to your liking. This can be changed. See [[Moodle_4.0_developer_update#Changing_the_order_of_tabs|changing the order of tabs]]&lt;br /&gt;
* Update my behat tests to use new steps for site navigation. See [[Moodle_4.0_developer_update#Behat_changes|new behat steps]].&lt;br /&gt;
* Update my module to use the new activity_header API. See [[Moodle_4.0_developer_update#The_activity_header_class|the activity header]].&lt;br /&gt;
* Update my pages to make it work with the general format of the tertiary navigation. See [[Moodle_4.0_developer_update#Tertiary_navigation|the tertiary navigation]].&lt;br /&gt;
* Update my activity icon to use the API and set a purpose. See [[Moodle_4.0_developer_update#Activity_icons|activity icons]].&lt;br /&gt;
=== Themes ===&lt;br /&gt;
If you are a theme developer then you may want to consider the following:&lt;br /&gt;
* Take a look at the [[Moodle_4.0_developer_update#Navigation_changes|new navigation]] and decide if you want to incorporate this into your theme.&lt;br /&gt;
** A new layout ([[Moodle_4.0_developer_update#New_layout_page|drawers]])&lt;br /&gt;
** An [[Moodle_4.0_developer_update#Edit_switch|edit switch]]&lt;br /&gt;
** The [[Moodle_4.0_developer_update#The_course_index_element|course index]]&lt;br /&gt;
* Use of the flat nav&lt;br /&gt;
* New Site administration page and layout&lt;br /&gt;
* Course settings and how they are displayed&lt;br /&gt;
=== Course format ===&lt;br /&gt;
There have been a lot of changes made to the course format. Most in the process of moving the course format away from using the old rendering system and towards templates.&lt;br /&gt;
We recommend the following sections be read carefully:&lt;br /&gt;
# [[Moodle_4.0_developer_update#The_course_format_system|The course format]]. There have been a lot of deprecations and reading this section is critical in understanding the changes made.&lt;br /&gt;
# Consider moving the rendering of your content over to the [[Templates|template system]].&lt;br /&gt;
=== Other plugins ===&lt;br /&gt;
# Are you adding settings? See the [[Moodle_4.0_developer_update#Adding_items_to_the_navigation|secondary nav]] for adding items to this navigation bar.&lt;br /&gt;
# Have a look at [[Moodle_4.0_developer_update#Secondary_navigation|secondary]] and [[Moodle_4.0_developer_update#Tertiary_navigation|tertiary]] navigation changes in general if you have a plugin that has multiple pages to navigate around.&lt;br /&gt;
# Do you have behat tests? Check the new [[Moodle_4.0_developer_update#Behat_changes|behat changes]].&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Developer_meeting_December_2021&amp;diff=61497</id>
		<title>Developer meeting December 2021</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Developer_meeting_December_2021&amp;diff=61497"/>
		<updated>2021-11-08T10:00:54Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Developer meetings]] &amp;gt; December 2021 meeting &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Date&lt;br /&gt;
| Tuesday 14 December 2021 at 10:00 UTC ([https://www.timeanddate.com/worldclock/fixedtime.html?msg=Moodle+developer+meeting&amp;amp;iso=20211214T10&amp;amp;p1=1440&amp;amp;ah=1 Check this time in your location])&lt;br /&gt;
|-&lt;br /&gt;
| Meeting room&lt;br /&gt;
| [https://moodle.org/mod/bigbluebuttonbn/view.php?id=8596 Developer meetings BBB on moodle.org]&lt;br /&gt;
|-&lt;br /&gt;
| Discussion&lt;br /&gt;
| [https://moodle.org/mod/forum/discuss.php?d=428309 Developer meeting Tuesday 14 December 2021]&lt;br /&gt;
|}&lt;br /&gt;
== Agenda ==&lt;br /&gt;
# Latest #moodledev news - [https://moodle.org/user/view.php?id=2356736&amp;amp;course=5 Sander Bangma], Moodle HQ&lt;br /&gt;
# Report builder in Moodle 4.0 - [https://moodle.org/user/view.php?id=219220&amp;amp;course=5 Paul Holden], Moodle HQ&lt;br /&gt;
# Course editor in Moodle 4.0 - [https://moodle.org/user/view.php?id=57216&amp;amp;course=5 Ferran Recio Calderó], Moodle HQ&lt;br /&gt;
----&lt;br /&gt;
If there is any topic that you would like to present or discuss at a developer meeting, please contact [https://moodle.org/user/profile.php?id=1601 David Mudrák].&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61208</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61208"/>
		<updated>2021-09-02T14:08:47Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* The core_courseformat subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
===== Primary navigation / Primary Output =====&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
===== New view =====&lt;br /&gt;
All settings for courses/modules will now be displayed as tabs within the module. A predefined set of tabs will be shown with any remaining / newly added ones residing within the &#039;Course Admin&#039; page. The settings cog will not be shown anymore. It is recommended to review any settings as some might be displayed as tabs and possibly move them to the tertiary navigation as is done in the core activity modules&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. At most 5 tabs will be displayed to a user with all the overflow nodes now residing within the &#039;More&#039; menu. Some of the nodes can be hidden by using the new functions defined. &lt;br /&gt;
===== New API functions =====&lt;br /&gt;
====== Page API ======&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
====== Navigationlib ======&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
===== Changing order of tabs in secondary navigation nodes =====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
===== Upcoming changes: =====&lt;br /&gt;
# &amp;lt;sup&amp;gt;1 -&amp;lt;/sup&amp;gt; Complete tertiary nav overhaul for core’s modules - [https://tracker.moodle.org/browse/MDL-71912 MDL-71912]. [https://tracker.moodle.org/browse/MDL-71913 MDL-71913],[https://tracker.moodle.org/browse/MDL-71914 MDL-71914],[https://tracker.moodle.org/browse/MDL-71915 MDL-71915]&lt;br /&gt;
# Backwards compatibility for complex deep nested custom navigation. Any custom navigation added by 3rd party devs will now be displayed as flatter structure within a URL select - [https://tracker.moodle.org/browse/MDL-72352 MDL-72352]&lt;br /&gt;
# New module API to inject common content at the top of a module page. The common content would be the title, description and activity information. This solves 2 issues:&lt;br /&gt;
## A centralised location where we can handle #2 and inject it into the relevant page&lt;br /&gt;
## A centralised location where we can inject items particularly activity_information without the need to be replicated in each module. &lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some Moodle 4.0 new features are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component that observes the course state data and reacts to any data change&lt;br /&gt;
* When any reactive component needs to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation, as well as the format plugin migration guide, will be available soon.&lt;br /&gt;
&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities, and other course-related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61207</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61207"/>
		<updated>2021-09-02T14:07:24Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Course editor javascript modules and frontend components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
The core Navigation API has been left mostly untouched. The callbacks to all navigation callbacks remains unchanged and will be called as part of the regular &#039;navigation&#039; and &#039;settingsnav&#039; initialisation. Some new core classes have been created and exist within a new namespace &#039;core/navigation&#039; and serves as conduit to rearrange, cherry-pick existing navigation nodes from the navigation/settingsnav trees and display within the respective navigation type. As such, it is highly recommended to provide unique keys for custom navigation nodes as this helps in the cherry-picking / rearranging process within the new classes.&lt;br /&gt;
===== Primary navigation / Primary Output =====&lt;br /&gt;
The primary navigation(the navbar) apart from the existing content will now display links to the Dashboard, My Courses, Site Admin and Course search, by default. You can still add items to the navbar via the &#039;custom menu&#039; option. This will be displayed within the &#039;More&#039; menu. We have transitioned the menus to be rendered via templates - refer user_menu.mustache. The lang menu has been moved to reside within the user menu.&lt;br /&gt;
===== New view =====&lt;br /&gt;
All settings for courses/modules will now be displayed as tabs within the module. A predefined set of tabs will be shown with any remaining / newly added ones residing within the &#039;Course Admin&#039; page. The settings cog will not be shown anymore. It is recommended to review any settings as some might be displayed as tabs and possibly move them to the tertiary navigation as is done in the core activity modules&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. At most 5 tabs will be displayed to a user with all the overflow nodes now residing within the &#039;More&#039; menu. Some of the nodes can be hidden by using the new functions defined. &lt;br /&gt;
===== New API functions =====&lt;br /&gt;
====== Page API ======&lt;br /&gt;
* Magic getters to fetch the primary and secondary navs and the primary output.&lt;br /&gt;
* The secondarynav magic getter also checks whether a custom secondary class has been defined within the module&#039;s local\views directory. Use this if you want to deviate from the standard secondary nav structure/order.&lt;br /&gt;
&lt;br /&gt;
* set_secondary_nav - Force override the secondary navigation class&lt;br /&gt;
&lt;br /&gt;
* has_secondary_navigation_setter - Sets the ‘_hassecondarynavigation’ to indicate whether a page should render the secondary navigation&lt;br /&gt;
====== Navigationlib ======&lt;br /&gt;
* set_show_in_secondary_navigation - whether or not a node should be displayed in the secondary nav. Accepts a single boolean argument&lt;br /&gt;
* set_force_into_more_menu- whether or not to force a node into the &#039;More&#039; menu. Accepts a single boolean argument&lt;br /&gt;
===== Changing order of tabs in secondary navigation nodes =====&lt;br /&gt;
Apart from the previously mentioned functions, you can also create a custom secondary class as mentioned earlier. This will automatically be picked by getter and used to render the secondary nav within the activity. E.g. mod_assign/local/views/secondary. Note: This is currently only possible on an activity and block level. &lt;br /&gt;
===== Upcoming changes: =====&lt;br /&gt;
# &amp;lt;sup&amp;gt;1 -&amp;lt;/sup&amp;gt; Complete tertiary nav overhaul for core’s modules - [https://tracker.moodle.org/browse/MDL-71912 MDL-71912]. [https://tracker.moodle.org/browse/MDL-71913 MDL-71913],[https://tracker.moodle.org/browse/MDL-71914 MDL-71914],[https://tracker.moodle.org/browse/MDL-71915 MDL-71915]&lt;br /&gt;
# Backwards compatibility for complex deep nested custom navigation. Any custom navigation added by 3rd party devs will now be displayed as flatter structure within a URL select - [https://tracker.moodle.org/browse/MDL-72352 MDL-72352]&lt;br /&gt;
# New module API to inject common content at the top of a module page. The common content would be the title, description and activity information. This solves 2 issues:&lt;br /&gt;
## A centralised location where we can handle #2 and inject it into the relevant page&lt;br /&gt;
## A centralised location where we can inject items particularly activity_information without the need to be replicated in each module. &lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some new feature of Moodle 4.0 are only available for courses using the new editor library:&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes. The pattern highlights are:&lt;br /&gt;
&lt;br /&gt;
* The main AMD module &amp;quot;core_crouseformat\courseeditor&amp;quot; maintains a data structure called state.&lt;br /&gt;
* Each UI element is implemented as a Component which observe the course state data and react any data change&lt;br /&gt;
* When any reactive component need to modify the course, it asks the course editor to execute a mutation. Mutations encapsulate all web services calls and alter the course state data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The reactive library documentation as well as the format plugin migration guide will be available soon.&lt;br /&gt;
&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
Two new web services have been added:&lt;br /&gt;
&lt;br /&gt;
* core_courseformat_get_state: user by the new javascript course editor to get the current course state data (containing the list of sections, activities and other course related data)&lt;br /&gt;
* core_courseformat_update_course: to alter the current course content. Each call returns the parts of the course state altered by the action&lt;br /&gt;
&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61205</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61205"/>
		<updated>2021-09-02T11:59:59Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Course editor javascript modules and frontend components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
The majority of the javascript logic related to the course editing is replaced by AMD modules. Because this is a major change in the way courses are edited and rendered, by default format plugins will continue using the previous YUI modules for now. However, formats can start using the new libraries overriding the &amp;quot;$format-&amp;gt;supports_components()&amp;quot; method.&lt;br /&gt;
&lt;br /&gt;
Some new feature of Moodle 4.0 are only available for courses using the new editor library:&lt;br /&gt;
&lt;br /&gt;
* Edit the course via the course index&lt;br /&gt;
* Creating sections without reloading the course page&lt;br /&gt;
* The new move section/activity modal&lt;br /&gt;
* Native browser drag&amp;amp;drop implementation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The new course editor uses a component-based reactive pattern to keep track of the course changes.&lt;br /&gt;
&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
* New web services&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61204</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61204"/>
		<updated>2021-09-02T10:03:04Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* The core_courseformat subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The section-based format can do it by extending the provided core_courseformat\output\section_renderer class which includes all the necessary methods.&lt;br /&gt;
&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used as a centralized source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. The old methods will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by providing alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
Soon.&lt;br /&gt;
&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
&lt;br /&gt;
* The majority of the javascript logic of the course editing is replaced by a new course editor AMD module. The old javascript is still available for third-party and it is not considered deprecated, however, it will replace eventually. Furthermore, some new 4.0 features such as the course index or adding sections via ajax are only available for formats compatible with the new course editor module.&lt;br /&gt;
* New web services&lt;br /&gt;
&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61203</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61203"/>
		<updated>2021-09-02T10:01:34Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* The core_courseformat subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style.&lt;br /&gt;
&lt;br /&gt;
==== Mandatory renderer in course formats ====&lt;br /&gt;
Now format plugins renderer is not optional anymore. Legacy formats without a renderer will get a deprecation message but it will continue working however, they should create a new renderer as soon as possible. The seciton-based format can do it by extending the provided core_courseformat\output\section_renderer class which include all the necessary methods.&lt;br /&gt;
&lt;br /&gt;
==== New format base class ====&lt;br /&gt;
The old base_format class (which all plugins extend) is now renamed as core_courseformat\base. The new class provides all the functionally of the previous base_format but it has been refactored to be used a centralised source of truth for the course rendering. Legacy formats should extend the new class to avoid the deprecation message.&lt;br /&gt;
&lt;br /&gt;
Now, the plugin format class provides information such as:&lt;br /&gt;
&lt;br /&gt;
* If the page is displaying a single or multiple section&lt;br /&gt;
* Give access to other related format objects like the modinfo, the course record, maximum number of sections...&lt;br /&gt;
* If the format is compatible with features like course index, reactive components, ajax...&lt;br /&gt;
* Other format specifics like the page title, the default section name, default blocks...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The format instance is now the main object output components will use to render a course (see next section for more information).&lt;br /&gt;
&lt;br /&gt;
==== New course output classes and mustache files ====&lt;br /&gt;
Traditionally, section-based course formats uses print_single_section_page and print_multiple_section_page to render the course content. In Moodle 4.0 most of the course rendering methods are migrated to output components and mustache templates. Old method will get deprecation messages if they use the old renderer methods.&lt;br /&gt;
&lt;br /&gt;
This is an example of a format rendering a course:&amp;lt;syntaxhighlight lang=&amp;quot;php-brief&amp;quot;&amp;gt;&lt;br /&gt;
// Get the course format instance.&lt;br /&gt;
$format = course_get_format($course);&lt;br /&gt;
&lt;br /&gt;
// Get the specific format renderer.&lt;br /&gt;
$renderer = $format-&amp;gt;get_renderer($PAGE);&lt;br /&gt;
&lt;br /&gt;
if (!empty($displaysection)) {&lt;br /&gt;
    // Setup the format instance to display a single section.&lt;br /&gt;
    $format-&amp;gt;set_section_number($displaysection);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the ouptut instance and render it.&lt;br /&gt;
$outputclass = $format-&amp;gt;get_output_classname(&#039;content&#039;);&lt;br /&gt;
$widget = new $outputclass($format);&lt;br /&gt;
&lt;br /&gt;
echo $renderer-&amp;gt;render($widget);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Format plugins are free to use its own output classes to render a course, or they could override the existing output classes by providing their own implementation. For example, the default output for &amp;quot;content&amp;quot; (as in the previous example) is &amp;quot;core_courseformat\output\local\|content&amp;quot;, however, if the plugin has a &amp;quot;format_XXX\output\courseformat\content&amp;quot; class, the $format-&amp;gt;class the get_output_class will return the overridden one.&lt;br /&gt;
&lt;br /&gt;
Another important update on course rendering is that now all course structure is rendered using mustache templates instead of the original html_writer methods. Now themes are able to override the course format by provide alternative versions of the mustache files. All core course templates are located in &amp;quot;course/format/templates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
All the new output classes and a guide on how to migrate the current third-party plugins will be available soon.&lt;br /&gt;
&lt;br /&gt;
==== Course editor javascript modules and frontend components ====&lt;br /&gt;
Soon.&lt;br /&gt;
&lt;br /&gt;
==== Other course related 4.0 changes ====&lt;br /&gt;
&lt;br /&gt;
* The majority of the javascript logic of the course editing is replaced by a new course editor AMD module. The old javascript is still available for third-party and it is not considered deprecated, however it will replace eventually. Furthermore, some new 4.0 features such as the course index or adding sections via ajax are only available for formats compatible with the new course editor module.&lt;br /&gt;
* New webservices&lt;br /&gt;
&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61201</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61201"/>
		<updated>2021-09-02T09:10:02Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* The core_courseformat subsystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located in &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributed between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style. The major affected specifications are:&lt;br /&gt;
&lt;br /&gt;
* Now format plugins must provide a renderer, which is not optional anymore&lt;br /&gt;
* The old base_format which plugins extend is now core_courseformat\base&lt;br /&gt;
* The previous methods to render a course are now deprecated and moved to output classes&lt;br /&gt;
* The majority of the javascript logic of the course editing is replaced by a new course editor AMD module. The old libraries are still available for third-party formats but will eventually replace the previous ones.&lt;br /&gt;
* Gradually, all tests and templates are being moved to the subsystem folder&lt;br /&gt;
&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61196</id>
		<title>Moodle 4.0 developer update</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_4.0_developer_update&amp;diff=61196"/>
		<updated>2021-09-02T07:20:31Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Course creation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 4.0}}This page will highlight the important changes that are coming in Moodle 4.0 for developers. Including how the UX improvements impact custom themes, relevant API changes, and what you can do as developer to prepare for the 4.0 release.&lt;br /&gt;
== UX and theme changes ==&lt;br /&gt;
== Component library ==&lt;br /&gt;
== Navigation ==&lt;br /&gt;
== The core_courseformat subsystem ==&lt;br /&gt;
Most of the logic for rendering and editing a course has been moved to a new subsystem called courseformat. The subsystem is located is located at &amp;quot;course/format&amp;quot; folder so it includes all the format plugins inside. The methods and modules which are distributes between the course and the course/format folders are now rearranged or refactored to be aligned with the current Moodle coding style. The major affected specifications are:&lt;br /&gt;
&lt;br /&gt;
* Now format plugins must provide a renderer, which is not optional anymore&lt;br /&gt;
* The old base_format which plugins extends is now core_courseformat\base&lt;br /&gt;
* The methods to render a course are now deprecated and moved to output classes&lt;br /&gt;
* The majority of the javascript logic of the course editing is replaced by a new course editor AMD module. The old libraries are still available for third party formats but will eventually replace the previous ones.&lt;br /&gt;
* Gradually, all tests and templates are being moved to the subsystem folder&lt;br /&gt;
&lt;br /&gt;
== API changes ==&lt;br /&gt;
== Behat changes ==&lt;br /&gt;
To make behat tests more readable and easy to maintain, it is recommended to use the most direct steps to get what the test needs. So since MDL-66335 was integrated, and the step was improved in MDL-72179 is highly recommended to use&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
instead of navigating to the activity via&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
Now that [https://docs.moodle.org/dev/Prototypes#Course_creation_improvements Course index] (MDL-71209) is integrated but the project is not stable, these behat steps&lt;br /&gt;
 I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 I follow &amp;quot;Activity name&amp;quot;&lt;br /&gt;
will fail using Boost theme.&lt;br /&gt;
&lt;br /&gt;
The reason for it is that the drawer used in Boost is hiding the course index. So when the test is trying to follow an &amp;quot;Activity name&amp;quot; link, it finds two different links:&lt;br /&gt;
* one in the course index&lt;br /&gt;
* another one in the course main content.&lt;br /&gt;
But the first one, the one in the course index, is hidden by the drawer, and the test fails.&lt;br /&gt;
&lt;br /&gt;
However the recommended behat steps&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page &lt;br /&gt;
or&lt;br /&gt;
 I am on the &amp;quot;Activity name&amp;quot; &amp;quot;[modname] activity&amp;quot; page logged in as &amp;quot;user&amp;quot;&lt;br /&gt;
work &#039;&#039;&#039;fine&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Some of the failing behats are fixed in https://github.com/ferranrecio/moodle/commit/c79d58a50b48aa6891ff1d3ba92a7b0ab2393c88#diff-fdf8b0b1eade3b69eaad038de0ddd7c8dec2be7afa32dc693fb929739a49fa9dR32 - MDL-71209&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 And I am on the &amp;quot;Test assignment name&amp;quot; &amp;quot;assign activity&amp;quot; page logged in as teacher1&lt;br /&gt;
instead of:&lt;br /&gt;
 When I log in as &amp;quot;teacher1&amp;quot;&lt;br /&gt;
 And I am on &amp;quot;Course&amp;quot; course homepage&lt;br /&gt;
 And I follow &amp;quot;Test assignment name&amp;quot;&lt;br /&gt;
== Core plugins review ==&lt;br /&gt;
A few plugins from core Moodle LMS which are no longer or hardly used have been removed and, if appropriate, added to the Moodle plugins directory.&lt;br /&gt;
&lt;br /&gt;
More information about this project, the list of plugins to be removed and the process to follow for keeping them before upgrading to 4.0 can be found in the [[Core plugins review]] page.&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58780</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58780"/>
		<updated>2021-05-11T09:13:20Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Mustache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.14&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-style&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
==Bennu==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
&lt;br /&gt;
==CAS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.7&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
&lt;br /&gt;
==CodeMirror==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor/atto/plugins/html/yui/src/codemirror&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
CodeMirror is a versatile text editor implemented in JavaScript for the browser.&lt;br /&gt;
&lt;br /&gt;
Version: 5.59.4&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/codemirror/CodeMirror&lt;br /&gt;
&lt;br /&gt;
==Emoji-data==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/emoji-data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to parse easily data and spritesheets for emoji&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/iamcal/emoji-data/&lt;br /&gt;
&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
&lt;br /&gt;
==Flexitour==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/tour.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A JS library for tours&lt;br /&gt;
&lt;br /&gt;
© 2016 Andrew Nicols and contributors&lt;br /&gt;
&lt;br /&gt;
License: GPLv3&lt;br /&gt;
&lt;br /&gt;
https://github.com/andrewnicols/flexitour&lt;br /&gt;
&lt;br /&gt;
==FLV player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for processing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.11.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
&lt;br /&gt;
== GeoPattern==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geopattern-php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for creating beautiful generative background images from a string&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.1&lt;br /&gt;
&lt;br /&gt;
Copyright 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/RedeyeGroup/geopattern-php&lt;br /&gt;
&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000  Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==H5P==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/h5p&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The general H5P library&lt;br /&gt;
&lt;br /&gt;
Version: 1.24&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: GPL-3.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-php-library/&lt;br /&gt;
&lt;br /&gt;
==Horde==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.22&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
&lt;br /&gt;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.13.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002   Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Jabber - XMPPHP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jabber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP library for XMPP (aka Jabber, Google Talk, etc).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1rc2-r77&lt;br /&gt;
&lt;br /&gt;
Copyright: 2008  Nathanael C. Fritz&lt;br /&gt;
&lt;br /&gt;
License: GPL&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/xmpphp&lt;br /&gt;
&lt;br /&gt;
==jQuery==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.4.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==JavaScript Beautifier==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;yui/src/beautify&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beautify HTML code in Atto.&lt;br /&gt;
&lt;br /&gt;
Version: 1.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://beautifier.io/&lt;br /&gt;
&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==JWT==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-jwt&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to RFC 7519&lt;br /&gt;
&lt;br /&gt;
Version: 5.0.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2011, Neuman Vong&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/firebase/php-jwt&lt;br /&gt;
&lt;br /&gt;
==ENUM==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-enum&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Enum implementation inspired from SplEnum&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.6&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 My C-Labs&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/myclabs/php-enum&lt;br /&gt;
&lt;br /&gt;
==kses==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005   Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==less.php==&lt;br /&gt;
&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright:  Matt Agar and Martin Jantošovič&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
&lt;br /&gt;
==MathJax==&lt;br /&gt;
&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
&lt;br /&gt;
* Default MathJax version: 2.7.2 (Moodle 3.4)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.61&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
==MaxMind DB Reader==&lt;br /&gt;
lib/maxmind/MaxMind/&lt;br /&gt;
&lt;br /&gt;
PHP API for reading MaxMind DB files&lt;br /&gt;
&lt;br /&gt;
Version: 1.9.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/MaxMind-DB-Reader-php/&lt;br /&gt;
&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.74&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==Mustache==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
&lt;br /&gt;
==mp3player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005   Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004   Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PclZip==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PhpSpreadsheet==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpspreadsheet&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PhpSpreadsheet&lt;br /&gt;
&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP.  Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.7&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.8.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
&lt;br /&gt;
==PHP-ML==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mlbackend/php/phpml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Machine learning library used to generate data for the Analytics system.&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.0&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2016-2018 Arkadiusz Kondas &amp;lt;arkadiusz.kondas[at]gmail&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://php-ml.readthedocs.io/&lt;br /&gt;
&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.6&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
&lt;br /&gt;
==RTLCSS for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/rtlcss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RTLCSS is a framework for converting Left-To-Right (LTR) Cascading Style Sheets(CSS) to Right-To-Left (RTL).&lt;br /&gt;
&lt;br /&gt;
© 2016 Frédéric Massart&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/moodlehq/rtlcss-php&lt;br /&gt;
&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
&lt;br /&gt;
==scssphp==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.6&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001  Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spout==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 3.0.1&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
&lt;br /&gt;
==TCPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/tcpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 6.3.5&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: LGPL-v3.0-only&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
&lt;br /&gt;
==Video.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;amd/src/video-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
JavaScript library that makes it easier to work with and build on HTML5 video&lt;br /&gt;
&lt;br /&gt;
Version: 7.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
http://videojs.com/&lt;br /&gt;
&lt;br /&gt;
==XHProf==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/xhprof&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Hierarchical Profiler for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Phacility&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/phacility/xhprof&lt;br /&gt;
&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc.  We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 3.17.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58779</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58779"/>
		<updated>2021-05-11T09:03:30Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* GeoIp2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.14&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-style&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
==Bennu==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
&lt;br /&gt;
==CAS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.7&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
&lt;br /&gt;
==CodeMirror==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor/atto/plugins/html/yui/src/codemirror&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
CodeMirror is a versatile text editor implemented in JavaScript for the browser.&lt;br /&gt;
&lt;br /&gt;
Version: 5.59.4&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/codemirror/CodeMirror&lt;br /&gt;
&lt;br /&gt;
==Emoji-data==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/emoji-data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to parse easily data and spritesheets for emoji&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/iamcal/emoji-data/&lt;br /&gt;
&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
&lt;br /&gt;
==Flexitour==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/tour.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A JS library for tours&lt;br /&gt;
&lt;br /&gt;
© 2016 Andrew Nicols and contributors&lt;br /&gt;
&lt;br /&gt;
License: GPLv3&lt;br /&gt;
&lt;br /&gt;
https://github.com/andrewnicols/flexitour&lt;br /&gt;
&lt;br /&gt;
==FLV player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for processing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.11.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
&lt;br /&gt;
== GeoPattern==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geopattern-php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for creating beautiful generative background images from a string&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.1&lt;br /&gt;
&lt;br /&gt;
Copyright 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/RedeyeGroup/geopattern-php&lt;br /&gt;
&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000  Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==H5P==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/h5p&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The general H5P library&lt;br /&gt;
&lt;br /&gt;
Version: 1.24&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: GPL-3.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-php-library/&lt;br /&gt;
&lt;br /&gt;
==Horde==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.22&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
&lt;br /&gt;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.13.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002   Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Jabber - XMPPHP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jabber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP library for XMPP (aka Jabber, Google Talk, etc).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1rc2-r77&lt;br /&gt;
&lt;br /&gt;
Copyright: 2008  Nathanael C. Fritz&lt;br /&gt;
&lt;br /&gt;
License: GPL&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/xmpphp&lt;br /&gt;
&lt;br /&gt;
==jQuery==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.4.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==JavaScript Beautifier==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;yui/src/beautify&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beautify HTML code in Atto.&lt;br /&gt;
&lt;br /&gt;
Version: 1.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://beautifier.io/&lt;br /&gt;
&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==JWT==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-jwt&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to RFC 7519&lt;br /&gt;
&lt;br /&gt;
Version: 5.0.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2011, Neuman Vong&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/firebase/php-jwt&lt;br /&gt;
&lt;br /&gt;
==ENUM==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-enum&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Enum implementation inspired from SplEnum&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.6&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 My C-Labs&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/myclabs/php-enum&lt;br /&gt;
&lt;br /&gt;
==kses==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005   Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==less.php==&lt;br /&gt;
&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright:  Matt Agar and Martin Jantošovič&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
&lt;br /&gt;
==MathJax==&lt;br /&gt;
&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
&lt;br /&gt;
* Default MathJax version: 2.7.2 (Moodle 3.4)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.61&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
==MaxMind DB Reader==&lt;br /&gt;
lib/maxmind/MaxMind/&lt;br /&gt;
&lt;br /&gt;
PHP API for reading MaxMind DB files&lt;br /&gt;
&lt;br /&gt;
Version: 1.9.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/MaxMind-DB-Reader-php/&lt;br /&gt;
&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.74&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==Mustache==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.12.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
&lt;br /&gt;
==mp3player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005   Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004   Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PclZip==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PhpSpreadsheet==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpspreadsheet&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PhpSpreadsheet&lt;br /&gt;
&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP.  Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.7&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.8.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
&lt;br /&gt;
==PHP-ML==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mlbackend/php/phpml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Machine learning library used to generate data for the Analytics system.&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.0&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2016-2018 Arkadiusz Kondas &amp;lt;arkadiusz.kondas[at]gmail&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://php-ml.readthedocs.io/&lt;br /&gt;
&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.6&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
&lt;br /&gt;
==RTLCSS for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/rtlcss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RTLCSS is a framework for converting Left-To-Right (LTR) Cascading Style Sheets(CSS) to Right-To-Left (RTL).&lt;br /&gt;
&lt;br /&gt;
© 2016 Frédéric Massart&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/moodlehq/rtlcss-php&lt;br /&gt;
&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
&lt;br /&gt;
==scssphp==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.6&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001  Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spout==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 3.0.1&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
&lt;br /&gt;
==TCPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/tcpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 6.3.5&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: LGPL-v3.0-only&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
&lt;br /&gt;
==Video.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;amd/src/video-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
JavaScript library that makes it easier to work with and build on HTML5 video&lt;br /&gt;
&lt;br /&gt;
Version: 7.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
http://videojs.com/&lt;br /&gt;
&lt;br /&gt;
==XHProf==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/xhprof&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Hierarchical Profiler for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Phacility&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/phacility/xhprof&lt;br /&gt;
&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc.  We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 3.17.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58778</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58778"/>
		<updated>2021-05-11T09:03:04Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* MaxMind DB Reader */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.14&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-style&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
==Bennu==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
&lt;br /&gt;
==CAS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.7&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
&lt;br /&gt;
==CodeMirror==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor/atto/plugins/html/yui/src/codemirror&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
CodeMirror is a versatile text editor implemented in JavaScript for the browser.&lt;br /&gt;
&lt;br /&gt;
Version: 5.59.4&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/codemirror/CodeMirror&lt;br /&gt;
&lt;br /&gt;
==Emoji-data==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/emoji-data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to parse easily data and spritesheets for emoji&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/iamcal/emoji-data/&lt;br /&gt;
&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
&lt;br /&gt;
==Flexitour==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/tour.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A JS library for tours&lt;br /&gt;
&lt;br /&gt;
© 2016 Andrew Nicols and contributors&lt;br /&gt;
&lt;br /&gt;
License: GPLv3&lt;br /&gt;
&lt;br /&gt;
https://github.com/andrewnicols/flexitour&lt;br /&gt;
&lt;br /&gt;
==FLV player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for processing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
&lt;br /&gt;
== GeoPattern==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geopattern-php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for creating beautiful generative background images from a string&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.1&lt;br /&gt;
&lt;br /&gt;
Copyright 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/RedeyeGroup/geopattern-php&lt;br /&gt;
&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000  Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==H5P==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/h5p&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The general H5P library&lt;br /&gt;
&lt;br /&gt;
Version: 1.24&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: GPL-3.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-php-library/&lt;br /&gt;
&lt;br /&gt;
==Horde==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.22&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
&lt;br /&gt;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.13.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002   Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Jabber - XMPPHP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jabber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP library for XMPP (aka Jabber, Google Talk, etc).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1rc2-r77&lt;br /&gt;
&lt;br /&gt;
Copyright: 2008  Nathanael C. Fritz&lt;br /&gt;
&lt;br /&gt;
License: GPL&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/xmpphp&lt;br /&gt;
&lt;br /&gt;
==jQuery==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.4.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==JavaScript Beautifier==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;yui/src/beautify&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beautify HTML code in Atto.&lt;br /&gt;
&lt;br /&gt;
Version: 1.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://beautifier.io/&lt;br /&gt;
&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==JWT==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-jwt&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to RFC 7519&lt;br /&gt;
&lt;br /&gt;
Version: 5.0.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2011, Neuman Vong&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/firebase/php-jwt&lt;br /&gt;
&lt;br /&gt;
==ENUM==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-enum&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Enum implementation inspired from SplEnum&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.6&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 My C-Labs&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/myclabs/php-enum&lt;br /&gt;
&lt;br /&gt;
==kses==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005   Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==less.php==&lt;br /&gt;
&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright:  Matt Agar and Martin Jantošovič&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
&lt;br /&gt;
==MathJax==&lt;br /&gt;
&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
&lt;br /&gt;
* Default MathJax version: 2.7.2 (Moodle 3.4)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.61&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
==MaxMind DB Reader==&lt;br /&gt;
lib/maxmind/MaxMind/&lt;br /&gt;
&lt;br /&gt;
PHP API for reading MaxMind DB files&lt;br /&gt;
&lt;br /&gt;
Version: 1.9.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/MaxMind-DB-Reader-php/&lt;br /&gt;
&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.74&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==Mustache==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.12.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
&lt;br /&gt;
==mp3player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005   Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004   Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PclZip==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PhpSpreadsheet==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpspreadsheet&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PhpSpreadsheet&lt;br /&gt;
&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP.  Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.7&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.8.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
&lt;br /&gt;
==PHP-ML==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mlbackend/php/phpml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Machine learning library used to generate data for the Analytics system.&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.0&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2016-2018 Arkadiusz Kondas &amp;lt;arkadiusz.kondas[at]gmail&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://php-ml.readthedocs.io/&lt;br /&gt;
&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.6&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
&lt;br /&gt;
==RTLCSS for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/rtlcss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RTLCSS is a framework for converting Left-To-Right (LTR) Cascading Style Sheets(CSS) to Right-To-Left (RTL).&lt;br /&gt;
&lt;br /&gt;
© 2016 Frédéric Massart&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/moodlehq/rtlcss-php&lt;br /&gt;
&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
&lt;br /&gt;
==scssphp==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.6&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001  Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spout==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 3.0.1&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
&lt;br /&gt;
==TCPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/tcpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 6.3.5&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: LGPL-v3.0-only&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
&lt;br /&gt;
==Video.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;amd/src/video-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
JavaScript library that makes it easier to work with and build on HTML5 video&lt;br /&gt;
&lt;br /&gt;
Version: 7.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
http://videojs.com/&lt;br /&gt;
&lt;br /&gt;
==XHProf==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/xhprof&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Hierarchical Profiler for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Phacility&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/phacility/xhprof&lt;br /&gt;
&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc.  We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 3.17.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58777</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58777"/>
		<updated>2021-05-11T09:01:23Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Video.js */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.14&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-style&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
==Bennu==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
&lt;br /&gt;
==CAS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.7&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
&lt;br /&gt;
==CodeMirror==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor/atto/plugins/html/yui/src/codemirror&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
CodeMirror is a versatile text editor implemented in JavaScript for the browser.&lt;br /&gt;
&lt;br /&gt;
Version: 5.59.4&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/codemirror/CodeMirror&lt;br /&gt;
&lt;br /&gt;
==Emoji-data==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/emoji-data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to parse easily data and spritesheets for emoji&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/iamcal/emoji-data/&lt;br /&gt;
&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
&lt;br /&gt;
==Flexitour==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/tour.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A JS library for tours&lt;br /&gt;
&lt;br /&gt;
© 2016 Andrew Nicols and contributors&lt;br /&gt;
&lt;br /&gt;
License: GPLv3&lt;br /&gt;
&lt;br /&gt;
https://github.com/andrewnicols/flexitour&lt;br /&gt;
&lt;br /&gt;
==FLV player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for processing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
&lt;br /&gt;
== GeoPattern==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geopattern-php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for creating beautiful generative background images from a string&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.1&lt;br /&gt;
&lt;br /&gt;
Copyright 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/RedeyeGroup/geopattern-php&lt;br /&gt;
&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000  Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==H5P==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/h5p&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The general H5P library&lt;br /&gt;
&lt;br /&gt;
Version: 1.24&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: GPL-3.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-php-library/&lt;br /&gt;
&lt;br /&gt;
==Horde==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.22&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
&lt;br /&gt;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.13.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002   Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Jabber - XMPPHP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jabber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP library for XMPP (aka Jabber, Google Talk, etc).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1rc2-r77&lt;br /&gt;
&lt;br /&gt;
Copyright: 2008  Nathanael C. Fritz&lt;br /&gt;
&lt;br /&gt;
License: GPL&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/xmpphp&lt;br /&gt;
&lt;br /&gt;
==jQuery==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.4.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==JavaScript Beautifier==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;yui/src/beautify&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beautify HTML code in Atto.&lt;br /&gt;
&lt;br /&gt;
Version: 1.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://beautifier.io/&lt;br /&gt;
&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==JWT==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-jwt&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to RFC 7519&lt;br /&gt;
&lt;br /&gt;
Version: 5.0.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2011, Neuman Vong&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/firebase/php-jwt&lt;br /&gt;
&lt;br /&gt;
==ENUM==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-enum&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Enum implementation inspired from SplEnum&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.6&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 My C-Labs&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/myclabs/php-enum&lt;br /&gt;
&lt;br /&gt;
==kses==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005   Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==less.php==&lt;br /&gt;
&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright:  Matt Agar and Martin Jantošovič&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
&lt;br /&gt;
==MathJax==&lt;br /&gt;
&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
&lt;br /&gt;
* Default MathJax version: 2.7.2 (Moodle 3.4)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.61&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
==MaxMind DB Reader==&lt;br /&gt;
lib/maxmind/MaxMind/&lt;br /&gt;
&lt;br /&gt;
PHP API for reading MaxMind DB files&lt;br /&gt;
&lt;br /&gt;
Version: 1.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/MaxMind-DB-Reader-php/&lt;br /&gt;
&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.74&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==Mustache==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.12.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
&lt;br /&gt;
==mp3player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005   Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004   Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PclZip==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PhpSpreadsheet==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpspreadsheet&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PhpSpreadsheet&lt;br /&gt;
&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP.  Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.7&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.8.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
&lt;br /&gt;
==PHP-ML==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mlbackend/php/phpml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Machine learning library used to generate data for the Analytics system.&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.0&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2016-2018 Arkadiusz Kondas &amp;lt;arkadiusz.kondas[at]gmail&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://php-ml.readthedocs.io/&lt;br /&gt;
&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.6&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
&lt;br /&gt;
==RTLCSS for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/rtlcss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RTLCSS is a framework for converting Left-To-Right (LTR) Cascading Style Sheets(CSS) to Right-To-Left (RTL).&lt;br /&gt;
&lt;br /&gt;
© 2016 Frédéric Massart&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/moodlehq/rtlcss-php&lt;br /&gt;
&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
&lt;br /&gt;
==scssphp==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.6&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001  Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spout==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 3.0.1&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
&lt;br /&gt;
==TCPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/tcpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 6.3.5&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: LGPL-v3.0-only&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
&lt;br /&gt;
==Video.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;amd/src/video-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
JavaScript library that makes it easier to work with and build on HTML5 video&lt;br /&gt;
&lt;br /&gt;
Version: 7.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
http://videojs.com/&lt;br /&gt;
&lt;br /&gt;
==XHProf==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/xhprof&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Hierarchical Profiler for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Phacility&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/phacility/xhprof&lt;br /&gt;
&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc.  We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 3.17.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Development_kit&amp;diff=57978</id>
		<title>Moodle Development kit</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Development_kit&amp;diff=57978"/>
		<updated>2020-11-04T11:55:50Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Backporting a fix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every developer creates simple tools to avoid repeating cumbersome and/or boring tasks, and that is precisely why MDK has been created: to pack all those useful tools in a portable way across systems. Initially developed in Bash, the project moved to Python to avoid dealing with inconsistencies between Unix platforms, and eventually to support Windows.&lt;br /&gt;
&lt;br /&gt;
= Key concept =&lt;br /&gt;
&lt;br /&gt;
The most important concept of MDK is that it works with Moodle instances. An instance of Moodle is a directory in which you have checked out a particular version together with a database using a specific database engine. This means that if you want to work on Moodle 2.3 and 2.4, using both MySQL and PostgreSQL, you will have four separate instance directories. This choice was made because it is the safest, clearest, and most straightforward solution. &lt;br /&gt;
&lt;br /&gt;
= Typical workflows using MDK =&lt;br /&gt;
&lt;br /&gt;
To discover what MDK can do for you, here are a few common tasks it can achieve. More on [https://github.com/FMCorz/mdk/wiki/Typical-workflows MDK&#039;s wiki].&lt;br /&gt;
&lt;br /&gt;
== Installing a new instance ==&lt;br /&gt;
&lt;br /&gt;
Say we need to create a new instance of Moodle 2.4 and install it with PostgreSQL. We also want the instance to be ready for development with appropriate config settings. We also want to create a bunch of user accounts.&lt;br /&gt;
&lt;br /&gt;
 mdk create -i -v 24 -e pgsql -r dev users&lt;br /&gt;
or the equivalent long form:&lt;br /&gt;
 mdk create --install --version 24 --engine pgsql --run dev users&lt;br /&gt;
&lt;br /&gt;
These options include:&lt;br /&gt;
 --install: launch the installation script after creating the instance&lt;br /&gt;
 --engine: database engine to install the instance on (must be used with --install), default: mysqli&lt;br /&gt;
 --version: version of Moodle create an instance of (default: &#039;master&#039;)&lt;br /&gt;
 --run: scripts to run after installation (default: none)&lt;br /&gt;
&lt;br /&gt;
More information about scripts is available here: https://github.com/FMCorz/mdk/tree/master/mdk/scripts&lt;br /&gt;
&lt;br /&gt;
The above command is equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 mkdir /dir/to/stable_24/moodle&lt;br /&gt;
 mkdir /dir/to/stable_24/moodledata&lt;br /&gt;
 ln -s /dir/to/stable_24/moodle /var/www/stable_24&lt;br /&gt;
 git clone git://git.moodle.org/moodle.git /dir/to/moodle&lt;br /&gt;
 cd /dir/to/stable_24/moodle&lt;br /&gt;
 php admin/cli/install.php --wwwroot=&amp;quot;http://localhost/stable_24&amp;quot; --dataroot=/dir/to/stable_24/moodledata --dbtype=pgsql --dbname=stable24 --dbuser=root --dbpass=root --dbhost=localhost --fullname=&amp;quot;Stable 24 PostgreSQL&amp;quot; --shortname=stable_24 --adminuser=admin --adminpass=test --allow-unstable --agree-license --non-interactive&lt;br /&gt;
 vim config.php&lt;br /&gt;
 # Add the following settings:&lt;br /&gt;
 # - $CFG-&amp;gt;sessioncookiepath: /stable_24/&lt;br /&gt;
 # - $CFG-&amp;gt;debug: DEBUG_DEVELOPER&lt;br /&gt;
 # - $CFG-&amp;gt;debugdisplay: 1&lt;br /&gt;
 # - $CFG-&amp;gt;passwordpolicy: 0&lt;br /&gt;
 # - $CFG-&amp;gt;perfdebug: 15&lt;br /&gt;
 # - $CFG-&amp;gt;debugpageinfo: 1&lt;br /&gt;
 # - $CFG-&amp;gt;allowthemechangeonurl: 1&lt;br /&gt;
 # - $CFG-&amp;gt;cachejs: 0&lt;br /&gt;
 # - $CFG-&amp;gt;yuicomboloading: 0&lt;br /&gt;
 # Include FirePHP Core&lt;br /&gt;
 # Login to Moodle&lt;br /&gt;
 # Create 10 students, 3 teachers and 3 managers&lt;br /&gt;
&lt;br /&gt;
You also can specify the name of the instance using the --name or -n parameter. This is necessary to avoid name conflicts when trying to create same Moodle version with different database engines:&lt;br /&gt;
&lt;br /&gt;
 mdk create -i -v 24 -e mysqli -r dev users -n stable_24-mysql&lt;br /&gt;
&lt;br /&gt;
== Fixing an issue ==&lt;br /&gt;
&lt;br /&gt;
 mdk fix 12345&lt;br /&gt;
 # Committing your patch&lt;br /&gt;
 mdk push -t&lt;br /&gt;
&lt;br /&gt;
This is equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 git branch --track MDL-12345-24 origin/MOODLE_24_STABLE&lt;br /&gt;
 git checkout MDL-12345-24&lt;br /&gt;
 # Committing your patch&lt;br /&gt;
 git push github MDL-12345-24&lt;br /&gt;
 # Editing the tracker issue to add&lt;br /&gt;
 # - Git repository URL&lt;br /&gt;
 # - Git branch for 2.4&lt;br /&gt;
 # - Git compare URL for 2.4&lt;br /&gt;
&lt;br /&gt;
== Peer reviewing a patch ==&lt;br /&gt;
&lt;br /&gt;
Here we want to pull a patch from a tracker issue into a new testing branch, and then run the PHPUnit tests.&lt;br /&gt;
&lt;br /&gt;
 mdk pull 12345 -t&lt;br /&gt;
 mdk phpunit -r&lt;br /&gt;
&lt;br /&gt;
This is the equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 cd /dir/to/stable_24/moodle&lt;br /&gt;
 git branch --tracker MDL-12345-24-test MOODLE_24_STABLE&lt;br /&gt;
 git checkout MDL-12345-24-test&lt;br /&gt;
 git pull git://github.org/Someone/moodle.git MDL-12345-24&lt;br /&gt;
 # And now the PHPUnit part&lt;br /&gt;
 mkdir /dir/to/stable_24/moodledata_phpu&lt;br /&gt;
 vim config.php&lt;br /&gt;
 # To add&lt;br /&gt;
 # - $CFG-&amp;gt;phpunit_dataroot = &#039;/dir/to/stable_24/moodledata_phpu&#039;;&lt;br /&gt;
 # - $CFG-&amp;gt;phpunit_prefix = &#039;phpu_&#039;;&lt;br /&gt;
 php admin/tool/phpunit/cli/init.php&lt;br /&gt;
 phpunit&lt;br /&gt;
&lt;br /&gt;
For executing only the testcases in a file you can use:&lt;br /&gt;
&lt;br /&gt;
 mdk phpunit -r -u repository/tests/repository_test.php&lt;br /&gt;
&lt;br /&gt;
== Backporting a fix ==&lt;br /&gt;
&lt;br /&gt;
MDK could handle for you most of the cherry-picking work when you backport a fix. To do so, you need to have installed locally instances called &amp;quot;stable_XX&amp;quot; for each version you want to backport your fix. To do so you can use commands like:&lt;br /&gt;
&lt;br /&gt;
 mdk create -v 38 -i -r dev users makecourse -n stable_38&lt;br /&gt;
 mdk create -v 37 -i -r dev users makecourse -n stable_37&lt;br /&gt;
&lt;br /&gt;
Once you have the stable_XX versions, go to the instance where you have the branch you want to backport and execute:&lt;br /&gt;
&lt;br /&gt;
 mdk backport --versions 37 38 --push --update-tracker&lt;br /&gt;
&lt;br /&gt;
The example params are:&lt;br /&gt;
* -v 37 38 backports the patch to the versions 3.7 and 3.8&lt;br /&gt;
* --push pushes the branch to github&lt;br /&gt;
* --update-tracker updates the tracker issue&lt;br /&gt;
&lt;br /&gt;
After the execution, your stable_XX instances will be on the fix branch, commits are pushed to you github project and backport links will be updated in the tracker.&lt;br /&gt;
&lt;br /&gt;
If for some reason one cherry pick could not finish successfully, mdk will ask you if you want to keep this backport or no. If you choose to keep the partial backport, your stable_XX instance will be in cherry-picking state. In that case you need to solve any conflict and use mdk to push your changes:&lt;br /&gt;
&lt;br /&gt;
 # go to your stable_XX with cherry pick conflict&lt;br /&gt;
 # solve conflicts with git mergetool or any other tool&lt;br /&gt;
 git cherry-pick --continue&lt;br /&gt;
 # once all conflicts are solved, push to your repository and tracker using&lt;br /&gt;
 mdk push -t&lt;br /&gt;
&lt;br /&gt;
== Upgrading the instances ==&lt;br /&gt;
&lt;br /&gt;
Say we need to upgrade our instances, as a new weekly release has just been made available.&lt;br /&gt;
 &lt;br /&gt;
 mdk upgrade -u --all&lt;br /&gt;
&lt;br /&gt;
This is the equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 # For each instance of Moodle...&lt;br /&gt;
 cd /dir/to/stable_24/moodle&lt;br /&gt;
 git checkout MOODLE_24_STABLE&lt;br /&gt;
 git fetch origin&lt;br /&gt;
 git reset --hard origin/MOODLE_24_STABLE&lt;br /&gt;
 php admin/cli/upgrade.php --non-interactive --allow-unstable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Executing behat tests ==&lt;br /&gt;
&lt;br /&gt;
In order to get the instance ready for acceptance testing (Behat) and run the test feature(s):&lt;br /&gt;
 &lt;br /&gt;
 mdk behat -r --tags=@core_completion&lt;br /&gt;
&lt;br /&gt;
For running only one feature or specific scenario:&lt;br /&gt;
&lt;br /&gt;
 mdk behat -r -n &amp;quot;Name of the feature/scenario&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
For a complete list of the commands MDK has to offer, read through the [https://github.com/FMCorz/mdk#command-list MDK README file] and the [https://github.com/FMCorz/mdk/wiki MDK wiki]. For more detail about each command, simply run them with the flag &#039;--help&#039;.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Please follow the instructions from the [https://github.com/FMCorz/mdk#installation README file].&lt;br /&gt;
&lt;br /&gt;
Note: When you install MDK, you will be asked for the following information (with default responses indicated in square brackets):&lt;br /&gt;
&lt;br /&gt;
*  What user are you initialising MDK for? [default - your current username]&lt;br /&gt;
*   What is the DocumentRoot of your virtual host? [~/www] &amp;lt;- &#039;&#039;&#039;See note below&#039;&#039;&#039;&lt;br /&gt;
*    Where do you want to store your Moodle instances? [~/moodles] &amp;lt;- This can be in your home directory (the default) because a symlink will be created using DocumentRoot&lt;br /&gt;
*    What is your Github username? (Leave blank if not using Github) &lt;br /&gt;
*    What is your MySQL user? [root]&lt;br /&gt;
*    What is your MySQL password? [root]&lt;br /&gt;
*    What is your PostgreSQL user? [root]&lt;br /&gt;
*    What is your PostgreSQL password? [root]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: By default, MDK will install instances to your home directory. A symlink will be created from your DocumentRoot to the install location. You will need to either change the DocumentRoot of your host to the path to your html root directory, e.g. /var/www/html, or create a file in /etc/httpd/conf.d/moodlehq.conf that configures a virtual host in your home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Also note that you may need to set the path variable to null:&#039;&#039;&#039;&lt;br /&gt;
 mdk config set path &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Upgrading MDK =&lt;br /&gt;
Every Moodle release, a new version of MDK is also being released in order to prepare for the development of the next Moodle version. To upgrade MDK:&lt;br /&gt;
# Update all of the Moodle instances: &#039;&#039;mdk update --all&#039;&#039;&lt;br /&gt;
# Check out the master branch for all of your master instances, e.g. in your stable_master branch: &#039;&#039;git checkout master&#039;&#039;&lt;br /&gt;
# Upgrade MDK&lt;br /&gt;
## Via pip: &#039;&#039;sudo pip install moodle-sdk --upgrade&#039;&#039;&lt;br /&gt;
## Via Homebrew: &#039;&#039;brew upgrade moodle-sdk&#039;&#039;&lt;br /&gt;
# Run MDK doctor to fix its &#039;&#039;masterBranch&#039;&#039; configuration. &#039;&#039;mdk doctor --fix --masterbranch&#039;&#039;&lt;br /&gt;
# Run MDK doctor to check the master instances. &#039;&#039;mdk doctor --all&#039;&#039;&lt;br /&gt;
#* If you don&#039;t see an error saying something like “stable_master is on branch master instead of MOODLE_XX_STABLE”, then you&#039;re all good. Otherwise, do a hard reset your master instances:&lt;br /&gt;
 mdk update -c&lt;br /&gt;
 cd ~/moodles/[integration/stable]_master&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git fetch `mdk config show upstreamRemote`&lt;br /&gt;
 git reset --hard `mdk config show upstreamRemote`/master&lt;br /&gt;
&lt;br /&gt;
= The MDK Suite =&lt;br /&gt;
&lt;br /&gt;
Some other tools have been developed using the name MDK as they are considered as part of the development kit but are often mistaken with the &#039;&#039;real&#039;&#039; MDK. The &#039;&#039;real&#039;&#039; MDK is the command line tool described above.&lt;br /&gt;
&lt;br /&gt;
== MDK Browser Extension ==&lt;br /&gt;
&lt;br /&gt;
Available for both [https://addons.mozilla.org/en-US/firefox/addon/mdk-browser-extension/ Firefox] and [https://chrome.google.com/webstore/detail/mdk-browser-extension/iadpkkojcdoflinpncpkbonnhdlaicnc Chrome], this is a browser extension that allows quick access to useful user-scripts. The scripts add functionality to Moodle.org, Moodle Tracker and your Moodle instances. You can find more information about it on its [https://github.com/danpoltawski/userscripts-moodle public repository].&lt;br /&gt;
&lt;br /&gt;
== MDK Authentication ==&lt;br /&gt;
&lt;br /&gt;
This is an authentication plugin for Moodle 2.x, which not only creates the user if it does not exist in the database yet, but also enrols it as a student, teacher or manager in all the available courses. More information about this plugin is available on the [https://github.com/FMCorz/moodle-auth_mdk public repository].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Experience_API_(xAPI)&amp;diff=57552</id>
		<title>Experience API (xAPI)</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Experience_API_(xAPI)&amp;diff=57552"/>
		<updated>2020-05-28T15:51:23Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Useful methods to handle xAPI statements inside plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Heading text ==&lt;br /&gt;
&lt;br /&gt;
This document contains a technical explanation on how the xAPI Moodle integration library works. The main purpose of this document is to keep the dev documentation while the oficial Dev Wiki page is not yet created.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Experience API (xAPI)&#039;&#039;&#039; is an e-learning software specification that allows learning content and learning systems to speak to each other in a manner that records and tracks all types of learning experiences.&lt;br /&gt;
&lt;br /&gt;
xAPI defines web services that can be used by any plugin or APP to connect to the LMS in a standard way. The main actors in xAPI communication are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Client&#039;&#039;&#039;: any plugin or APP that wants to use xAPI webservices&lt;br /&gt;
* &#039;&#039;&#039;xAPI LRS&#039;&#039;&#039; (server site): responsible for storing and serve the data emitted by the clients&lt;br /&gt;
&lt;br /&gt;
One good aspect about xAPI is that the amount of messages that can be shared between the clients and the LRS is quite limited. The main message type is called &#039;&#039;&#039;Statement&#039;&#039;&#039; and all statements can be summarized as “&#039;&#039;An actor XX executes action YY on object ZZ&#039;&#039;”.&lt;br /&gt;
&lt;br /&gt;
The typical statement object is a JSON element containing:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Actor&#039;&#039;&#039;: the person or group that do something&lt;br /&gt;
* &#039;&#039;&#039;Verb&#039;&#039;&#039;: the action the Actor do&lt;br /&gt;
* &#039;&#039;&#039;Object&#039;&#039;&#039;: the object on the Verb is executed. There are more than one type of objects that can be defined here but, for now, you can think about it as a specific “Quiz Attempt” for example.&lt;br /&gt;
* Other fields: for now, the rest of xAPI fields have a basic data validation so every plugin is responsible for implementing it’s own checks if they need them.&lt;br /&gt;
The xAPI specification can be consulted in the xAPI specs page: [https://github.com/adlnet/xAPI-Spec].&lt;br /&gt;
&lt;br /&gt;
== Moodle xAPI functionalities ==&lt;br /&gt;
&lt;br /&gt;
The final objective of Moodle xAPI library is NOT to implement a full LRS inside Moodle but to provide an easy way to handle xAPI statements within any plugin that needs it.&lt;br /&gt;
&lt;br /&gt;
For now Moodle will focus on supporting the main xAPI request which is called “&#039;&#039;&#039;statement&#039;&#039;&#039;”. A statement must be seen as a tracking message that can be used by any plugin to store user activity directly to the Moodle without programming any additional web service.&lt;br /&gt;
&lt;br /&gt;
The current library implements:&lt;br /&gt;
&lt;br /&gt;
* A new webservice called &#039;&#039;&#039;core_xapi_statement_post&#039;&#039;&#039; to process xAPI statements and generate standard Moodle events.&lt;br /&gt;
* A class &#039;&#039;&#039;\core_xapi\handler&#039;&#039;&#039; that any plugin can extend in order to user xAPI and generate specific plugin contexts. This way any plugin could use xAPI without implementing any new web service.&lt;br /&gt;
* A class &#039;&#039;&#039;\core_xapi\iri&#039;&#039;&#039; to easily translate random information into valid IRI values (needed for xAPI objects and verbs)&lt;br /&gt;
* A class &#039;&#039;&#039;\core_xapi\local\statement&#039;&#039;&#039; to create and extract information from statement data.&lt;br /&gt;
* A bunch of predefined classes in &#039;&#039;&#039;\core_xapi\local\statement\item_XXX&#039;&#039;&#039; to generate xAPI statement items from the plugins (exemple provided in “Generating statements in PHP”).&lt;br /&gt;
&lt;br /&gt;
== Statement processing ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;core_xapi_statement_post&#039;&#039;&#039; webservice receives a JSON encoded statement (could be an array or a single one) and a component frankenstyle name.&lt;br /&gt;
&lt;br /&gt;
The processing sequence is:&lt;br /&gt;
# The core xAPI library checks if the specified component has a xAPI handling class implementation. Otherwise it returns an error.&lt;br /&gt;
# xAPI checks the statement structure, if any check fails, it returns an error. The main validations for now are:&lt;br /&gt;
## Check that only supported xAPI attributes are used. If the statement array has some format error all statements will be rejected (see “Statement data validation” for more information).&lt;br /&gt;
## Check all users and groups are created in the LMS&lt;br /&gt;
## Check the current user ($USER) is an actor of the statement (actors can be a single agent or a group)&lt;br /&gt;
# For every statement:&lt;br /&gt;
## xAPI asks the component handler to convert the statement into a standard event (function statement_to_event). In case the plugin could not convert some statement into an event, this statement will be marked as “not processed” and will continue to the next statement.&lt;br /&gt;
## xAPI triggers the generated events&lt;br /&gt;
# Once all statements are processed:&lt;br /&gt;
## If ALL statements are marked as “not processed” it returns an error.&lt;br /&gt;
## If some statement could be processed, returns an array containing “true” if the statement is processed and “false” otherwise.&lt;br /&gt;
&lt;br /&gt;
Note that the plugin “statement_to_event” is responsible for:&lt;br /&gt;
* Grant that the specified user has permission to execute that statement.&lt;br /&gt;
* Provide a valid Moodle event to trigger&lt;br /&gt;
* Process any result attached to the statement&lt;br /&gt;
&lt;br /&gt;
== Statement data validation ==&lt;br /&gt;
&lt;br /&gt;
The core_xapi_statement_post webservice will reject and statements batch that does not comply with the above xAPI data validation:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actor&#039;&#039;&#039;: this is a mandatory field. Actor objectType attribute must be “Agent” or “Group”&lt;br /&gt;
** &#039;&#039;&#039;agent&#039;&#039;&#039;: agent can be only real moodle users and must be identified by account (user id as name and wwwroot as homepage) or mbox (user email). The other agent identifiers are not supported (mbox_sha1sum and openid).&lt;br /&gt;
** &#039;&#039;&#039;group&#039;&#039;&#039;: all groups must be real moodle groups identified by account (group id as name and wwwroot as homepage). Anonymous groups are not supported.&lt;br /&gt;
* &#039;&#039;&#039;verb&#039;&#039;&#039;: this is a mandatory field. Verb id must be provided in a valid IRI format.&lt;br /&gt;
* &#039;&#039;&#039;object&#039;&#039;&#039;: this is a mandatory field. The objectType attribute can be “Agent”, “Group” ar “Activity”:&lt;br /&gt;
** &#039;&#039;&#039;agent&#039;&#039;&#039; or &#039;&#039;&#039;group&#039;&#039;&#039;: both have the same restrictions as when they act as actors.&lt;br /&gt;
** &#039;&#039;&#039;activity&#039;&#039;&#039;: activity id must be provided as a valid IRI format.&lt;br /&gt;
*** &#039;&#039;&#039;definition&#039;&#039;&#039;: in case a definition is provided, the only accepted interaction types are: choice, fill-in, long-fill-in, true-false, matching, performance, sequencing, likert, numeric, compound and other.&lt;br /&gt;
* &#039;&#039;&#039;result&#039;&#039;&#039;: in case it is provided the duration must be provided in a valid ISO 8601 compatible with the PHP DateInterval class (More info: https://bugs.php.net/bug.php?id=53831).&lt;br /&gt;
** &#039;&#039;&#039;score&#039;&#039;&#039;: all score fields are optional and do not have any particular data validation.&lt;br /&gt;
* &#039;&#039;&#039;context&#039;&#039;&#039;: it has no specific validation.&lt;br /&gt;
* &#039;&#039;&#039;attachments&#039;&#039;&#039;: if present must be an array of elements and every element must have: usageType, display, contentType, a valid usageType IRI, a numeric length and a sha2.&lt;br /&gt;
* &#039;&#039;&#039;authority&#039;&#039;&#039;: must be a valid xAPI actor.&lt;br /&gt;
* &#039;&#039;&#039;timestamp&#039;&#039;&#039;, &#039;&#039;&#039;stored&#039;&#039;&#039; and &#039;&#039;&#039;version&#039;&#039;&#039;: those optional fields are just strings with no particular validation or usage for now.&lt;br /&gt;
&lt;br /&gt;
== Generating statements in PHP ==&lt;br /&gt;
&lt;br /&gt;
The xAPI library provides classes to translate Moodle elements into xAPI structures. Those statements could be sent to JS via the “$PAGE-&amp;gt;requires-&amp;gt;data_for_js” method.&lt;br /&gt;
&lt;br /&gt;
The next example shows how to generate a basic statement:&lt;br /&gt;
&lt;br /&gt;
 use core_xapi\local\statement;&lt;br /&gt;
 use core_xapi\local\statement\item_actor;&lt;br /&gt;
 use core_xapi\local\statement\item_verb;&lt;br /&gt;
 use core_xapi\local\statement\item_activity;&lt;br /&gt;
 &lt;br /&gt;
 (...)&lt;br /&gt;
 // Generate statement.&lt;br /&gt;
 $statement = new statement();&lt;br /&gt;
 $statement-&amp;gt;set_actor(item_agent::create_from_user($USER));&lt;br /&gt;
 $statement-&amp;gt;set_verb(item_verb::create_from_id(&#039;bake&#039;));&lt;br /&gt;
 $statement-&amp;gt;set_object(item_activity::create_from_id(&#039;cake&#039;));&lt;br /&gt;
&lt;br /&gt;
As can be seen in the example, the function item_agent has a static method to generate a valid xAPI actor from a user record. The result object of executing that code will be something like:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;actor&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Agent&amp;quot;,&lt;br /&gt;
        &amp;quot;account&amp;quot;: {&lt;br /&gt;
            &amp;quot;homePage&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;verb&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/verb\/bake&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Activity&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/object\/cake&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
For the object and verbs, xAPI uses a standard IRI format. The xAPI library will convert any string into a valid IRI but it can also use real IRI identifiers to generate standard verbs and object structures.&lt;br /&gt;
&lt;br /&gt;
The next example is more a less the same but using valid IRI values for verbs and objects:&lt;br /&gt;
&lt;br /&gt;
 use core_xapi\local\statement;&lt;br /&gt;
 use core_xapi\local\statement\item_actor;&lt;br /&gt;
 use core_xapi\local\statement\item_verb;&lt;br /&gt;
 use core_xapi\local\statement\item_activity;&lt;br /&gt;
 &lt;br /&gt;
 (...)&lt;br /&gt;
 // Generate statement.&lt;br /&gt;
 $statement = new statement();&lt;br /&gt;
 $statement-&amp;gt;set_actor(item_agent::create_from_user($USER));&lt;br /&gt;
 $statement-&amp;gt;set_verb(item_verb::create_from_id(&#039;http://adlnet.gov/xapi/verbs/bake&#039;));&lt;br /&gt;
 $statement-&amp;gt;set_object(item_activity::create_from_id(&#039;http://adlnet.gov/xapi/activities/cake&#039;));&lt;br /&gt;
&lt;br /&gt;
The resulting structure will be:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;actor&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Agent&amp;quot;,&lt;br /&gt;
        &amp;quot;account&amp;quot;: {&lt;br /&gt;
            &amp;quot;homePage&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;verb&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/adlnet.gov\/xapi\/verbs\/bake&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Activity&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/adlnet.gov\/xapi\/activities\/cake&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The xAPI library also provides classes to convert moodle groups into valid xAPI group actors. To generate one the code is as following:&lt;br /&gt;
&lt;br /&gt;
 use core_xapi\local\statement;&lt;br /&gt;
 use core_xapi\local\statement\item_actor;&lt;br /&gt;
 use core_xapi\local\statement\item_verb;&lt;br /&gt;
 use core_xapi\local\statement\item_activity;&lt;br /&gt;
 &lt;br /&gt;
 (...)&lt;br /&gt;
 // Generate statement.&lt;br /&gt;
 $group = groups_get_group($groupid);&lt;br /&gt;
 $statement = new statement();&lt;br /&gt;
 $statement-&amp;gt;set_actor(item_group::create_from_group($group));&lt;br /&gt;
 $statement-&amp;gt;set_verb(item_verb::create_from_id(&#039;bake&#039;));&lt;br /&gt;
 $statement-&amp;gt;set_object(item_activity::create_from_id(&#039;cake&#039;));&lt;br /&gt;
&lt;br /&gt;
The result will be:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;actor&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Group&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Group A&amp;quot;,&lt;br /&gt;
        &amp;quot;account&amp;quot;: {&lt;br /&gt;
            &amp;quot;homePage&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;verb&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/verb\/bake&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Activity&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/object\/cake&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== xAPI statements attributes implementation ==&lt;br /&gt;
&lt;br /&gt;
All xAPI statement attributes have it’s own implementation in case any plugin needs them. All classes are implemented in the namespace “core_xapi\local\statement”, Those are the classes implemented:&lt;br /&gt;
&lt;br /&gt;
* Item: all xAPI attributes derived from this class. This class provides a method to generate a valid item from a xAPI data structure (create_from_data), implements de json serialization and provides the basic “get_data” method to access the raw element data structure.&lt;br /&gt;
** Item_actor: this is an abstract class extended by both two xAPI valid actors:&lt;br /&gt;
*** Item_agent: an individual user. The class has a static method called “create_from_user” to generate a valid xAPI actor from a moodle user record.&lt;br /&gt;
*** Item_group: a group statement. Moodle xAPI implementation only accepts named groups (it will reject any anonymous group). To generate a valid xAPI group from a moodle group the class has a static method called “create_from_group”. It also provides methods to get all moodle users from that group (get_all_users) and the group record itself (get_group).&lt;br /&gt;
** Item_verb: represents the statement verb. The class has a static method “create_from_id” which accepts both valid IRI values or any random string to create a valid xAPI verb structure. IT algo has a method to get back the verb value (get_id).&lt;br /&gt;
** Item_object: this is an abstract class extended by all possible xAPI valid objects:&lt;br /&gt;
*** Item_agent or Item_group: both can be statements actor or objects as well&lt;br /&gt;
*** Item_activity: activity can be any kind of string value which the plugin decides. It has the same methods as item_verb to create and get this value (“create_from_id” and “get_id”). The xAPI activity could have also an atribute called “definition” that contains a SCORM like data defining the user interaction.&lt;br /&gt;
**** Item_definition: contains all the specific interaction details such as the interaction type (in SCORM format), the user answer or the correct answer pattern.&lt;br /&gt;
** Item_result: this optional attribute represents any kind of results and score derived from the user interaction. IT has no strict data validation and it has to be created directly from a valid xAPI data structure using the method “create_from_data”. It provides two methods to get the result score if present (get_score) and one to convert the result duration into seconds (get_duration). It uses also one subclass to handle score:&lt;br /&gt;
** Item_score: the class representing the xAPI score data. It has no validation and no specific methods.&lt;br /&gt;
** Item_context:  the class representing the xAPI context data. It has no validation and no specific methods.&lt;br /&gt;
** Item_attachment: validate the xAPI attachment structure&lt;br /&gt;
&lt;br /&gt;
== Adapting a plugin to use xAPI functions ==&lt;br /&gt;
&lt;br /&gt;
All the plugins could use the new xAPI functionalities to send xAPI statements, interact with them, trigger events and generate log store entries.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: program a xapi handle class ===&lt;br /&gt;
&lt;br /&gt;
Implement a class “\PLUGINNAME\classes\xapi\handler” which extends “\core_xapi\handler” and override this methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;statement_to_event (statement $statement): core\event\base&#039;&#039;&#039;: to convert a statement into a valid Moodle event&lt;br /&gt;
* In case that the plugin wants to accept also Group statements (by default any Group statement will be rejected) it can override the method supports_group_actors(): bool&lt;br /&gt;
&lt;br /&gt;
=== Step 2: code events ===&lt;br /&gt;
&lt;br /&gt;
All xAPI statements MUST be converted into a valid Moodle event. To do so the plugin needs to &#039;&#039;&#039;code all the necessary events&#039;&#039;&#039; for this.&lt;br /&gt;
&lt;br /&gt;
== Useful methods to handle xAPI statements inside plugins ==&lt;br /&gt;
&lt;br /&gt;
The core_xapi\local\statement provides several methods to extract information from a statement object.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;get_user (): stdClass&#039;&#039;&#039;&lt;br /&gt;
** Return the Moodle user represented by the statement actor. In the case of a group actor, this function will throw an xapi_exception.&lt;br /&gt;
* &#039;&#039;&#039;get_all_users(): array&#039;&#039;&#039;&lt;br /&gt;
** Will return an array with all Moodle users represented in the xAPI actor object. This can be used in both single agent and group statements.&lt;br /&gt;
* &#039;&#039;&#039;get_group(): stdClass&#039;&#039;&#039;&lt;br /&gt;
** Return the Moodle group record represented in the xAPI actor. In the case of a single agent actor, this function will throw an xapi_exception.&lt;br /&gt;
* &#039;&#039;&#039;get_verb_id (): string&#039;&#039;&#039;&lt;br /&gt;
** Return the current verb ID value from a statement.&lt;br /&gt;
* &#039;&#039;&#039;get_activity_id(): string&#039;&#039;&#039;&lt;br /&gt;
** Return the current activity ID. If the statement object is not an activity (could be also an agent or a group) the method will throw an xapi_exception.&lt;br /&gt;
* &#039;&#039;&#039;minify (): ?array&#039;&#039;&#039;&lt;br /&gt;
** Return a minified version of the statement suitable for using as a “other” field of a Moodle event.&lt;br /&gt;
* &#039;&#039;&#039;get_actor(): item_actor&#039;&#039;&#039;&lt;br /&gt;
** Return the statement actor.&lt;br /&gt;
* &#039;&#039;&#039;get_verb(): item_verb&#039;&#039;&#039;&lt;br /&gt;
** Return the statement verb.&lt;br /&gt;
* &#039;&#039;&#039;get_object(): item_object&#039;&#039;&#039;&lt;br /&gt;
** Return the statement object. &lt;br /&gt;
* &#039;&#039;&#039;get_context(): item_context&#039;&#039;&#039;&lt;br /&gt;
** Return the statement context attribute.&lt;br /&gt;
* &#039;&#039;&#039;get_result(): item_result&#039;&#039;&#039;&lt;br /&gt;
** Return the statement result attribute.&lt;br /&gt;
* &#039;&#039;&#039;get_timestamp(): string&#039;&#039;&#039;&lt;br /&gt;
** Return the statement timestamp attribute.&lt;br /&gt;
* &#039;&#039;&#039;get_stored(): string&#039;&#039;&#039;&lt;br /&gt;
** Return the statement stored attribute.&lt;br /&gt;
* &#039;&#039;&#039;get_authority(): item_actor&#039;&#039;&#039;&lt;br /&gt;
** Return the statement authority attribute.&lt;br /&gt;
* &#039;&#039;&#039;get_version(): string&#039;&#039;&#039;&lt;br /&gt;
** Return the statement version attribute.&lt;br /&gt;
* &#039;&#039;&#039;get_attachments(): item_attachment&#039;&#039;&#039;&lt;br /&gt;
** Return the statement attachments attribute.&lt;br /&gt;
&lt;br /&gt;
== Using Ajax lib to send a statement to Moodle ==&lt;br /&gt;
&lt;br /&gt;
The webservices have a different behaviour depending if it is processing a single statement or an array of them.&lt;br /&gt;
&lt;br /&gt;
This code could be an example of a single xAPI statement post JS code:&lt;br /&gt;
&lt;br /&gt;
 require([&#039;core/ajax&#039;], function(ajax) {&lt;br /&gt;
    var data = {&lt;br /&gt;
        component: &#039;mod_h5p&#039;,&lt;br /&gt;
        requestjson: JSON.stringify(statement)&lt;br /&gt;
    };&lt;br /&gt;
    var promises = ajax.call([&lt;br /&gt;
       {&lt;br /&gt;
           methodname: &#039;core_xapi_statement_post&#039;,&lt;br /&gt;
           args: data&lt;br /&gt;
       }&lt;br /&gt;
    ]);&lt;br /&gt;
    promises[0].done(function(response) {&lt;br /&gt;
       // Put some success messages...&lt;br /&gt;
    }).fail(function(ex) {&lt;br /&gt;
       // Do some failure message handling...&lt;br /&gt;
    });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you send more than one statement, the webservice will return an array of booleans indicating which statements are successfully stored and which not. Only in the case of none of the statements could be processed (usually because of an invalid statement structure) the webservice will return an error.&lt;br /&gt;
&lt;br /&gt;
This could be an example of sending more than one statement to Moodle:&lt;br /&gt;
&lt;br /&gt;
 require([&#039;core/ajax&#039;], function(ajax) {&lt;br /&gt;
    var data = {&lt;br /&gt;
        component: &#039;mod_h5p&#039;,&lt;br /&gt;
        requestjson: JSON.stringify(statements)&lt;br /&gt;
    };&lt;br /&gt;
    var promises = ajax.call([&lt;br /&gt;
        {&lt;br /&gt;
            methodname: &#039;core_xapi_statement_post&#039;,&lt;br /&gt;
            args: data&lt;br /&gt;
        }&lt;br /&gt;
    ]);&lt;br /&gt;
    promises[0].done(function(response) {&lt;br /&gt;
        // Check if it&#039;s a success or not.&lt;br /&gt;
        for (var i = 0; i &amp;lt; response.length; i++) {&lt;br /&gt;
            if (response[i]) {&lt;br /&gt;
               // Do some success handling.&lt;br /&gt;
            } else {&lt;br /&gt;
               // Do some failure handling.&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }).fail(function(ex) {&lt;br /&gt;
        // None of the statements are processed.&lt;br /&gt;
    });&lt;br /&gt;
 });&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Experience_API_(xAPI)&amp;diff=57551</id>
		<title>Experience API (xAPI)</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Experience_API_(xAPI)&amp;diff=57551"/>
		<updated>2020-05-28T15:50:09Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: Created page with &amp;quot;== Heading text ==  This document contains a technical explanation on how the xAPI Moodle integration library works. The main purpose of this document is to keep the dev docum...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Heading text ==&lt;br /&gt;
&lt;br /&gt;
This document contains a technical explanation on how the xAPI Moodle integration library works. The main purpose of this document is to keep the dev documentation while the oficial Dev Wiki page is not yet created.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Experience API (xAPI)&#039;&#039;&#039; is an e-learning software specification that allows learning content and learning systems to speak to each other in a manner that records and tracks all types of learning experiences.&lt;br /&gt;
&lt;br /&gt;
xAPI defines web services that can be used by any plugin or APP to connect to the LMS in a standard way. The main actors in xAPI communication are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Client&#039;&#039;&#039;: any plugin or APP that wants to use xAPI webservices&lt;br /&gt;
* &#039;&#039;&#039;xAPI LRS&#039;&#039;&#039; (server site): responsible for storing and serve the data emitted by the clients&lt;br /&gt;
&lt;br /&gt;
One good aspect about xAPI is that the amount of messages that can be shared between the clients and the LRS is quite limited. The main message type is called &#039;&#039;&#039;Statement&#039;&#039;&#039; and all statements can be summarized as “&#039;&#039;An actor XX executes action YY on object ZZ&#039;&#039;”.&lt;br /&gt;
&lt;br /&gt;
The typical statement object is a JSON element containing:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Actor&#039;&#039;&#039;: the person or group that do something&lt;br /&gt;
* &#039;&#039;&#039;Verb&#039;&#039;&#039;: the action the Actor do&lt;br /&gt;
* &#039;&#039;&#039;Object&#039;&#039;&#039;: the object on the Verb is executed. There are more than one type of objects that can be defined here but, for now, you can think about it as a specific “Quiz Attempt” for example.&lt;br /&gt;
* Other fields: for now, the rest of xAPI fields have a basic data validation so every plugin is responsible for implementing it’s own checks if they need them.&lt;br /&gt;
The xAPI specification can be consulted in the xAPI specs page: [https://github.com/adlnet/xAPI-Spec].&lt;br /&gt;
&lt;br /&gt;
== Moodle xAPI functionalities ==&lt;br /&gt;
&lt;br /&gt;
The final objective of Moodle xAPI library is NOT to implement a full LRS inside Moodle but to provide an easy way to handle xAPI statements within any plugin that needs it.&lt;br /&gt;
&lt;br /&gt;
For now Moodle will focus on supporting the main xAPI request which is called “&#039;&#039;&#039;statement&#039;&#039;&#039;”. A statement must be seen as a tracking message that can be used by any plugin to store user activity directly to the Moodle without programming any additional web service.&lt;br /&gt;
&lt;br /&gt;
The current library implements:&lt;br /&gt;
&lt;br /&gt;
* A new webservice called &#039;&#039;&#039;core_xapi_statement_post&#039;&#039;&#039; to process xAPI statements and generate standard Moodle events.&lt;br /&gt;
* A class &#039;&#039;&#039;\core_xapi\handler&#039;&#039;&#039; that any plugin can extend in order to user xAPI and generate specific plugin contexts. This way any plugin could use xAPI without implementing any new web service.&lt;br /&gt;
* A class &#039;&#039;&#039;\core_xapi\iri&#039;&#039;&#039; to easily translate random information into valid IRI values (needed for xAPI objects and verbs)&lt;br /&gt;
* A class &#039;&#039;&#039;\core_xapi\local\statement&#039;&#039;&#039; to create and extract information from statement data.&lt;br /&gt;
* A bunch of predefined classes in &#039;&#039;&#039;\core_xapi\local\statement\item_XXX&#039;&#039;&#039; to generate xAPI statement items from the plugins (exemple provided in “Generating statements in PHP”).&lt;br /&gt;
&lt;br /&gt;
== Statement processing ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;core_xapi_statement_post&#039;&#039;&#039; webservice receives a JSON encoded statement (could be an array or a single one) and a component frankenstyle name.&lt;br /&gt;
&lt;br /&gt;
The processing sequence is:&lt;br /&gt;
# The core xAPI library checks if the specified component has a xAPI handling class implementation. Otherwise it returns an error.&lt;br /&gt;
# xAPI checks the statement structure, if any check fails, it returns an error. The main validations for now are:&lt;br /&gt;
## Check that only supported xAPI attributes are used. If the statement array has some format error all statements will be rejected (see “Statement data validation” for more information).&lt;br /&gt;
## Check all users and groups are created in the LMS&lt;br /&gt;
## Check the current user ($USER) is an actor of the statement (actors can be a single agent or a group)&lt;br /&gt;
# For every statement:&lt;br /&gt;
## xAPI asks the component handler to convert the statement into a standard event (function statement_to_event). In case the plugin could not convert some statement into an event, this statement will be marked as “not processed” and will continue to the next statement.&lt;br /&gt;
## xAPI triggers the generated events&lt;br /&gt;
# Once all statements are processed:&lt;br /&gt;
## If ALL statements are marked as “not processed” it returns an error.&lt;br /&gt;
## If some statement could be processed, returns an array containing “true” if the statement is processed and “false” otherwise.&lt;br /&gt;
&lt;br /&gt;
Note that the plugin “statement_to_event” is responsible for:&lt;br /&gt;
* Grant that the specified user has permission to execute that statement.&lt;br /&gt;
* Provide a valid Moodle event to trigger&lt;br /&gt;
* Process any result attached to the statement&lt;br /&gt;
&lt;br /&gt;
== Statement data validation ==&lt;br /&gt;
&lt;br /&gt;
The core_xapi_statement_post webservice will reject and statements batch that does not comply with the above xAPI data validation:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;actor&#039;&#039;&#039;: this is a mandatory field. Actor objectType attribute must be “Agent” or “Group”&lt;br /&gt;
** &#039;&#039;&#039;agent&#039;&#039;&#039;: agent can be only real moodle users and must be identified by account (user id as name and wwwroot as homepage) or mbox (user email). The other agent identifiers are not supported (mbox_sha1sum and openid).&lt;br /&gt;
** &#039;&#039;&#039;group&#039;&#039;&#039;: all groups must be real moodle groups identified by account (group id as name and wwwroot as homepage). Anonymous groups are not supported.&lt;br /&gt;
* &#039;&#039;&#039;verb&#039;&#039;&#039;: this is a mandatory field. Verb id must be provided in a valid IRI format.&lt;br /&gt;
* &#039;&#039;&#039;object&#039;&#039;&#039;: this is a mandatory field. The objectType attribute can be “Agent”, “Group” ar “Activity”:&lt;br /&gt;
** &#039;&#039;&#039;agent&#039;&#039;&#039; or &#039;&#039;&#039;group&#039;&#039;&#039;: both have the same restrictions as when they act as actors.&lt;br /&gt;
** &#039;&#039;&#039;activity&#039;&#039;&#039;: activity id must be provided as a valid IRI format.&lt;br /&gt;
*** &#039;&#039;&#039;definition&#039;&#039;&#039;: in case a definition is provided, the only accepted interaction types are: choice, fill-in, long-fill-in, true-false, matching, performance, sequencing, likert, numeric, compound and other.&lt;br /&gt;
* &#039;&#039;&#039;result&#039;&#039;&#039;: in case it is provided the duration must be provided in a valid ISO 8601 compatible with the PHP DateInterval class (More info: https://bugs.php.net/bug.php?id=53831).&lt;br /&gt;
** &#039;&#039;&#039;score&#039;&#039;&#039;: all score fields are optional and do not have any particular data validation.&lt;br /&gt;
* &#039;&#039;&#039;context&#039;&#039;&#039;: it has no specific validation.&lt;br /&gt;
* &#039;&#039;&#039;attachments&#039;&#039;&#039;: if present must be an array of elements and every element must have: usageType, display, contentType, a valid usageType IRI, a numeric length and a sha2.&lt;br /&gt;
* &#039;&#039;&#039;authority&#039;&#039;&#039;: must be a valid xAPI actor.&lt;br /&gt;
* &#039;&#039;&#039;timestamp&#039;&#039;&#039;, &#039;&#039;&#039;stored&#039;&#039;&#039; and &#039;&#039;&#039;version&#039;&#039;&#039;: those optional fields are just strings with no particular validation or usage for now.&lt;br /&gt;
&lt;br /&gt;
== Generating statements in PHP ==&lt;br /&gt;
&lt;br /&gt;
The xAPI library provides classes to translate Moodle elements into xAPI structures. Those statements could be sent to JS via the “$PAGE-&amp;gt;requires-&amp;gt;data_for_js” method.&lt;br /&gt;
&lt;br /&gt;
The next example shows how to generate a basic statement:&lt;br /&gt;
&lt;br /&gt;
 use core_xapi\local\statement;&lt;br /&gt;
 use core_xapi\local\statement\item_actor;&lt;br /&gt;
 use core_xapi\local\statement\item_verb;&lt;br /&gt;
 use core_xapi\local\statement\item_activity;&lt;br /&gt;
 &lt;br /&gt;
 (...)&lt;br /&gt;
 // Generate statement.&lt;br /&gt;
 $statement = new statement();&lt;br /&gt;
 $statement-&amp;gt;set_actor(item_agent::create_from_user($USER));&lt;br /&gt;
 $statement-&amp;gt;set_verb(item_verb::create_from_id(&#039;bake&#039;));&lt;br /&gt;
 $statement-&amp;gt;set_object(item_activity::create_from_id(&#039;cake&#039;));&lt;br /&gt;
&lt;br /&gt;
As can be seen in the example, the function item_agent has a static method to generate a valid xAPI actor from a user record. The result object of executing that code will be something like:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;actor&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Agent&amp;quot;,&lt;br /&gt;
        &amp;quot;account&amp;quot;: {&lt;br /&gt;
            &amp;quot;homePage&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;verb&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/verb\/bake&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Activity&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/object\/cake&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
For the object and verbs, xAPI uses a standard IRI format. The xAPI library will convert any string into a valid IRI but it can also use real IRI identifiers to generate standard verbs and object structures.&lt;br /&gt;
&lt;br /&gt;
The next example is more a less the same but using valid IRI values for verbs and objects:&lt;br /&gt;
&lt;br /&gt;
 use core_xapi\local\statement;&lt;br /&gt;
 use core_xapi\local\statement\item_actor;&lt;br /&gt;
 use core_xapi\local\statement\item_verb;&lt;br /&gt;
 use core_xapi\local\statement\item_activity;&lt;br /&gt;
 &lt;br /&gt;
 (...)&lt;br /&gt;
 // Generate statement.&lt;br /&gt;
 $statement = new statement();&lt;br /&gt;
 $statement-&amp;gt;set_actor(item_agent::create_from_user($USER));&lt;br /&gt;
 $statement-&amp;gt;set_verb(item_verb::create_from_id(&#039;http://adlnet.gov/xapi/verbs/bake&#039;));&lt;br /&gt;
 $statement-&amp;gt;set_object(item_activity::create_from_id(&#039;http://adlnet.gov/xapi/activities/cake&#039;));&lt;br /&gt;
&lt;br /&gt;
The resulting structure will be:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;actor&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Agent&amp;quot;,&lt;br /&gt;
        &amp;quot;account&amp;quot;: {&lt;br /&gt;
            &amp;quot;homePage&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;2&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;verb&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/adlnet.gov\/xapi\/verbs\/bake&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Activity&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/adlnet.gov\/xapi\/activities\/cake&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The xAPI library also provides classes to convert moodle groups into valid xAPI group actors. To generate one the code is as following:&lt;br /&gt;
&lt;br /&gt;
 use core_xapi\local\statement;&lt;br /&gt;
 use core_xapi\local\statement\item_actor;&lt;br /&gt;
 use core_xapi\local\statement\item_verb;&lt;br /&gt;
 use core_xapi\local\statement\item_activity;&lt;br /&gt;
 &lt;br /&gt;
 (...)&lt;br /&gt;
 // Generate statement.&lt;br /&gt;
 $group = groups_get_group($groupid);&lt;br /&gt;
 $statement = new statement();&lt;br /&gt;
 $statement-&amp;gt;set_actor(item_group::create_from_group($group));&lt;br /&gt;
 $statement-&amp;gt;set_verb(item_verb::create_from_id(&#039;bake&#039;));&lt;br /&gt;
 $statement-&amp;gt;set_object(item_activity::create_from_id(&#039;cake&#039;));&lt;br /&gt;
&lt;br /&gt;
The result will be:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;actor&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Group&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Group A&amp;quot;,&lt;br /&gt;
        &amp;quot;account&amp;quot;: {&lt;br /&gt;
            &amp;quot;homePage&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P&amp;quot;,&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;verb&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/verb\/bake&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;object&amp;quot;: {&lt;br /&gt;
        &amp;quot;objectType&amp;quot;: &amp;quot;Activity&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;http:\/\/localhost\/m\/H5P\/xapi\/object\/cake&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== xAPI statements attributes implementation ==&lt;br /&gt;
&lt;br /&gt;
All xAPI statement attributes have it’s own implementation in case any plugin needs them. All classes are implemented in the namespace “core_xapi\local\statement”, Those are the classes implemented:&lt;br /&gt;
&lt;br /&gt;
* Item: all xAPI attributes derived from this class. This class provides a method to generate a valid item from a xAPI data structure (create_from_data), implements de json serialization and provides the basic “get_data” method to access the raw element data structure.&lt;br /&gt;
** Item_actor: this is an abstract class extended by both two xAPI valid actors:&lt;br /&gt;
*** Item_agent: an individual user. The class has a static method called “create_from_user” to generate a valid xAPI actor from a moodle user record.&lt;br /&gt;
*** Item_group: a group statement. Moodle xAPI implementation only accepts named groups (it will reject any anonymous group). To generate a valid xAPI group from a moodle group the class has a static method called “create_from_group”. It also provides methods to get all moodle users from that group (get_all_users) and the group record itself (get_group).&lt;br /&gt;
** Item_verb: represents the statement verb. The class has a static method “create_from_id” which accepts both valid IRI values or any random string to create a valid xAPI verb structure. IT algo has a method to get back the verb value (get_id).&lt;br /&gt;
** Item_object: this is an abstract class extended by all possible xAPI valid objects:&lt;br /&gt;
*** Item_agent or Item_group: both can be statements actor or objects as well&lt;br /&gt;
*** Item_activity: activity can be any kind of string value which the plugin decides. It has the same methods as item_verb to create and get this value (“create_from_id” and “get_id”). The xAPI activity could have also an atribute called “definition” that contains a SCORM like data defining the user interaction.&lt;br /&gt;
**** Item_definition: contains all the specific interaction details such as the interaction type (in SCORM format), the user answer or the correct answer pattern.&lt;br /&gt;
** Item_result: this optional attribute represents any kind of results and score derived from the user interaction. IT has no strict data validation and it has to be created directly from a valid xAPI data structure using the method “create_from_data”. It provides two methods to get the result score if present (get_score) and one to convert the result duration into seconds (get_duration). It uses also one subclass to handle score:&lt;br /&gt;
** Item_score: the class representing the xAPI score data. It has no validation and no specific methods.&lt;br /&gt;
** Item_context:  the class representing the xAPI context data. It has no validation and no specific methods.&lt;br /&gt;
** Item_attachment: validate the xAPI attachment structure&lt;br /&gt;
&lt;br /&gt;
== Adapting a plugin to use xAPI functions ==&lt;br /&gt;
&lt;br /&gt;
All the plugins could use the new xAPI functionalities to send xAPI statements, interact with them, trigger events and generate log store entries.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: program a xapi handle class ===&lt;br /&gt;
&lt;br /&gt;
Implement a class “\PLUGINNAME\classes\xapi\handler” which extends “\core_xapi\handler” and override this methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;statement_to_event (statement $statement): core\event\base&#039;&#039;&#039;: to convert a statement into a valid Moodle event&lt;br /&gt;
* In case that the plugin wants to accept also Group statements (by default any Group statement will be rejected) it can override the method supports_group_actors(): bool&lt;br /&gt;
&lt;br /&gt;
=== Step 2: code events ===&lt;br /&gt;
&lt;br /&gt;
All xAPI statements MUST be converted into a valid Moodle event. To do so the plugin needs to &#039;&#039;&#039;code all the necessary events&#039;&#039;&#039; for this.&lt;br /&gt;
&lt;br /&gt;
== Useful methods to handle xAPI statements inside plugins ==&lt;br /&gt;
&lt;br /&gt;
The core_xapi\local\statement provides several methods to extract information from a statement object.&lt;br /&gt;
&lt;br /&gt;
* get_user (): stdClass&lt;br /&gt;
** Return the Moodle user represented by the statement actor. In the case of a group actor, this function will throw an xapi_exception.&lt;br /&gt;
* get_all_users(): array&lt;br /&gt;
** Will return an array with all Moodle users represented in the xAPI actor object. This can be used in both single agent and group statements.&lt;br /&gt;
* get_group(): stdClass&lt;br /&gt;
** Return the Moodle group record represented in the xAPI actor. In the case of a single agent actor, this function will throw an xapi_exception.&lt;br /&gt;
* get_verb_id (): string&lt;br /&gt;
** Return the current verb ID value from a statement.&lt;br /&gt;
* get_activity_id(): string&lt;br /&gt;
** Return the current activity ID. If the statement object is not an activity (could be also an agent or a group) the method will throw an xapi_exception.&lt;br /&gt;
* minify (): ?array&lt;br /&gt;
** Return a minified version of the statement suitable for using as a “other” field of a Moodle event.&lt;br /&gt;
* get_actor(): item_actor&lt;br /&gt;
** Return the statement actor.&lt;br /&gt;
* get_verb(): item_verb&lt;br /&gt;
** Return the statement verb.&lt;br /&gt;
* get_object(): item_object&lt;br /&gt;
** Return the statement object. &lt;br /&gt;
* get_context(): item_context&lt;br /&gt;
** Return the statement context attribute.&lt;br /&gt;
* get_result(): item_result&lt;br /&gt;
** Return the statement result attribute.&lt;br /&gt;
* get_timestamp(): string&lt;br /&gt;
** Return the statement timestamp attribute.&lt;br /&gt;
* get_stored(): string&lt;br /&gt;
** Return the statement stored attribute.&lt;br /&gt;
* get_authority(): item_actor&lt;br /&gt;
** Return the statement authority attribute.&lt;br /&gt;
* get_version(): string&lt;br /&gt;
** Return the statement version attribute.&lt;br /&gt;
* get_attachments(): item_attachment&lt;br /&gt;
** Return the statement attachments attribute.&lt;br /&gt;
&lt;br /&gt;
== Using Ajax lib to send a statement to Moodle ==&lt;br /&gt;
&lt;br /&gt;
The webservices have a different behaviour depending if it is processing a single statement or an array of them.&lt;br /&gt;
&lt;br /&gt;
This code could be an example of a single xAPI statement post JS code:&lt;br /&gt;
&lt;br /&gt;
 require([&#039;core/ajax&#039;], function(ajax) {&lt;br /&gt;
    var data = {&lt;br /&gt;
        component: &#039;mod_h5p&#039;,&lt;br /&gt;
        requestjson: JSON.stringify(statement)&lt;br /&gt;
    };&lt;br /&gt;
    var promises = ajax.call([&lt;br /&gt;
       {&lt;br /&gt;
           methodname: &#039;core_xapi_statement_post&#039;,&lt;br /&gt;
           args: data&lt;br /&gt;
       }&lt;br /&gt;
    ]);&lt;br /&gt;
    promises[0].done(function(response) {&lt;br /&gt;
       // Put some success messages...&lt;br /&gt;
    }).fail(function(ex) {&lt;br /&gt;
       // Do some failure message handling...&lt;br /&gt;
    });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you send more than one statement, the webservice will return an array of booleans indicating which statements are successfully stored and which not. Only in the case of none of the statements could be processed (usually because of an invalid statement structure) the webservice will return an error.&lt;br /&gt;
&lt;br /&gt;
This could be an example of sending more than one statement to Moodle:&lt;br /&gt;
&lt;br /&gt;
 require([&#039;core/ajax&#039;], function(ajax) {&lt;br /&gt;
    var data = {&lt;br /&gt;
        component: &#039;mod_h5p&#039;,&lt;br /&gt;
        requestjson: JSON.stringify(statements)&lt;br /&gt;
    };&lt;br /&gt;
    var promises = ajax.call([&lt;br /&gt;
        {&lt;br /&gt;
            methodname: &#039;core_xapi_statement_post&#039;,&lt;br /&gt;
            args: data&lt;br /&gt;
        }&lt;br /&gt;
    ]);&lt;br /&gt;
    promises[0].done(function(response) {&lt;br /&gt;
        // Check if it&#039;s a success or not.&lt;br /&gt;
        for (var i = 0; i &amp;lt; response.length; i++) {&lt;br /&gt;
            if (response[i]) {&lt;br /&gt;
               // Do some success handling.&lt;br /&gt;
            } else {&lt;br /&gt;
               // Do some failure handling.&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }).fail(function(ex) {&lt;br /&gt;
        // None of the statements are processed.&lt;br /&gt;
    });&lt;br /&gt;
 });&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Core_APIs&amp;diff=57550</id>
		<title>Core APIs</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Core_APIs&amp;diff=57550"/>
		<updated>2020-05-28T15:24:51Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Other General APIs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Moodle has a number of core APIs that provide tools for Moodle scripts.&lt;br /&gt;
&lt;br /&gt;
They are essential when writing [[Plugins|Moodle plugins]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Most-used General APIs==&lt;br /&gt;
&lt;br /&gt;
These APIs are critical and will be used by nearly every Moodle plugin.&lt;br /&gt;
&lt;br /&gt;
=== Access API (access) ===&lt;br /&gt;
&lt;br /&gt;
The [[Access API]] gives you functions so you can determine what the current user is allowed to do, and it allows modules to extend Moodle with new capabilities.&lt;br /&gt;
&lt;br /&gt;
=== Data manipulation API (dml) ===&lt;br /&gt;
&lt;br /&gt;
The [[Data manipulation API]] allows you to read/write to databases in a consistent and safe way.&lt;br /&gt;
&lt;br /&gt;
=== File API (files) ===&lt;br /&gt;
&lt;br /&gt;
The [[File API]] controls the storage of files in connection to various plugins.&lt;br /&gt;
&lt;br /&gt;
=== Form API (form) ===&lt;br /&gt;
&lt;br /&gt;
The [[Form API]] defines and handles user data via web forms.&lt;br /&gt;
&lt;br /&gt;
=== Logging API (log) ===&lt;br /&gt;
&lt;br /&gt;
The [[Events API]] allows you to log events in Moodle, while [[Logging 2]] describes how logs are stored and retrieved.&lt;br /&gt;
&lt;br /&gt;
=== Navigation API (navigation) ===&lt;br /&gt;
&lt;br /&gt;
The [[Navigation API]] allows you to manipulate the navigation tree to add and remove items as you wish.&lt;br /&gt;
&lt;br /&gt;
=== Page API (page) ===&lt;br /&gt;
&lt;br /&gt;
The [[Page API]] is used to set up the current page, add JavaScript, and configure how things will be displayed to the user.&lt;br /&gt;
&lt;br /&gt;
=== Output API (output) ===&lt;br /&gt;
&lt;br /&gt;
The [[Output API]] is used to render the HTML for all parts of the page.&lt;br /&gt;
&lt;br /&gt;
=== String API (string) ===&lt;br /&gt;
&lt;br /&gt;
The [[String API]] is how you get language text strings to use in the user interface.   It handles any language translations that might be available.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade API (upgrade) ===&lt;br /&gt;
&lt;br /&gt;
The [[Upgrade API]] is how your module installs and upgrades itself, by keeping track of its own version.&lt;br /&gt;
&lt;br /&gt;
=== Moodlelib API (core) ===&lt;br /&gt;
&lt;br /&gt;
The [[Moodlelib API]] is the central library file of miscellaneous general-purpose Moodle functions. Functions can over the handling of request parameters, configs, user preferences, time, login, mnet, plugins, strings and others. There are plenty of defined constants too.&lt;br /&gt;
&lt;br /&gt;
==Other General APIs==&lt;br /&gt;
&lt;br /&gt;
=== Admin settings (admin) ===&lt;br /&gt;
&lt;br /&gt;
The [[Admin settings]] API deals with providing configuration options for each plugin and Moodle core.&lt;br /&gt;
&lt;br /&gt;
=== Analytics API (analytics) ===&lt;br /&gt;
&lt;br /&gt;
The [[Analytics API]] allow you to create prediction models and generate insights.&lt;br /&gt;
&lt;br /&gt;
=== Availability (availability) ===&lt;br /&gt;
&lt;br /&gt;
The [[Availability API]] controls access to activities and sections.&lt;br /&gt;
&lt;br /&gt;
=== Backup API (backup) ===&lt;br /&gt;
&lt;br /&gt;
The [[Backup API]] defines exactly how to convert course data into XML for backup purposes, and the [[Restore API]] describes how to convert it back the other way.&lt;br /&gt;
&lt;br /&gt;
=== Cache API (cache) ===&lt;br /&gt;
&lt;br /&gt;
The [[The Moodle Universal Cache (MUC)]] is the structure for storing cache data within Moodle. [[Cache_API]] explains some of what is needed to use a cache in your code.&lt;br /&gt;
&lt;br /&gt;
=== Calendar API (calendar) ===&lt;br /&gt;
&lt;br /&gt;
The [[Calendar API]] allows you to add and modify events in the calendar for user, groups, courses, or the whole site.&lt;br /&gt;
&lt;br /&gt;
=== Check API (check) ===&lt;br /&gt;
&lt;br /&gt;
WIP The [[Check API]] allows you to add security, performance or health checks to your site.&lt;br /&gt;
&lt;br /&gt;
=== Comment API (comment) ===&lt;br /&gt;
&lt;br /&gt;
The [[Comment API]] allows you to save and retrieve user comments, so that you can easily add commenting to any of your code.&lt;br /&gt;
&lt;br /&gt;
=== Competency API (competency) ===&lt;br /&gt;
&lt;br /&gt;
The [[Competency API]] allows you to list and add evidence of competencies to learning plans, learning plan templates, frameworks, courses and activities.&lt;br /&gt;
&lt;br /&gt;
=== Data definition API (ddl) ===&lt;br /&gt;
&lt;br /&gt;
The [[Data definition API]] is what you use to create, change and delete tables and fields in the database during upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Editor API ===&lt;br /&gt;
&lt;br /&gt;
The [[Editor API]] is used to control HTML text editors.&lt;br /&gt;
&lt;br /&gt;
=== Enrolment API (enrol) ===&lt;br /&gt;
&lt;br /&gt;
The [[Enrolment API]] deals with course participants.&lt;br /&gt;
&lt;br /&gt;
=== Events API (event) ===&lt;br /&gt;
&lt;br /&gt;
The [[Events API]] allows to define &amp;quot;events&amp;quot; with payload data to be fired whenever you like, and it also allows you to define handlers to react to these events when they happen.  This is the recommended form of inter-plugin communication. This also forms the basis for logging in Moodle.&lt;br /&gt;
&lt;br /&gt;
=== Experience API (xAPI) ===&lt;br /&gt;
&lt;br /&gt;
The Experience API (xAPI) is an e-learning standard that allows learning content and learning systems to speak to each other. The [[Experience API (xAPI)]]&lt;br /&gt;
allows any plugin to generate and handle xAPI standard statements.&lt;br /&gt;
&lt;br /&gt;
=== External functions API (external) ===&lt;br /&gt;
&lt;br /&gt;
The [[External functions API]] allows you to create fully parametrised methods that can be accessed by external programs (such as [[Web services]]).&lt;br /&gt;
&lt;br /&gt;
=== Favourites API ===&lt;br /&gt;
&lt;br /&gt;
The [[Favourites API]] allows you to mark items as favourites for a user and manage these favourites. This is often referred to as &#039;Starred&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Lock API (lock) ===&lt;br /&gt;
&lt;br /&gt;
The [[Lock API]] lets you synchronise processing between multiple requests, even for separate nodes in a cluster.&lt;br /&gt;
&lt;br /&gt;
=== Message API (message) ===&lt;br /&gt;
&lt;br /&gt;
The [[Message API]] lets you post messages to users.  They decide how they want to receive them.&lt;br /&gt;
&lt;br /&gt;
=== Media API (media) ===&lt;br /&gt;
&lt;br /&gt;
The [[Media_players#Using_media_players|Media]] API can be used to embed media items such as audio, video, and Flash.&lt;br /&gt;
&lt;br /&gt;
=== My profile API ===&lt;br /&gt;
&lt;br /&gt;
The [[My profile API]] is used to add things to the profile page.&lt;br /&gt;
&lt;br /&gt;
=== OAuth 2 API (oauth2) ===&lt;br /&gt;
&lt;br /&gt;
The [[OAuth 2 API]] is used to provide a common place to configure and manage external systems using OAuth 2.&lt;br /&gt;
&lt;br /&gt;
=== Preference API (preference) ===&lt;br /&gt;
&lt;br /&gt;
The [[Preference API]] is a simple way to store and retrieve preferences for individual users.&lt;br /&gt;
&lt;br /&gt;
=== Portfolio API (portfolio) ===&lt;br /&gt;
&lt;br /&gt;
The [[Portfolio API]] allows you to add portfolio interfaces on your pages and allows users to package up data to send to their portfolios.&lt;br /&gt;
&lt;br /&gt;
=== Privacy API (privacy) ===&lt;br /&gt;
&lt;br /&gt;
The [[Privacy API]] allows you to describe the personal data that you store, and provides the means for that data to be discovered, exported, and deleted on a per-user basis.&lt;br /&gt;
This allows compliance with regulation such as the General Data Protection Regulation (GDPR) in Europe.&lt;br /&gt;
&lt;br /&gt;
=== Rating API (rating) ===&lt;br /&gt;
&lt;br /&gt;
The [[Rating API]] lets you create AJAX rating interfaces so that users can rate items in your plugin.  In an activity module, you may choose to aggregate ratings to form grades.&lt;br /&gt;
&lt;br /&gt;
=== RSS API (rss) ===&lt;br /&gt;
&lt;br /&gt;
The [[RSS API]] allows you to create secure RSS feeds of data in your module.&lt;br /&gt;
&lt;br /&gt;
=== Search API (search) ===&lt;br /&gt;
&lt;br /&gt;
The [[Search API]] allows you to index contents in a search engine and query the search engine for results.&lt;br /&gt;
&lt;br /&gt;
=== Tag API (tag) ===&lt;br /&gt;
&lt;br /&gt;
The [[Tag API]] allows you to store tags (and a tag cloud) to items in your module.&lt;br /&gt;
&lt;br /&gt;
=== Task API (task) ===&lt;br /&gt;
&lt;br /&gt;
The [[Task API]] lets you run jobs in the background. Either once off, or on a regular schedule.&lt;br /&gt;
&lt;br /&gt;
=== Time API (time) ===&lt;br /&gt;
&lt;br /&gt;
The [[Time API]] takes care of translating and displaying times between users in the site.&lt;br /&gt;
&lt;br /&gt;
=== Testing API (test) ===&lt;br /&gt;
&lt;br /&gt;
The testing API contains the Unit test API ([[PHPUnit]]) and Acceptance test API ([[Acceptance testing]]). Ideally all new code should have unit tests written FIRST.&lt;br /&gt;
&lt;br /&gt;
=== User-related APIs (user) ===&lt;br /&gt;
&lt;br /&gt;
This is a rather informal grouping of miscellaneous [[User-related APIs]] relating to sorting and searching lists of users.&lt;br /&gt;
&lt;br /&gt;
=== Web services API (webservice) ===&lt;br /&gt;
&lt;br /&gt;
The [[Web services API]] allows you to expose particular functions (usually external functions) as web services.&lt;br /&gt;
&lt;br /&gt;
=== Badges API (OpenBadges) ===&lt;br /&gt;
&lt;br /&gt;
The [https://docs.moodle.org/dev/OpenBadges_User_Documentation Badges] user documentation (is a temp page until we compile a proper page with all the classes and APIs that allows you to manage particular badges and OpenBadges Backpack).&lt;br /&gt;
&lt;br /&gt;
=== Custom fields API ===&lt;br /&gt;
&lt;br /&gt;
The [[Custom fields API]] allows you to configure and add custom fields for different entities&lt;br /&gt;
&lt;br /&gt;
== Activity module APIs ==&lt;br /&gt;
&lt;br /&gt;
Activity modules are the most important plugin in Moodle.  There are several core APIs that service only Activity modules.&lt;br /&gt;
&lt;br /&gt;
=== Activity completion API (completion) ===&lt;br /&gt;
&lt;br /&gt;
The [[Activity completion API]] is to indicate to the system how activities are completed.&lt;br /&gt;
&lt;br /&gt;
=== Advanced grading API (grading) ===&lt;br /&gt;
&lt;br /&gt;
The [[Advanced grading API]] allows you to add more advanced grading interfaces (such as rubrics) that can produce simple grades for the gradebook.&lt;br /&gt;
&lt;br /&gt;
=== Conditional activities API (condition) - deprecated in 2.7 ===&lt;br /&gt;
&lt;br /&gt;
The deprecated [[Conditional activities API]] used to provide conditional access to modules and sections in Moodle 2.6 and below. It has been replaced by the [[Availability API]].&lt;br /&gt;
&lt;br /&gt;
=== Groups API (group) ===&lt;br /&gt;
&lt;br /&gt;
The [[Groups API]] allows you to check the current activity group mode and set the current group.&lt;br /&gt;
&lt;br /&gt;
=== Gradebook API (grade) ===&lt;br /&gt;
&lt;br /&gt;
The [[Gradebook API]] allows you to read and write from the gradebook.  It also allows you to provide an interface for detailed grading information.&lt;br /&gt;
&lt;br /&gt;
=== Plagiarism API (plagiarism) ===&lt;br /&gt;
&lt;br /&gt;
The [[Plagiarism API]] allows your activity module to send files and data to external services to have them checked for plagiarism.&lt;br /&gt;
&lt;br /&gt;
=== Question API (question) ===&lt;br /&gt;
&lt;br /&gt;
The [[Question API]] (which can be divided into the Question bank API and the Question engine API), can be used by activities that want to use questions from the question bank.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Plugins]] - plugin types also have their own APIs&lt;br /&gt;
* [[Callbacks]] - list of all callbacks in Moodle&lt;br /&gt;
* [[Coding style]] - general information about writing PHP code for Moodle&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Development_kit&amp;diff=56719</id>
		<title>Moodle Development kit</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Development_kit&amp;diff=56719"/>
		<updated>2019-12-04T09:51:10Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Typical workflows using MDK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every developer creates simple tools to avoid repeating cumbersome and/or boring tasks, and that is precisely why MDK has been created: to pack all those useful tools in a portable way across systems. Initially developed in Bash, the project moved to Python to avoid dealing with inconsistencies between Unix platforms, and eventually to support Windows.&lt;br /&gt;
&lt;br /&gt;
= Key concept =&lt;br /&gt;
&lt;br /&gt;
The most important concept of MDK is that it works with Moodle instances. An instance of Moodle is a directory in which you have checked out a particular version together with a database using a specific database engine. This means that if you want to work on Moodle 2.3 and 2.4, using both MySQL and PostgreSQL, you will have four separate instance directories. This choice was made because it is the safest, clearest, and most straightforward solution. &lt;br /&gt;
&lt;br /&gt;
= Typical workflows using MDK =&lt;br /&gt;
&lt;br /&gt;
To discover what MDK can do for you, here are a few common tasks it can achieve. More on [https://github.com/FMCorz/mdk/wiki/Typical-workflows MDK&#039;s wiki].&lt;br /&gt;
&lt;br /&gt;
== Installing a new instance ==&lt;br /&gt;
&lt;br /&gt;
Say we need to create a new instance of Moodle 2.4 and install it with PostgreSQL. We also want the instance to be ready for development with appropriate config settings. We also want to create a bunch of user accounts.&lt;br /&gt;
&lt;br /&gt;
 mdk create -i -v 24 -e pgsql -r dev users&lt;br /&gt;
or the equivalent long form:&lt;br /&gt;
 mdk create --install --version 24 --engine pgsql --run dev users&lt;br /&gt;
&lt;br /&gt;
These options include:&lt;br /&gt;
 --install: launch the installation script after creating the instance&lt;br /&gt;
 --engine: database engine to install the instance on (must be used with --install), default: mysqli&lt;br /&gt;
 --version: version of Moodle create an instance of (default: &#039;master&#039;)&lt;br /&gt;
 --run: scripts to run after installation (default: none)&lt;br /&gt;
&lt;br /&gt;
More information about scripts is available here: https://github.com/FMCorz/mdk/tree/master/mdk/scripts&lt;br /&gt;
&lt;br /&gt;
The above command is equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 mkdir /dir/to/stable_24/moodle&lt;br /&gt;
 mkdir /dir/to/stable_24/moodledata&lt;br /&gt;
 ln -s /dir/to/stable_24/moodle /var/www/stable_24&lt;br /&gt;
 git clone git://git.moodle.org/moodle.git /dir/to/moodle&lt;br /&gt;
 cd /dir/to/stable_24/moodle&lt;br /&gt;
 php admin/cli/install.php --wwwroot=&amp;quot;http://localhost/stable_24&amp;quot; --dataroot=/dir/to/stable_24/moodledata --dbtype=pgsql --dbname=stable24 --dbuser=root --dbpass=root --dbhost=localhost --fullname=&amp;quot;Stable 24 PostgreSQL&amp;quot; --shortname=stable_24 --adminuser=admin --adminpass=test --allow-unstable --agree-license --non-interactive&lt;br /&gt;
 vim config.php&lt;br /&gt;
 # Add the following settings:&lt;br /&gt;
 # - $CFG-&amp;gt;sessioncookiepath: /stable_24/&lt;br /&gt;
 # - $CFG-&amp;gt;debug: DEBUG_DEVELOPER&lt;br /&gt;
 # - $CFG-&amp;gt;debugdisplay: 1&lt;br /&gt;
 # - $CFG-&amp;gt;passwordpolicy: 0&lt;br /&gt;
 # - $CFG-&amp;gt;perfdebug: 15&lt;br /&gt;
 # - $CFG-&amp;gt;debugpageinfo: 1&lt;br /&gt;
 # - $CFG-&amp;gt;allowthemechangeonurl: 1&lt;br /&gt;
 # - $CFG-&amp;gt;cachejs: 0&lt;br /&gt;
 # - $CFG-&amp;gt;yuicomboloading: 0&lt;br /&gt;
 # Include FirePHP Core&lt;br /&gt;
 # Login to Moodle&lt;br /&gt;
 # Create 10 students, 3 teachers and 3 managers&lt;br /&gt;
&lt;br /&gt;
You also can specify the name of the instance using the --name or -n parameter. This is necessary to avoid name conflicts when trying to create same Moodle version with different database engines:&lt;br /&gt;
&lt;br /&gt;
 mdk create -i -v 24 -e mysqli -r dev users -n stable_24-mysql&lt;br /&gt;
&lt;br /&gt;
== Fixing an issue ==&lt;br /&gt;
&lt;br /&gt;
 mdk fix 12345&lt;br /&gt;
 # Committing your patch&lt;br /&gt;
 mdk push -t&lt;br /&gt;
&lt;br /&gt;
This is equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 git branch --track MDL-12345-24 origin/MOODLE_24_STABLE&lt;br /&gt;
 git checkout MDL-12345-24&lt;br /&gt;
 # Committing your patch&lt;br /&gt;
 git push github MDL-12345-24&lt;br /&gt;
 # Editing the tracker issue to add&lt;br /&gt;
 # - Git repository URL&lt;br /&gt;
 # - Git branch for 2.4&lt;br /&gt;
 # - Git compare URL for 2.4&lt;br /&gt;
&lt;br /&gt;
== Peer reviewing a patch ==&lt;br /&gt;
&lt;br /&gt;
Here we want to pull a patch from a tracker issue into a new testing branch, and then run the PHPUnit tests.&lt;br /&gt;
&lt;br /&gt;
 mdk pull 12345 -t&lt;br /&gt;
 mdk phpunit -r&lt;br /&gt;
&lt;br /&gt;
This is the equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 cd /dir/to/stable_24/moodle&lt;br /&gt;
 git branch --tracker MDL-12345-24-test MOODLE_24_STABLE&lt;br /&gt;
 git checkout MDL-12345-24-test&lt;br /&gt;
 git pull git://github.org/Someone/moodle.git MDL-12345-24&lt;br /&gt;
 # And now the PHPUnit part&lt;br /&gt;
 mkdir /dir/to/stable_24/moodledata_phpu&lt;br /&gt;
 vim config.php&lt;br /&gt;
 # To add&lt;br /&gt;
 # - $CFG-&amp;gt;phpunit_dataroot = &#039;/dir/to/stable_24/moodledata_phpu&#039;;&lt;br /&gt;
 # - $CFG-&amp;gt;phpunit_prefix = &#039;phpu_&#039;;&lt;br /&gt;
 php admin/tool/phpunit/cli/init.php&lt;br /&gt;
 phpunit&lt;br /&gt;
&lt;br /&gt;
For executing only the testcases in a file you can use:&lt;br /&gt;
&lt;br /&gt;
 mdk phpunit -r -u repository/tests/repository_test.php&lt;br /&gt;
&lt;br /&gt;
== Backporting a fix ==&lt;br /&gt;
&lt;br /&gt;
MDK could handle for you most of the cherry-picking work when you backport a fix. To do so, you need to have installed locally instances called &amp;quot;stable_XX&amp;quot; for each version you want to backport your fix. To do so you can use commands like:&lt;br /&gt;
&lt;br /&gt;
 mdk create -v 38 -i -r dev users makecourse -n stable_38&lt;br /&gt;
 mdk create -v 37 -i -r dev users makecourse -n stable_37&lt;br /&gt;
&lt;br /&gt;
Once you have the stable_XX versions, go to the branch you want to backport and execute:&lt;br /&gt;
&lt;br /&gt;
 mdk backport --versions 37 38 --push --update-tracker&lt;br /&gt;
&lt;br /&gt;
En the example params are:&lt;br /&gt;
* -v 37 38 backports the patch to the versions 3.7 and 3.8&lt;br /&gt;
* --push pushes the branch to github&lt;br /&gt;
* --update-tracker updates the tracker issue&lt;br /&gt;
&lt;br /&gt;
After the execution, your stable_XX instances will be on the fix branch, commits are pushed to you github project and backport links will be updated in the tracker.&lt;br /&gt;
&lt;br /&gt;
Of for some reason one cherry pick could not finish successfully, mdk will ask you if you want to keep this backport on no. If you choose to keep the partial backport, your stable_XX instance will be in cherry-picking state. In that case you need to solve any conflict and user mdk to push your changes:&lt;br /&gt;
&lt;br /&gt;
 # go to your stable_XX with cherry pick conflict&lt;br /&gt;
 # solve conflicts with git mergetool or any other tool&lt;br /&gt;
 git cherry-pick --continue&lt;br /&gt;
 # once all conflicts are solved, push to your repository and tracker using&lt;br /&gt;
 mdk push -t&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Upgrading the instances ==&lt;br /&gt;
&lt;br /&gt;
Say we need to upgrade our instances, as a new weekly release has just been made available.&lt;br /&gt;
 &lt;br /&gt;
 mdk upgrade -u --all&lt;br /&gt;
&lt;br /&gt;
This is the equivalent to doing:&lt;br /&gt;
&lt;br /&gt;
 # For each instance of Moodle...&lt;br /&gt;
 cd /dir/to/stable_24/moodle&lt;br /&gt;
 git checkout MOODLE_24_STABLE&lt;br /&gt;
 git fetch origin&lt;br /&gt;
 git reset --hard origin/MOODLE_24_STABLE&lt;br /&gt;
 php admin/cli/upgrade.php --non-interactive --allow-unstable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Executing behat tests ==&lt;br /&gt;
&lt;br /&gt;
In order to get the instance ready for acceptance testing (Behat) and run the test feature(s):&lt;br /&gt;
 &lt;br /&gt;
 mdk behat -r --tags=@core_completion&lt;br /&gt;
&lt;br /&gt;
For running only one feature or specific scenario:&lt;br /&gt;
&lt;br /&gt;
 mdk behat -r -n &amp;quot;Name of the feature/scenario&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
For a complete list of the commands MDK has to offer, read through the [https://github.com/FMCorz/mdk#command-list MDK README file] and the [https://github.com/FMCorz/mdk/wiki MDK wiki]. For more detail about each command, simply run them with the flag &#039;--help&#039;.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Please follow the instructions from the [https://github.com/FMCorz/mdk#installation README file].&lt;br /&gt;
&lt;br /&gt;
Note: When you install MDK, you will be asked for the following information (with default responses indicated in square brackets):&lt;br /&gt;
&lt;br /&gt;
*  What user are you initialising MDK for? [default - your current username]&lt;br /&gt;
*   What is the DocumentRoot of your virtual host? [~/www] &amp;lt;- &#039;&#039;&#039;See note below&#039;&#039;&#039;&lt;br /&gt;
*    Where do you want to store your Moodle instances? [~/moodles] &amp;lt;- This can be in your home directory (the default) because a symlink will be created using DocumentRoot&lt;br /&gt;
*    What is your Github username? (Leave blank if not using Github) &lt;br /&gt;
*    What is your MySQL user? [root]&lt;br /&gt;
*    What is your MySQL password? [root]&lt;br /&gt;
*    What is your PostgreSQL user? [root]&lt;br /&gt;
*    What is your PostgreSQL password? [root]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: By default, MDK will install instances to your home directory. A symlink will be created from your DocumentRoot to the install location. You will need to either change the DocumentRoot of your host to the path to your html root directory, e.g. /var/www/html, or create a file in /etc/httpd/conf.d/moodlehq.conf that configures a virtual host in your home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Also note that you may need to set the path variable to null:&#039;&#039;&#039;&lt;br /&gt;
 mdk config set path &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Upgrading MDK =&lt;br /&gt;
Every Moodle release, a new version of MDK is also being released in order to prepare for the development of the next Moodle version. To upgrade MDK:&lt;br /&gt;
# Update all of the Moodle instances: &#039;&#039;mdk update --all&#039;&#039;&lt;br /&gt;
# Check out the master branch for all of your master instances, e.g. in your stable_master branch: &#039;&#039;git checkout master&#039;&#039;&lt;br /&gt;
# Upgrade MDK&lt;br /&gt;
## Via pip: &#039;&#039;sudo pip install moodle-sdk --upgrade&#039;&#039;&lt;br /&gt;
## Via Homebrew: &#039;&#039;brew upgrade moodle-sdk&#039;&#039;&lt;br /&gt;
# Run MDK doctor to fix its &#039;&#039;masterBranch&#039;&#039; configuration. &#039;&#039;mdk doctor --fix --masterbranch&#039;&#039;&lt;br /&gt;
# Run MDK doctor to check the master instances. &#039;&#039;mdk doctor --all&#039;&#039;&lt;br /&gt;
#* If you don&#039;t see an error saying something like “stable_master is on branch master instead of MOODLE_XX_STABLE”, then you&#039;re all good. Otherwise, do a hard reset your master instances:&lt;br /&gt;
 mdk update -c&lt;br /&gt;
 cd ~/moodles/[integration/stable]_master&lt;br /&gt;
 git checkout master&lt;br /&gt;
 git fetch `mdk config show upstreamRemote`&lt;br /&gt;
 git reset --hard `mdk config show upstreamRemote`/master&lt;br /&gt;
&lt;br /&gt;
= The MDK Suite =&lt;br /&gt;
&lt;br /&gt;
Some other tools have been developed using the name MDK as they are considered as part of the development kit but are often mistaken with the &#039;&#039;real&#039;&#039; MDK. The &#039;&#039;real&#039;&#039; MDK is the command line tool described above.&lt;br /&gt;
&lt;br /&gt;
== MDK Browser Extension ==&lt;br /&gt;
&lt;br /&gt;
Available for both [https://addons.mozilla.org/en-US/firefox/addon/mdk-browser-extension/ Firefox] and [https://chrome.google.com/webstore/detail/mdk-browser-extension/iadpkkojcdoflinpncpkbonnhdlaicnc Chrome], this is a browser extension that allows quick access to useful user-scripts. The scripts add functionality to Moodle.org, Moodle Tracker and your Moodle instances. You can find more information about it on its [https://github.com/danpoltawski/userscripts-moodle public repository].&lt;br /&gt;
&lt;br /&gt;
== MDK Authentication ==&lt;br /&gt;
&lt;br /&gt;
This is an authentication plugin for Moodle 2.x, which not only creates the user if it does not exist in the database yet, but also enrols it as a student, teacher or manager in all the available courses. More information about this plugin is available on the [https://github.com/FMCorz/moodle-auth_mdk public repository].&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer tools]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=HQ_component_teams&amp;diff=56604</id>
		<title>HQ component teams</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=HQ_component_teams&amp;diff=56604"/>
		<updated>2019-11-06T15:43:09Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As of Dec 2017, at Moodle HQ each core developer is assigned a list of components to lead. They are responsible for triaging the issues in those components, planning the roadmap of issues to be worked on and should be consulted as part of the peer review process for all issues relating to their components. &lt;br /&gt;
&lt;br /&gt;
The current list of component leads is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adrian (abgreeve), Mihail (Geshoski), Peter (peterdias)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Blocks, Blog, Book, Filepicker, Glossary, Lesson, Ratings, Reports, Repositories, Resource&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andrew (dobedobedoh), Mick Hawkins (michaelh)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Email, Forum, HTML Editor (Atto), HTML Editor (TinyMCE), Installation, JavaScript, Logging, RSS, Unit tests, User Tours&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bas Brands (basbrands), Ryan (ryanwyllie)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Themes, Dashboard (My home), Accessibility, HTML and CSS, Navigation, Usability, Javascript (&#039;&#039;Ryan&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Damyon (damyon)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Assignment, Assignment (2.2), Competencies, Database activity module, Backup, Backup: IMS-CC&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;David (dmonllao), Víctor Deniz (victor)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analytics, Caching, Global search, Gradebook, Grading methods, Libraries, Performance, Tasks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;David (mudrd8mz), Sara (sarjona), Amaia Anabitarte (amaia), Ferran (tusefomal)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Badges, Cohorts, Enrolments, Feedback, Hub, Language, Maths filters, MNet, Plagiarism, Roles / Access, SCORM, Survey, Tags, Translation, User management, Wiki(2.x), Workshop&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jake (jaked), Jun (jpataleta )&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Automated functional tests (behat), Choice, Comments, Conditional activities, Database SQL/XMLDB, Events API, Files API, Filters, Forms Library, Portfolio, Web Services&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark (markn), Carlos Escobedo (carlos)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Activity completion, Authentication, Chat, Course completion, External Tool (IMS-LTI), IMS-CP resource type, LTI provider, Media, Messages&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simey (lameze), Shamim (rezaie9)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Calendar, Groups, Questions, Quiz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eduard Cercós (eduard)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
IT Team&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark Paget (markpaget)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
IT Team&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;David Matamoros (davidmc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[Workplace] Programs &amp;amp; Certifications&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mikel Martín (mikel)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Workplace Team&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Testing_of_integrated_issues&amp;diff=56596</id>
		<title>Testing of integrated issues</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Testing_of_integrated_issues&amp;diff=56596"/>
		<updated>2019-11-04T11:46:20Z</updated>

		<summary type="html">&lt;p&gt;Tusefomal: /* Expectation from tester */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This page is for analysing and developing our weekly testing of code added to the integration server. It is a work-in-progress. &#039;&#039;Comments or suggestions are welcome!&#039;&#039; Please use the [[{{TALKPAGENAME}}|page comments]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Testing is an important part of the [[Process|Moodle development process]].&lt;br /&gt;
Wednesday has been allocated for testing, tester&#039;s first priority should be to finish testing on that day. Tester should update testing status or add comments in tracker, so that status of testing is known to iTeam.&lt;br /&gt;
&lt;br /&gt;
==The testing process==&lt;br /&gt;
&lt;br /&gt;
# Every Wednesday by 10:00 am (WST) all tests get allocated to HQ developers by iTeam.&lt;br /&gt;
# Developer should check mail or search tracker to see which issues are assigned to him/her for testing.&lt;br /&gt;
# Pull latest integration from git://git.moodle.org/integration.git&lt;br /&gt;
# Test issue by following &#039;&#039;&#039;Testing instructions&#039;&#039;&#039;&lt;br /&gt;
# Select &#039;Pass test&#039; or &#039;Fail test&#039; as appropriate, adding a short description of what was tested if not obvious&lt;br /&gt;
# If you find you cannot finish testing a particular pull request, click &#039;Stop testing&#039; and let iTeam know about it.&lt;br /&gt;
# Failed tests will wait for assignee to respond. If the patch is provided late and there is constrained to find tester then issue will be re-opened.&lt;br /&gt;
# Once the fail fix is integrated, it goes back to *complete* re-testing.&lt;br /&gt;
# It&#039;s responsibility of tester to test the issue again, provided fix patch is not from tester. If tester provides fix patch then tester will be changed.&lt;br /&gt;
# Tester who passes the issue will be set as tester for the issue.&lt;br /&gt;
&lt;br /&gt;
For test sessions, if you encounter a failure, please fail the issue add a comment on the issue itself. If everything&#039;s good, add a comment in the session and complete the session. You may also comment on the issue and say that testing passes on your part.&lt;br /&gt;
&lt;br /&gt;
===Expectation from developer and peer-reviewer===&lt;br /&gt;
* Testing instructions are spot-on, clear and easy to perform. Please, follow the [[Testing instructions guide]] recommendations.&lt;br /&gt;
&lt;br /&gt;
===Expectation from iTeam===&lt;br /&gt;
* Most (if not all) tests should be allocated by Wednesday Morning 10:00 a.m (WST). Tests that appear after this might not be tested. If tests are allocated after this point, the allocated tester should be contacted individually by private message and allowed to acknowledge.&lt;br /&gt;
* The iTeam member assigning tests should put a message in office chat that tests have been allocated.&lt;br /&gt;
* The iTeam may need to help/re-assign tests if developers are having problems.&lt;br /&gt;
&lt;br /&gt;
===Expectation from tester===&lt;br /&gt;
* Testing &#039;&#039;&#039;must happen always against up to date integration.git repository&#039;&#039;&#039; (unless testing instructions include some exceptional git operation). More specifically, testing &#039;&#039;&#039;must not happen against development branches&#039;&#039;&#039; for a number of reasons (based on old core stuff, missing interdependencies with other issues or changes performed along the integration process, upgrade problems...).&lt;br /&gt;
* If HQ developer is not available for testing on Wednesday, this should be recorded in the calendar. If this has not been communicated in the leave calendar, then the developer or management should let iTeam know ASAP.&lt;br /&gt;
* Testers should try to finish testing as early as possible on Wednesdays, so when tests fail, the issue assignee has as much time as possible to resolve it.&lt;br /&gt;
* When a test fails, or new (related) regression found then fail test&lt;br /&gt;
* If tester is not sure of results or need explanation on testing instructions, then tester can either fail test with comments, or contact the assignee individually to raise the problem.&lt;br /&gt;
* Testers should let the iTeam know ASAP if they are facing any problems, need help or may not be able to complete their allocated tests&lt;br /&gt;
* For any reason (Big test, not enough time, not started testing yet), if a test is dragged to next day (Thursday) then the tester should leave comment on tracker, updating the status of testing and adding the expected time needed to finish testing.&lt;br /&gt;
* When a test is passed, it is recommended to add some extra information that confirms that all works as expected. This could be a browser screenshot, terminal output...&lt;br /&gt;
* &#039;&#039;&#039;All UI tests should be tested on currently supported themes {{Template:CurrentlySupportedThemes}}.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Differences in test process during continuous integration periods ===&lt;br /&gt;
&lt;br /&gt;
During [[Integration Review#During continuous integration.2FFreeze.2FQA period|continuous integration]] we change our schedule to produce and release fixes to bugs more quickly than the usual weekly cycle. Our goal during this period is to release a new version of master multiple times per week and we do not have preallocated testing days (wednesday). We try to keep the process more flexible during this time in order that developers who have less pressing issues than others can take the load off those concentrating on big fixes. It works best if we work together to help each other out.&lt;br /&gt;
&lt;br /&gt;
It is expected that:&lt;br /&gt;
* Testers to proactively pick up issues from the [https://tracker.moodle.org/secure/Dashboard.jspa?selectPageId=16582 Urgent Issues Dashboard] ([https://tracker.moodle.org/issues/?filter=14728 awaiting testing] widget/filter).&lt;br /&gt;
* At ~12:00 (UTC-8) each day, any waiting tests will be allocated to testers (first to those who have not proactively taken any)&lt;br /&gt;
* Priority is given to testing issues to ensure we can release regularly&lt;br /&gt;
&lt;br /&gt;
==Installing a local test site from the integration repository==&lt;br /&gt;
&lt;br /&gt;
Moodle uses two Git repositories for its source code. Their names are moodle.git and integration.git and they live at http://git.moodle.org. All submitted patches that were accepted during the integration review go to the integration.git first. Testers use integration.git as the source of the code to test. Patches that survive testing are then promoted to moodle.git and become the part of the official Moodle weekly build.&lt;br /&gt;
&lt;br /&gt;
To obtain the code from the integration.git repository, follow the instructions at [[Git for Administrators]] page. But instead of cloning from git://github.com/moodle/moodle.git, use&lt;br /&gt;
&lt;br /&gt;
    git clone git://git.moodle.org/integration.git&lt;br /&gt;
&lt;br /&gt;
as the very first command.&lt;br /&gt;
&lt;br /&gt;
===Changing theme to another one===&lt;br /&gt;
&lt;br /&gt;
Ensure you have following setting in the config (It allows changing theme from url).&lt;br /&gt;
&lt;br /&gt;
    Set $CFG-&amp;gt;allowthemechangeonurl = true;&lt;br /&gt;
&lt;br /&gt;
For changing to a theme named &amp;quot;yay&amp;quot; add &#039;&#039;&#039;?theme=yay&#039;&#039;&#039; to the url.&lt;br /&gt;
&lt;br /&gt;
===Checking tests assigned to you===&lt;br /&gt;
# Log in to [https://tracker.moodle.org Tracker]&lt;br /&gt;
# Visit [https://tracker.moodle.org/issues/?filter=11801&amp;amp;jql=project%20%3D%20MDL%20AND%20Tester%20%3D%20currentUser()%20AND%20status%20%3D%20%22Waiting%20for%20testing%22 Issues waiting to be tested.]&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* If issues requires an Oracle and MSSQL installations for testing, and you don&#039;t have one, then please let iTeam know about this.&lt;br /&gt;
* Any update should be added as comment on MDL issue being tested.&lt;br /&gt;
* If testers pass or fail an issue by mistake, then please request iTeam to reopen it for testing.&lt;br /&gt;
* Testers should not be involved in the bugfixing or review process.&lt;br /&gt;
* If an issue cannot be fixed within a sprint and has to be reopened, the fix for sprint version should be removed and an appropriate backlog version set.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quality Assurance]]&lt;/div&gt;</summary>
		<author><name>Tusefomal</name></author>
	</entry>
</feed>