<idea-plugin xmlns:xi="http://www.w3.org/2001/XInclude">
  <!--suppress PluginXmlValidity -->
  <dependencies>
    <plugin id="com.intellij.modules.lang"/>
    <!-- The vcs module is needed to be sure that IgnoreFileType, PatternCache exist which are used for .courseignore support -->
    <plugin id="com.intellij.modules.vcs"/>
  </dependencies>

  <resource-bundle>messages.EduCoreBundle</resource-bundle>

  <applicationListeners>
    <listener class="com.jetbrains.edu.learning.EduDynamicPluginListener"
              topic="com.intellij.ide.plugins.DynamicPluginListener"/>
    <listener class="com.jetbrains.edu.learning.InitializationListener" topic="com.intellij.ide.AppLifecycleListener"/>
    <listener class="com.jetbrains.edu.learning.InitializationListener" topic="com.intellij.ide.plugins.DynamicPluginListener"/>
    <listener class="com.jetbrains.edu.learning.RecentPreviewCourseListener"
              topic="com.intellij.openapi.project.ProjectManagerListener"/>
    <listener class="com.jetbrains.edu.learning.RecentPreviewCourseListener"
              topic="com.intellij.ide.AppLifecycleListener"/>
  </applicationListeners>

  <projectListeners>
    <listener class="com.jetbrains.edu.learning.checker.FixModuleForRunConfigurationsListener"
              topic="com.intellij.execution.RunManagerListener"/>
    <listener class="com.jetbrains.edu.learning.checker.PreventRunConfigurationsRenameListener"
              topic="com.intellij.execution.RunManagerListener"/>
    <listener class="com.jetbrains.edu.learning.checker.FixModuleForRunConfigurationsListener"
              topic="com.intellij.openapi.roots.ModuleRootListener"/>
    <listener class="com.jetbrains.edu.learning.yaml.YamlLoadingErrorManager$Listener"
              topic="com.jetbrains.edu.learning.yaml.YamlListener"/>
    <listener class="com.jetbrains.edu.learning.taskToolWindow.EduFileEditorManagerListener"
              topic="com.intellij.openapi.fileEditor.FileEditorManagerListener"/>
    <listener class="com.jetbrains.edu.learning.taskToolWindow.EduFileEditorManagerListener"
              topic="com.intellij.openapi.fileEditor.FileEditorManagerListener$Before"/>
    <listener class="com.jetbrains.edu.learning.storage.LearningObjectsPersister"
              topic="com.jetbrains.edu.learning.CourseSetListener"/>
    <listener class="com.jetbrains.edu.learning.marketplace.lti.LTICourseSetListener"
              topic="com.jetbrains.edu.learning.CourseSetListener"/>
  </projectListeners>

  <extensionPoints>
    <extensionPoint qualifiedName="Educational.configurator"
                    beanClass="com.jetbrains.edu.learning.configuration.EducationalExtensionPoint"
                    dynamic="true">
      <with attribute="implementationClass" implements="com.jetbrains.edu.learning.configuration.EduConfigurator"/>
    </extensionPoint>
    <extensionPoint qualifiedName="Educational.compatibilityProvider"
                    beanClass="com.jetbrains.edu.learning.compatibility.CourseCompatibilityProviderEP"
                    dynamic="true">
      <with attribute="implementationClass" implements="com.jetbrains.edu.learning.compatibility.CourseCompatibilityProvider"/>
    </extensionPoint>

    <extensionPoint qualifiedName="Educational.remoteTaskChecker"
                    interface="com.jetbrains.edu.learning.checker.remote.RemoteTaskChecker"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.checkListener"
                    interface="com.jetbrains.edu.learning.checker.CheckListener"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.submissionsProvider"
                    interface="com.jetbrains.edu.learning.submissions.provider.SubmissionsProvider"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.communitySubmissionsProvider"
                    interface="com.jetbrains.edu.learning.submissions.provider.CommunitySubmissionsProvider"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.optionsProvider"
                    beanClass="com.intellij.openapi.options.ConfigurableEP"
                    dynamic="true">
      <with attribute="instance" implements="com.jetbrains.edu.learning.settings.OptionsProvider"/>
    </extensionPoint>

    <extensionPoint qualifiedName="Educational.coursesPlatformProviderFactory"
                    interface="com.jetbrains.edu.learning.newproject.ui.CoursesPlatformProviderFactory"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.pathMacroProvider"
                    interface="com.jetbrains.edu.learning.courseGeneration.macro.EduMacroProvider"
                    dynamic="true"/>

    <extensionPoint qualifiedName="Educational.postToGithub"
                    interface="com.jetbrains.edu.learning.github.PostToGithubActionProvider"
                    dynamic="true"/>

    <extensionPoint qualifiedName="Educational.taskNavigationExtension"
                    interface="com.jetbrains.edu.learning.navigation.TaskNavigationExtension"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.navigateToConfigEntryForEduFile"
                    interface="com.jetbrains.edu.learning.navigation.NavigateToConfigEntryForEduFileExtension"
                    dynamic="true"/>

    <extensionPoint qualifiedName="Educational.revertTaskExtension"
                    interface="com.jetbrains.edu.learning.actions.RevertTaskAction$RevertTaskExtension"
                    dynamic="true"/>

    <extensionPoint qualifiedName="Educational.yamlActionsHelper"
                    interface="com.jetbrains.edu.coursecreator.actions.YamlActionsHelper"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.courseViewPaneCustomization"
                    interface="com.jetbrains.edu.learning.projectView.CourseViewPaneCustomization"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.studyItemRefactoringHandler"
                    interface="com.jetbrains.edu.coursecreator.handlers.StudyItemRefactoringHandler"
                    dynamic="true"/>
    <extensionPoint qualifiedName="Educational.courseMetadataProcessor"
                    interface="com.jetbrains.edu.learning.newproject.CourseMetadataProcessor"
                    dynamic="true"/>
  </extensionPoints>

  <actions>
    <action id="Educational.Agreement.ShowUserAgreementDialog"
            class="com.jetbrains.edu.learning.agreement.action.ShowUserAgreementDialog"
            internal="true"/>
    <action id="Educational.Agreement.ResetUserAgreementSettings"
            class="com.jetbrains.edu.learning.agreement.action.ResetUserAgreementSettings"
            internal="true"/>
    <action id="Educational.ImportLocalCourse" class="com.jetbrains.edu.learning.actions.ImportLocalCourseAction"/>
    <action id="Educational.Check" class="com.jetbrains.edu.learning.actions.CheckAction"/>
    <action id="Educational.Run"
            class="com.jetbrains.edu.learning.actions.RunTaskAction"
            icon="AllIcons.Actions.Execute"/>
    <action id="Educational.AssignRunConfigurationToTask"
            class="com.jetbrains.edu.learning.actions.AssignRunConfigurationToTask">
      <add-to-group group-id="RunConfiguration.Group" anchor="before" relative-to-action="DeleteRunConfiguration"/> <!-- top right -->
    </action>
    <action id="Educational.Retry" class="com.jetbrains.edu.learning.actions.RetryAction"/>
    <action id="Educational.PrevPlaceholder"
            class="com.jetbrains.edu.learning.actions.PrevPlaceholderAction"
            icon="AllIcons.Actions.Back"/>
    <action id="Educational.NextPlaceholder"
            class="com.jetbrains.edu.learning.actions.NextPlaceholderAction"
            icon="AllIcons.Actions.Forward"/>
    <action id="Educational.PreviousTask"
            class="com.jetbrains.edu.learning.actions.PreviousTaskAction"
            icon="AllIcons.Actions.Back"/>
    <action id="Educational.NextTask"
            class="com.jetbrains.edu.learning.actions.NextTaskAction"
            icon="AllIcons.Actions.Forward"/>
    <action id="Educational.RefreshTask"
            class="com.jetbrains.edu.learning.actions.RevertTaskAction"
            icon="com.jetbrains.edu.EducationalCoreIcons.Actions.ResetTask"/>
    <action id="Educational.LeaveFeedbackAction"
            class="com.jetbrains.edu.learning.actions.LeaveFeedbackAction"
            icon="com.jetbrains.edu.EducationalCoreIcons.Actions.CommentTask"/>
    <action id="Educational.OpenTaskOnSiteAction" class="com.jetbrains.edu.learning.actions.OpenTaskOnSiteAction"/>
    <action id="Educational.CompareWithAnswer"
            class="com.jetbrains.edu.learning.actions.CompareWithAnswerAction"
            icon="AllIcons.Actions.Diff"/>
    <action id="Educational.RefreshAnswerPlaceholder"
            class="com.jetbrains.edu.learning.actions.RefreshAnswerPlaceholder"
            icon="AllIcons.Actions.Refresh">
      <add-to-group group-id="EditorPopupMenu" anchor="last"/>
    </action>
    <action id="Educational.SwitchTaskDescriptionPanel" class="com.jetbrains.edu.learning.actions.SwitchTaskPanelAction">
    </action>
    <action id="Educational.UpdateCoursePreview"
            class="com.jetbrains.edu.coursecreator.actions.CCUpdateCoursePreview"
            internal="true"/>

    <!-- IMPORTANT: don't change the action id, it's used in monorepo-->
    <action id="Educational.BrowseCourses" class="com.jetbrains.edu.learning.newproject.BrowseCoursesAction"/>

    <action id="Educational.ToggleRestServices"
            class="com.jetbrains.edu.learning.actions.ToggleRestServicesAction"
            internal="true"/>

    <!--educator actions-->
    <action id="Educational.Educator.InsertShortcut" class="com.jetbrains.edu.coursecreator.actions.InsertShortcutAction">
      <add-to-group group-id="EditorPopupMenu" anchor="first"/>
    </action>
    <action id="Educational.Educator.NewCourse" class="com.jetbrains.edu.coursecreator.actions.CCNewCourseAction"/>
    <action id="Educational.CCEditTaskDescription" class="com.jetbrains.edu.coursecreator.actions.CCEditTaskDescription"/>

    <action id="LessonCard-left" class="com.intellij.openapi.actionSystem.EmptyAction" use-shortcut-of="EditorLeft"/>
    <action id="LessonCard-right" class="com.intellij.openapi.actionSystem.EmptyAction" use-shortcut-of="EditorRight"/>

    <group id="Educational.Educator.NewFile">
      <action id="Educational.Educator.CreateTask" class="com.jetbrains.edu.coursecreator.actions.studyItem.CCCreateTask"/>
      <action id="Educational.Educator.CreateLesson"
              class="com.jetbrains.edu.coursecreator.actions.studyItem.CCCreateLesson"/>
      <action id="Educational.Educator.CreateSection"
              class="com.jetbrains.edu.coursecreator.actions.studyItem.CCCreateSection"/>
      <separator/>
      <!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
    </group>

    <action id="Educational.Educator.ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo"/>
    <action id="Educational.Educator.CheckAllTasks" class="com.jetbrains.edu.coursecreator.actions.checkAllTasks.CCCheckAllTasksAction"/>

    <action class="com.jetbrains.edu.coursecreator.actions.CCCreateCoursePreview" id="Educational.Educator.CreateCoursePreview"/>

    <action id="Educational.Educator.RegenerateDuplicateIds"
            class="com.jetbrains.edu.coursecreator.actions.marketplace.RegenerateDuplicateIds"/>

    <group id="Educational.Educator.CourseCreator.FrameworkLesson" popup="false"
           class="com.jetbrains.edu.coursecreator.actions.CCFrameworkLessonActionGroup">
      <action id="Educational.Educator.SyncChangesWithNextTasks"
              class="com.jetbrains.edu.coursecreator.actions.CCSyncChangesWithNextTasks"
              icon="com.jetbrains.edu.EducationalCoreIcons.Actions.SyncChanges">
      </action>
      <action id="Educational.Educator.AllowFileToSyncChanges"
              class="com.jetbrains.edu.coursecreator.actions.taskFile.CCAllowFileSyncChanges"
              icon="AllIcons.Actions.Show"/>
      <action id="Educational.Educator.IgnoreFilePropagation"
              class="com.jetbrains.edu.coursecreator.actions.taskFile.CCIgnoreFileInSyncChanges"
              icon="com.jetbrains.edu.EducationalCoreIcons.Actions.IgnoreSyncFile"/>
      <action id="Educational.Educator.ShowUnsyncedChanges"
              class="com.jetbrains.edu.coursecreator.actions.taskFile.CCShowUnsyncedChanges"
              icon="AllIcons.Actions.Diff"
              internal="true">
      </action>
      <separator/>
      <!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
    </group>

    <group id="Educational.Educator.CourseCreator.Menu" popup="true"
           class="com.jetbrains.edu.coursecreator.actions.CCProjectViewActionGroup">
      <action id="Educational.Educator.ShowToStudent" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCMakeVisibleToLearner"/>
      <action id="Educational.Educator.HideFromStudent" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCHideFromLearner"/>
      <action id="Educational.Educator.ShowPreview" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCShowPreview">
        <add-to-group group-id="EditorTabPopupMenu"/>
      </action>
      <action id="Educational.Educator.CCWrapWithSection" class="com.jetbrains.edu.coursecreator.actions.studyItem.CCWrapWithSection"/>
      <action id="Educational.Educator.CCRemoveSection" class="com.jetbrains.edu.coursecreator.actions.studyItem.CCRemoveSection"/>
      <action id="Educational.Educator.IncludeIntoTask" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCIncludeIntoTask"/>
      <action id="Educational.Educator.ExcludeFromTask" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCExcludeFromTask"/>
      <action id="Educational.Educator.IncludeIntoArchive" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCIncludeIntoArchive"/>
      <action id="Educational.Educator.ExcludeFromArchive" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCExcludeFromArchive"/>
      <separator/>
      <reference ref="Educational.Educator.CreateCoursePreview"/>
      <reference ref="Educational.Educator.ChangeCourseInfo"/>
      <reference ref="Educational.Educator.CheckAllTasks"/>
      <action id="Educational.Educator.PackCourse" class="com.jetbrains.edu.coursecreator.actions.CCCreateCourseArchiveAction"/>
      <!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
    </group>

    <action id="Educational.Educator.ExportStepikIds" class="com.jetbrains.edu.coursecreator.actions.stepik.ExportStepikIds"/>

    <group id="Educational.Educator.AnswerPlaceholder">
      <action id="Educational.Educator.AddAnswerPlaceholder"
              class="com.jetbrains.edu.coursecreator.actions.placeholder.CCAddAnswerPlaceholder"/>
      <group id="Educational.Educator.ModifyAnswerPlaceholder" popup="true" text="Answer Placeholder"
             class="com.jetbrains.edu.coursecreator.CCAnswerPlaceholderActionGroup">
        <action id="Educational.Educator.EditAnswerPlaceholder"
                class="com.jetbrains.edu.coursecreator.actions.placeholder.CCEditAnswerPlaceholder"/>
        <action id="Educational.Educator.RemoveDependency" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCRemoveDependency"/>
        <action id="Educational.Educator.DeleteAnswerPlaceholder"
                class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAnswerPlaceholder"/>
        <action id="Educational.Educator.DeleteAllPlaceholders"
                class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAllAnswerPlaceholdersAction"/>
        <separator/>
      </group>
      <separator/>
      <add-to-group group-id="EditorPopupMenu" anchor="first"/>
    </group>

    <action id="Educational.Educator.EditCourseFromArchive" class="com.jetbrains.edu.coursecreator.actions.CCEditCourseArchive"/>
    <action id="Educational.Educator.StepikChangeHost"
            class="com.jetbrains.edu.learning.stepik.changeHost.StepikChangeHost"
            internal="true"/>
    <action id="Educational.Hyperskill.InstallHyperskillPlugin" class="com.jetbrains.edu.learning.stepik.hyperskill.actions.InstallHyperskillPluginAction"/>

    <group id="Educational.LearnAndTeachFileMenu"
           class="com.jetbrains.edu.learning.newproject.LearnAndTeachFileMenuGroup"
           popup="true"
           icon="com.jetbrains.edu.EducationalCoreIcons.Actions.EduCourse">
      <reference ref="Educational.BrowseCourses"/>
      <reference ref="Educational.Educator.NewCourse"/>
      <!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
    </group>
    <action id="Educational.WatchTutorial" class="com.jetbrains.edu.learning.actions.LearnMoreAction">
      <add-to-group group-id="HelpMenu" anchor="before" relative-to-action="HelpTopics"/>
    </action>
    <action id="Educational.SolveAllTasksBefore" class="com.jetbrains.edu.coursecreator.actions.CCSolveAllTasksBeforeAction"/>
    <action id="Educational.CreateNewIssue"
            class="com.jetbrains.edu.learning.actions.CreateNewYouTrackIssue"
            icon="com.jetbrains.edu.EducationalCoreIcons.Actions.EduCourse">
      <add-to-group group-id="HelpMenu" anchor="after" relative-to-action="ReportProblem"/>
    </action>
    <action id="Educational.Student.ApplyCode"
            class="com.jetbrains.edu.learning.actions.ApplyCodeAction"
            icon="com.jetbrains.edu.EducationalCoreIcons.Actions.ApplyCode">
      <add-to-group group-id="Diff.ViewerToolbar"/>
      <keyboard-shortcut
        keymap="$default"
        first-keystroke="control alt shift A"
      />
    </action>
    <action id="Educational.Educator.OpenEducatorHelp"
            class="com.jetbrains.edu.coursecreator.ui.CCOpenEducatorHelp"/>
    <group id="Educational.CourseView.SecondaryActions">
      <action id="Educational.HideSolvedLessons"
              class="com.jetbrains.edu.learning.projectView.CourseViewPane$HideSolvedLessonsAction"/>
    </group>

   <!-- Actions located in the right corner of the Course View header -->
    <group id="Educational.CourseView.Header.Right">
      <reference ref="Educational.Educator.CreateCoursePreview"/>
      <reference ref="Educational.Educator.OpenEducatorHelp"/>
    </group>

    <action id="Educational.LeaveInIdeFeedbackAction"
            class="com.jetbrains.edu.learning.actions.LeaveInIdeFeedbackAction"
            icon="com.jetbrains.edu.EducationalCoreIcons.Actions.CommentTask"/>

    <group id="Educational.CheckPanel.Left">
      <reference ref="Educational.Run"/>
    </group>

    <group id="Educational.CheckPanel.Right">
      <reference ref="Educational.RefreshTask"/>
      <reference ref="Educational.LeaveInIdeFeedbackAction"/>
      <reference ref="Educational.LeaveFeedbackAction"/>
    </group>

    <!-- Actions located in the right corner of Task tool window -->
    <group id="Educational.TaskToolWindowView.TitleActions">
      <reference ref="Educational.CCEditTaskDescription"/>
      <reference ref="Educational.PreviousTask"/>
      <reference ref="Educational.NextTask"/>
    </group>
  </actions>

  <extensions defaultExtensionNs="com.intellij">
    <applicationService serviceImplementation="com.jetbrains.edu.learning.agreement.UserAgreementSettings"/>
    <applicationService serviceInterface="com.jetbrains.edu.learning.EduBrowser"
                        serviceImplementation="com.jetbrains.edu.learning.EduBrowser"
                        testServiceImplementation="com.jetbrains.edu.learning.MockEduBrowser"/>
    <applicationService serviceInterface="com.jetbrains.edu.learning.stepik.api.StepikConnector"
                        serviceImplementation="com.jetbrains.edu.learning.stepik.api.StepikConnectorImpl"
                        testServiceImplementation="com.jetbrains.edu.learning.stepik.api.MockStepikConnector"/>

    <applicationService serviceImplementation="com.jetbrains.edu.coursecreator.settings.CCSettings"/>

    <applicationService serviceImplementation="com.jetbrains.edu.learning.ai.terms.TheoryLookupSettings"/>

    <applicationService serviceInterface="com.jetbrains.edu.learning.courseGeneration.ProjectOpener"
                        serviceImplementation="com.jetbrains.edu.learning.courseGeneration.ProjectOpenerImpl"
                        testServiceImplementation="com.jetbrains.edu.learning.MockProjectOpener"/>

    <projectService serviceInterface="com.jetbrains.edu.learning.taskToolWindow.ui.TaskToolWindowView"
                    serviceImplementation="com.jetbrains.edu.learning.taskToolWindow.ui.TaskToolWindowViewImpl"
                    testServiceImplementation="com.jetbrains.edu.learning.taskToolWindow.ui.MockTaskToolWindowView"/>
    <projectService serviceInterface="com.jetbrains.edu.learning.checker.details.CheckDetailsView"
                    serviceImplementation="com.jetbrains.edu.learning.checker.details.CheckDetailsViewImpl"
                    headlessImplementation="com.jetbrains.edu.learning.checker.details.MockCheckDetailsView"
                    testServiceImplementation="com.jetbrains.edu.learning.checker.details.MockCheckDetailsView"/>
    <projectService serviceInterface="com.jetbrains.edu.learning.framework.FrameworkLessonManager"
                    serviceImplementation="com.jetbrains.edu.learning.framework.impl.FrameworkLessonManagerImpl"/>

    <!-- Courseignore lang -->
    <fileType language="CourseIgnore" fileNames=".courseignore" fieldName="INSTANCE" name="CourseIgnore file"
              implementationClass="com.jetbrains.edu.coursecreator.courseignore.CourseIgnoreFileType"/>
    <lang.parserDefinition language="CourseIgnore"
                           implementationClass="com.intellij.openapi.vcs.changes.ignore.lang.IgnoreParserDefinition"/>
    <codeInsight.lineMarkerProvider language="CourseIgnore"
                                    implementationClass="com.intellij.openapi.vcs.changes.ignore.codeInsight.IgnoreDirectoryMarkerProvider"/>
    <lang.braceMatcher language="CourseIgnore" implementationClass="com.intellij.openapi.vcs.changes.ignore.lang.IgnoreBraceMatcher"/>
    <lang.commenter language="CourseIgnore" implementationClass="com.intellij.openapi.vcs.changes.ignore.lang.IgnoreCommenter"/>
    <!--END of Courseignore lang-->

    <postStartupActivity implementation="com.jetbrains.edu.learning.EduProjectActivity"/>
    <postStartupActivity implementation="com.jetbrains.edu.learning.agreement.UserAgreementProjectActivity"/>

    <registryKey key="edu.task.description.update.delay"
                 description="The delay in ms before loading page by Task Description view. \nRequires project reopening"
                 defaultValue="300"/>

    <applicationConfigurable groupId="tools" instance="com.jetbrains.edu.learning.settings.EduConfigurable"
                             id="Educational"
                             key="settings.education" bundle="messages.EduCoreBundle"/>

    <registryKey key="edu.marketplace.solutions.sharing.prompt.default.delay"
                 description="Delay of prompting second banner (in millis). Default value is equal to 14 days."
                 defaultValue="1209600000"/>

    <registryKey key="edu.marketplace.PostMarketplaceProjectToGitHub.completion.condition"
                 description="Course completion percentage, which should prompt the student to publish the project on GitHub"
                 defaultValue="80"/>

    <registryKey key="edu.learning.objects.storage.type"
                 description="Controls the way the original author data is stored in the project. This setting does not affect existing course projects, it affects only newly created projects"
                 defaultValue="[SQLite*|YAML]"/>

    <toolWindow id="Task" anchor="right" order="first"
                factoryClass="com.jetbrains.edu.learning.taskToolWindow.ui.TaskToolWindowFactory"
                icon="com.jetbrains.edu.EducationalCoreIcons.TaskToolWindow.CourseToolWindow"/>
    <toolWindow id="Educational.CheckDetails" anchor="bottom" canCloseContents="true" doNotActivateOnStart="true"
                factoryClass="com.jetbrains.edu.learning.checker.details.CheckDetailsToolWindowFactory"
                icon="com.jetbrains.edu.EducationalCoreIcons.CheckPanel.CheckDetailsToolWindow"/>

    <!-- placeholders -->
    <editorFactoryListener implementation="com.jetbrains.edu.learning.editor.EduEditorFactoryListener"/>
    <highlightingPassFactory implementation="com.jetbrains.edu.learning.placeholder.PlaceholderHighlightingPassFactory"/>
    <additionalTextAttributes scheme="Default" file="colorScheme/EduDefault.xml"/>
    <additionalTextAttributes scheme="Darcula" file="colorScheme/EduDarcula.xml"/>
    <registryKey key="edu.placeholder.highlighting.pass" defaultValue="false" restartRequired="true"
                 description="Render answer placeholders in JetBrains Academy courses using highlighting API"/>

    <!-- should be last, otherwise project tree will be changed with GradleTreeStructureProvider -->
    <highlightErrorFilter implementation="com.jetbrains.edu.learning.editor.EduHighlightErrorFilter"/>

    <!-- Rename -->
    <renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.SectionRenameProcessor" order="first"/>
    <renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.LessonRenameProcessor" order="first"/>
    <renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.TaskRenameProcessor" order="first"/>
    <renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.EduTaskFileRenameProcessor" order="first"/>

    <!-- Move -->
    <refactoring.moveHandler implementation="com.jetbrains.edu.learning.handlers.EduMoveDelegate" order="first"/>

    <!-- Notifications   -->
    <editorNotificationProvider
        implementation="com.jetbrains.edu.learning.placeholderDependencies.UnsolvedDependenciesNotificationProvider"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.learning.stepik.UpdateCourseNotificationProvider"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.learning.editor.EduTaskFileNotificationProvider"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.learning.yaml.YamlConfigNotificationProvider"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.coursecreator.framework.editor.SyncChangesEditorNotificationsProvider"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.learning.agreement.UserAgreementEditorNotificationsProvider"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.learning.stepik.hyperskill.InstallHyperskillPluginEditorNotificationsProvider"/>

    <!-- com.jetbrains.edu.learning.notification.EduNotificationManager.JETBRAINS_ACADEMY_GROUP_ID -->
    <notificationGroup id="JetBrains Academy" displayType="BALLOON"
                       bundle="messages.EduCoreBundle" key="notification.group.edu.tools"/>

    <!--suppress PluginXmlValidity -->
    <statistics.applicationUsagesCollector implementation="com.jetbrains.edu.learning.statistics.EduStateUsagesCollector"/>
    <statistics.counterUsagesCollector implementationClass="com.jetbrains.edu.learning.statistics.EduCounterUsageCollector"/>
    <applicationService serviceImplementation="com.jetbrains.edu.learning.EduSettings"/>
    <applicationService serviceImplementation="com.jetbrains.edu.learning.coursera.CourseraSettings"/>
    <httpRequestHandler implementation="com.jetbrains.edu.learning.stepik.builtInServer.StepikRestService"/>
    <httpRequestHandler implementation="com.jetbrains.edu.learning.taskToolWindow.ui.EduToolsResourcesRequestHandler"/>

    <registryKey key="edu.course.update.check.interval"
                 description="Sets is course up to date check interval in seconds"
                 defaultValue="18000"/>

    <!--for educators-->
    <xml.xmlSuppressionProvider
        implementation="com.jetbrains.edu.coursecreator.taskDescription.ShortcutInTaskDescriptionSuppressionProvider"/>
    <fileEditorProvider implementation="com.jetbrains.edu.coursecreator.framework.editor.EduSplitFileEditorProvider" order="first"/>

    <!-- Rename -->
    <renamePsiElementProcessor implementation="com.jetbrains.edu.coursecreator.handlers.rename.CCDescriptionFileRenameProcessor" order="first"/>

    <!-- Move -->
    <refactoring.moveHandler implementation="com.jetbrains.edu.coursecreator.handlers.move.CCSectionMoveHandlerDelegate"
                             order="first"/>
    <refactoring.moveHandler implementation="com.jetbrains.edu.coursecreator.handlers.move.CCLessonMoveHandlerDelegate"
                             order="first"/>
    <refactoring.moveHandler implementation="com.jetbrains.edu.coursecreator.handlers.move.CCTaskMoveHandlerDelegate"
                             order="first"/>

    <highlightErrorFilter implementation="com.jetbrains.edu.coursecreator.CCHighlightErrorFilter"/>

    <projectViewPane implementation="com.jetbrains.edu.learning.projectView.CourseViewPane"/>
    <editorActionHandler action="EditorBackSpace" implementationClass="com.jetbrains.edu.learning.editor.EduTypedHandler"
                         order="first"/>
    <editorActionHandler action="EditorDelete" implementationClass="com.jetbrains.edu.learning.editor.EduTypedHandler"
                         order="first"/>

    <editorActionHandler action="EditorCut" implementationClass="com.jetbrains.edu.learning.editor.EduCutTypedHandler"
                         order="first"/>
    <editorActionHandler action="EditorCutLineEnd" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
    <editorActionHandler action="EditorCutLineBackward" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
    <editorActionHandler action="EditorDeleteToLineEnd" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
    <editorActionHandler action="EditorDeleteToLineStart" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
    <editorActionHandler action="EditorDeleteLine" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
    <experimentalFeature id="edu.course.creator.split.editor" percentOfUsers="100" internalFeature="true">
      <description>Enables previous task view for guided projects</description>
    </experimentalFeature>
    <liveTemplateContext implementation="com.jetbrains.edu.coursecreator.taskDescription.HintTemplateContextType"/>
    <defaultLiveTemplates file="liveTemplates/hint.xml"/>
    <editorNotificationProvider implementation="com.jetbrains.edu.learning.yaml.GeneratedRemoteInfoNotificationProvider"/>
    <registryKey key="edu.course.creator.solve.all"
                 description="Enables `Solve All Tasks Before` action"
                 defaultValue="false"/>

    <writingAccessProvider implementation="com.jetbrains.edu.learning.editor.EditableFileProvider"/>
    <trailingSpacesOptionsProvider implementation="com.jetbrains.edu.learning.editor.TrailingSpacesOptionsAnswerTaskProvider"/>

    <experimentalFeature id="edu.course.sql" percentOfUsers="100" internalFeature="true">
      <description>Enables support for SQL courses</description>
    </experimentalFeature>
    <experimentalFeature id="edu.course.update.new" percentOfUsers="100">
      <description>Enable the new course update functionality to provide more efficient course updates</description>
    </experimentalFeature>
    <experimentalFeature id="edu.educator.help" percentOfUsers="100">
      <description>Open educator help for newly created CC courses; add Help button to the toolbar above course view</description>
    </experimentalFeature>

    <registryKey key="edu.course.creator.fl.sync.changes.merging.timespan"
                 description="The delay in ms before task file synchronization in the guided project for Course Creator.\nChanging the field requires reopening the project"
                 defaultValue="1000"/>

    <iconMapper mappingFile="EduToolsIconMappings.json"/>
    <themeMetadataProvider path="JetBrainsAcademyPlugin.themeMetadata.json"/>

    <coursesStorageProvider implementation="com.jetbrains.edu.learning.newproject.coursesStorage.JetBrainsAcademyCoursesStorageProvider"/>

    <registryKey key="edu.network.request.assertion.policy"
                 description="Assertion policy for network requests from EDT in JetBrains Academy plugin"
                 defaultValue="[OFF|LOG_ERROR*|EXCEPTION]"/>
  </extensions>

  <extensions defaultExtensionNs="Educational">
    <!-- Only for development purposes -->
    <configurator language="TEXT" implementationClass="com.jetbrains.edu.learning.configuration.PlainTextConfigurator"/>

    <optionsProvider instance="com.jetbrains.edu.learning.stepik.StepikOptions"/>
    <optionsProvider instance="com.jetbrains.edu.learning.coursera.CourseraOptions"/>
    <checkListener implementation="com.jetbrains.edu.learning.statistics.PostFeedbackCheckListener"/>
    <checkListener implementation="com.jetbrains.edu.coursecreator.validation.ValidationCheckListener"/>

    <coursesPlatformProviderFactory id="Marketplace" order="first"
                                    implementation="com.jetbrains.edu.learning.marketplace.newProjectUI.MarketplacePlatformProviderFactory"/>
    <coursesPlatformProviderFactory id="Hyperskill" order="after Marketplace"
                                    implementation="com.jetbrains.edu.learning.stepik.hyperskill.newProjectUI.HyperskillInstallPluginPlatformProviderFactory"/>
    <coursesPlatformProviderFactory id="Coursera" order="after Hyperskill"
                                    implementation="com.jetbrains.edu.learning.coursera.CourseraPlatformProviderFactory"/>


    <remoteTaskChecker implementation="com.jetbrains.edu.learning.coursera.CourseraTaskChecker"/>

    <!-- Course compatibility providers   -->
    <compatibilityProvider language="JAVA"
                           implementationClass="com.jetbrains.edu.learning.compatibility.JCourseCompatibilityProvider"/>
    <compatibilityProvider language="kotlin"
                           implementationClass="com.jetbrains.edu.learning.compatibility.KtCourseCompatibilityProvider"/>
    <compatibilityProvider language="Scala"
                           environment="Gradle"
                           implementationClass="com.jetbrains.edu.learning.compatibility.ScalaGradleCourseCompatibilityProvider"/>
    <compatibilityProvider language="Scala"
                           environment="sbt"
                           implementationClass="com.jetbrains.edu.learning.compatibility.ScalaSbtCourseCompatibilityProvider"/>
    <compatibilityProvider language="kotlin"
                           environment="Android"
                           implementationClass="com.jetbrains.edu.learning.compatibility.AndroidCourseCompatibilityProvider"/>
    <compatibilityProvider language="Python"
                           implementationClass="com.jetbrains.edu.learning.compatibility.PyCourseCompatibilityProvider"/>
    <compatibilityProvider language="Python"
                           environment="unittest"
                           implementationClass="com.jetbrains.edu.learning.compatibility.PyCourseCompatibilityProvider"/>
    <compatibilityProvider language="JavaScript"
                           implementationClass="com.jetbrains.edu.learning.compatibility.JsCourseCompatibilityProvider"/>
    <compatibilityProvider language="Rust"
                           implementationClass="com.jetbrains.edu.learning.compatibility.RsCourseCompatibilityProvider"/>
    <compatibilityProvider language="go"
                           implementationClass="com.jetbrains.edu.learning.compatibility.GoCourseCompatibilityProvider"/>
    <compatibilityProvider language="PHP"
                           implementationClass="com.jetbrains.edu.learning.compatibility.PhpCourseCompatibilityProvider"/>
    <compatibilityProvider language="SQL"
                           implementationClass="com.jetbrains.edu.learning.compatibility.SqlGradleCourseCompatibilityProvider"/>
    <compatibilityProvider language="Shell Script"
                           implementationClass="com.jetbrains.edu.learning.compatibility.ShellCourseCompatibilityProvider"/>

    <!--educator-->
    <optionsProvider instance="com.jetbrains.edu.coursecreator.settings.CCOptions"/>

    <pathMacroProvider implementation="com.jetbrains.edu.learning.checker.TaskRunConfigurationPathMacroProvider"/>

    <courseMetadataProcessor implementation="com.jetbrains.edu.learning.marketplace.lti.LtiCourseMetadataProcessor"/>
    <courseMetadataProcessor implementation="com.jetbrains.edu.learning.statistics.metadata.CoursePageExperimentMetadataProcessor"/>
    <courseMetadataProcessor implementation="com.jetbrains.edu.learning.statistics.metadata.EntryPointMetadataProcessor"/>
    <courseMetadataProcessor implementation="com.jetbrains.edu.learning.marketplace.metadata.OpenOnSiteLinkMetadataProcessor"/>
  </extensions>

  <xi:include href="/META-INF/Marketplace.xml" xpointer="xpointer(/idea-plugin/*)"/>
  <xi:include href="/META-INF/LTI.xml" xpointer="xpointer(/idea-plugin/*)"/>
  <xi:include href="/META-INF/course-storage.xml" xpointer="xpointer(/idea-plugin/*)"/>
  <extensions defaultExtensionNs="Educational">
    <optionsProvider instance="com.jetbrains.edu.learning.agreement.UserAgreementOptions"/>
  </extensions>
</idea-plugin>
