diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
deleted file mode 100644
index 48d889a..0000000
--- a/docker/docker-compose.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-version: '3.4'
-services:
- alfmarkdown-share:
- image: alfresco-share-alfmarkdown:development
- build:
- dockerfile: ./Dockerfile
- context: ../../../share-docker/target
- environment:
- CATALINA_OPTS: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8888"
- REPO_HOST: alfmarkdown-acs
- REPO_PORT: 8080
- ports:
- - "${share.port}:8080"
- - "${share.debug.port}:8888"
- depends_on:
- - alfmarkdown-acs
- alfmarkdown-acs:
- image: alfresco-content-services-alfmarkdown:development
- build:
- dockerfile: ./Dockerfile
- context: ../../../platform-docker/target
- environment:
- CATALINA_OPTS: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8888"
- ports:
- - "${acs.port}:8080"
- - "${acs.debug.port}:8888"
- volumes:
- - alfmarkdown-acs-volume:/usr/local/tomcat/alf_data
- depends_on:
- - alfmarkdown-postgres
- alfmarkdown-postgres:
- image: postgres:9.6
- environment:
- POSTGRES_DB: alfresco
- POSTGRES_USER: alfresco
- POSTGRES_PASSWORD: alfresco
- command: postgres -c max_connections=300 -c log_min_messages=LOG
- ports:
- - "${postgres.port}:5432"
- volumes:
- - alfmarkdown-db-volume:/var/lib/postgresql/data
- alfmarkdown-ass:
- image: alfresco/alfresco-search-services:1.2.0
- environment:
- SOLR_ALFRESCO_HOST: alfmarkdown-acs
- SOLR_ALFRESCO_PORT: 8080
- SOLR_SOLR_HOST: alfmarkdown-ass
- SOLR_SOLR_PORT: 8983
- SOLR_CREATE_ALFRESCO_DEFAULTS: alfresco,archive
- ports:
- - "8983:8983"
- volumes:
- - alfmarkdown-ass-volume:/opt/alfresco-search-services/contentstore
- - alfmarkdown-ass-volume:/opt/alfresco-search-services/data
- alfmarkdown-adw:
- image: quay.io/alfresco/alfresco-digital-workspace:2.0.0-adw
- environment:
- BASE_PATH: ./
- APP_CONFIG_ECM_HOST: http://localhost:${acs.port}
- ports:
- - "${adw.port}:8080"
- depends_on:
- - alfmarkdown-acs
- alfmarkdown-tengine:
- image: inteligr8/alfmarkdown-tengine:1.0-SNAPSHOT
- ports:
- - "${ate.port}:8090"
-volumes:
- alfmarkdown-acs-volume:
- external: true
- alfmarkdown-db-volume:
- external: true
- alfmarkdown-ass-volume:
- external: true
\ No newline at end of file
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
deleted file mode 100644
index acd1e04..0000000
--- a/integration-tests/pom.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
- 4.0.0
- alfmarkdown-integration-tests
- Integration Tests Module
- Integration Tests module for in-container integration testing - part of AIO - SDK 4.0
- jar
-
-
- com.inteligr8.alfresco.module
- alfmarkdown
- 1.0-SNAPSHOT
-
-
-
-
-
-
-
-
- com.inteligr8.alfresco.module
- alfmarkdown-platform
- 1.0-SNAPSHOT
- test
-
-
-
-
-
-
-
- src/test/resources
- true
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
-
- test-jar
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
-
-
- ${test.acs.endpoint.path}
-
-
-
-
-
-
-
-
- jrebel-it
-
-
-
- org.zeroturnaround
- jrebel-maven-plugin
-
- ${project.build.testOutputDirectory}
-
-
-
-
-
-
-
diff --git a/platform-docker/pom.xml b/platform-docker/pom.xml
deleted file mode 100644
index 2acd260..0000000
--- a/platform-docker/pom.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
- 4.0.0
- alfmarkdown-platform-docker
- Alfresco Platform/Repository Docker Module
- Platform/Repo Docker Module to generate the final Docker image
- jar
-
-
- com.inteligr8.alfresco.module
- alfmarkdown
- 1.0-SNAPSHOT
-
-
-
-
-
-
-
- com.inteligr8.alfresco.module
- alfmarkdown-platform
- ${project.version}
-
-
- com.inteligr8.alfresco.module
- alfmarkdown-integration-tests
- ${project.version}
- test
- tests
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
-
- collect-test-artifacts
- pre-integration-test
-
- copy-dependencies
-
-
- ${project.build.directory}/extensions
- compile
-
-
-
-
- collect-extensions
- package
-
- copy-dependencies
-
-
- ${project.build.directory}/extensions
- runtime
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-resources-plugin
-
-
- copy-and-filter-docker-resources
- validate
-
- copy-resources
-
-
- ${project.build.directory}
-
-
- src/main/docker
- true
-
- **/*.jar
- **/*.so
- **/*.gz
-
-
-
-
-
-
- copy-and-filter-docker-resources-non-filtered
- validate
-
- copy-resources
-
-
- ${project.build.directory}
-
-
- src/main/docker
- false
-
- **/*.jar
- **/*.so
- **/*.gz
-
-
-
-
-
-
-
-
-
-
diff --git a/platform-webapp/pom.xml b/platform-webapp/pom.xml
new file mode 100644
index 0000000..68f62ed
--- /dev/null
+++ b/platform-webapp/pom.xml
@@ -0,0 +1,62 @@
+
+
+
+ 4.0.0
+ alfmarkdown-platform-webapp
+ Alfmarkdown Platform/Repository Web Application
+ pom
+
+
+ com.inteligr8.alfresco.module
+ alfmarkdown
+ 1.0-SNAPSHOT
+
+
+
+
+ brian.long
+ Brian Long
+ brian@inteligr8.com
+
+
+
+
+
+ de.fmaul
+ javascript-console-repo
+ 0.6.0
+ amp
+ test
+
+
+ ${project.groupId}
+ alfmarkdown-platform
+ ${project.version}
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.19
+ true
+
+
+ com.inteligr8.alfresco:beedk-acs-lts-it-tile:1.0-SNAPSHOT
+ com.inteligr8.alfresco:beedk-acs-platform-webapp-tile:1.0-SNAPSHOT
+
+
+
+
+
+
+
+
+ inteligr8-releases
+ http://repos.yateslong.us/nexus/repository/inteligr8-public
+
+
+
diff --git a/platform-docker/src/main/docker/Dockerfile b/platform-webapp/src/main/docker/Dockerfile
similarity index 100%
rename from platform-docker/src/main/docker/Dockerfile
rename to platform-webapp/src/main/docker/Dockerfile
diff --git a/platform-docker/src/main/docker/alfresco-global.properties b/platform-webapp/src/main/docker/alfresco-global.properties
similarity index 100%
rename from platform-docker/src/main/docker/alfresco-global.properties
rename to platform-webapp/src/main/docker/alfresco-global.properties
diff --git a/platform-docker/src/main/docker/dev-log4j.properties b/platform-webapp/src/main/docker/dev-log4j.properties
similarity index 100%
rename from platform-docker/src/main/docker/dev-log4j.properties
rename to platform-webapp/src/main/docker/dev-log4j.properties
diff --git a/platform-docker/src/main/docker/disable-webscript-caching-context.xml b/platform-webapp/src/main/docker/disable-webscript-caching-context.xml
similarity index 100%
rename from platform-docker/src/main/docker/disable-webscript-caching-context.xml
rename to platform-webapp/src/main/docker/disable-webscript-caching-context.xml
diff --git a/platform-docker/src/main/docker/hotswap-agent.properties b/platform-webapp/src/main/docker/hotswap-agent.properties
similarity index 100%
rename from platform-docker/src/main/docker/hotswap-agent.properties
rename to platform-webapp/src/main/docker/hotswap-agent.properties
diff --git a/platform-docker/src/main/docker/license/README.md b/platform-webapp/src/main/docker/license/README.md
similarity index 100%
rename from platform-docker/src/main/docker/license/README.md
rename to platform-webapp/src/main/docker/license/README.md
diff --git a/pom.xml b/pom.xml
index 563c358..3bd73f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,435 +7,27 @@
com.inteligr8.alfresco.module
alfmarkdown
1.0-SNAPSHOT
- Markdown AIO
- All-In-One (AIO) project for SDK 4.0
+ AlfMarkdown
+ A Markdown suite of extensions for Alfresco
pom
-
- 3.3.0
-
-
-
4.1.0
- UTF-8
-
-
- org.alfresco
- acs-community-packaging
- 6.2.0-ea
- 6.2.0
-
-
- alfresco/alfresco-content-repository-community
- alfresco/alfresco-share
-
-
- 1.1.8
-
-
- 8180
- 9898
- alfmarkdown-acs
- 8080
- 8888
- 5555
- 8280
- 8190
-
-
-
+ community
+ 6.2.0-ga
+ 6.2.2
+
+ 8
+ 8
-
-
-
-
-
- junit
- junit
- test
-
-
- org.mockito
- mockito-all
- 1.9.5
- test
-
-
- org.apache.httpcomponents
- httpclient
- test
-
-
-
-
- ${alfresco.groupId}
- alfresco-remote-api
- provided
-
-
-
-
- org.alfresco.maven
- alfresco-rad
- ${alfresco.sdk.version}
- test
-
-
-
-
-
-
- ${alfresco.groupId}
- ${alfresco.bomDependencyArtifactId}
- ${alfresco.platform.version}
- pom
- import
-
-
-
-
- ${alfresco.groupId}
- share
- ${alfresco.share.version}
- war
- provided
-
-
- ${alfresco.groupId}
- share
- ${alfresco.share.version}
- classes
- provided
-
-
- ${alfresco.groupId}
- alfresco-web-framework-commons
- ${alfresco.share.version}
- classes
- provided
-
-
-
-
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-resources-plugin
- 3.1.0
-
- UTF-8
-
-
- ftl
- acp
- svg
- pdf
- doc
- docx
- xls
- xlsx
- ppt
- pptx
- bin
- lic
- swf
- zip
- msg
- jar
- ttf
- eot
- woff
- woff2
- css
- ico
- psd
- js
-
-
-
-
- org.zeroturnaround
- jrebel-maven-plugin
- ${jrebel.version}
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- 3.1.0
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
- 3.0.0-M1
-
-
- integration-test
- integration-test
-
- integration-test
-
-
-
- verify-test
- verify
-
- verify
-
-
-
-
-
- org.apache.maven.surefire
- surefire-junit47
- 3.0.0-M1
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
- 3.1.1
-
-
-
-
-
-
-
- src/main/resources
- true
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-resources-plugin
- false
-
-
-
-
- copy-and-filter-docker-resources
- validate
-
- copy-resources
-
-
- ${project.build.outputDirectory}/docker
-
-
- docker
- true
-
-
-
-
-
-
-
-
-
- net.alchim31.maven
- yuicompressor-maven-plugin
- 1.5.1
-
-
-
- compress-assembly
-
- compress
-
-
- ${project.basedir}/src/main/assembly/web
- ${project.basedir}/src/main/assembly/web
-
- **/webscripts/**
- **/site-webscripts/**
- **/META-INF/**
- **/*.lib.js
- **/*.css
- **/*-min.js
- **/*-min.css
- **/*.min.js
-
- true
- false
-
-
-
-
-
- compress-resources
-
- compress
-
-
-
- **/webscripts/**
- **/site-webscripts/**
- **/*.lib.js
- **/*.css
- **/*-min.js
- **/*-min.css
- **/*.min.js
-
- true
- false
-
-
-
-
-
-
-
-
-
- java8
-
- [1.8,11.0)
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.8.0
-
- 1.8
- 1.8
-
-
-
-
-
-
- java11
-
- [11.0,)
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.8.0
-
- 11
-
-
-
-
-
-
- jrebel
-
-
-
-
- org.zeroturnaround
- jrebel-maven-plugin
-
-
- generate-rebel-xml
- process-resources
-
- generate
-
-
-
-
-
-
- all
-
-
- ${project.build.outputDirectory}
- ${project.build.testOutputDirectory}
-
-
-
-
-
- true
-
-
-
-
-
-
-
- integration-tests
repo
- platform-docker
+ platform-webapp
share
- share-docker
+ share-webapp
tengine
-
-
-
- inteligr8-releases
- http://repos.yateslong.us/nexus/repository/inteligr8-private
-
-
- inteligr8-snapshots
- http://repos.yateslong.us/nexus/repository/inteligr8-snapshots
-
-
diff --git a/repo/build.gradle b/repo/build.gradle
deleted file mode 100644
index a598ff0..0000000
--- a/repo/build.gradle
+++ /dev/null
@@ -1,64 +0,0 @@
-buildscript {
- repositories {
- jcenter()
- mavenLocal()
- }
-
- dependencies {
- classpath group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.3.6'
- classpath group: 'com.parashift.amp', name: 'amp-plugin', version: '1.0-SNAPSHOT'
- }
-}
-
-apply plugin: 'alfresco-amp'
-
-allprojects {
- gradle.projectsEvaluated {
- tasks.withType(JavaCompile) {
- options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
- }
- }
-}
-
-version = "1.1.1"
-
-ext {
- alfresco = [:]
- alfresco.version = "5.0.1"
-}
-
-repositories {
- mavenCentral()
- maven { url "https://maven.alfresco.com/nexus/content/groups/public/" }
-
- maven {
- credentials {
- username project['alfresco.repo.private.username']
- password project['alfresco.repo.private.password']
- }
-
- url "https://maven.alfresco.com/nexus/content/groups/private/"
- }
- mavenLocal()
- flatDir name: 'localRepository', dirs: 'lib'
-}
-
-configurations {
- all*.exclude group: 'maven-plugins'
- all*.exclude group: 'org.jvnet.staxex'
-}
-
-dependencies {
- compile (group: "org.alfresco", name: "alfresco", version: "${alfresco.version}", classifier: "classes")
- compile 'org.slf4j:slf4j-api:1.7.5'
-}
-
-amp {
- id = "com.parashift." + project.name
- baseName = project.name
- alias = project.name
- version = project.version
- title = project.title
- description = project.description
- addLibDir("ampLib")
-}
diff --git a/repo/gradle.properties b/repo/gradle.properties
deleted file mode 100644
index ffa9ae3..0000000
--- a/repo/gradle.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-title=Markdown Preview Repo
-description=Allows Markdown files to be Previewed in Share
diff --git a/repo/pom.xml b/repo/pom.xml
index b7eab5d..84e792f 100644
--- a/repo/pom.xml
+++ b/repo/pom.xml
@@ -1,10 +1,11 @@
-
+
+
4.0.0
alfmarkdown-platform
- Alfresco Platform/Repository JAR Module
- Platform/Repo JAR Module (to be included in the alfresco.war) - part of AIO - SDK 4.0
-
+ Alfmarkdown Platform JAR Module
jar
@@ -12,20 +13,31 @@
alfmarkdown
1.0-SNAPSHOT
-
-
-
-
+
+
+ org.alfresco
+ alfresco-repository
+ 8.98
+ provided
+
-
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
-
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.19
+ true
+
+
+ com.inteligr8.alfresco:beedk-acs-platform-module-tile:1.0-SNAPSHOT
+ com.inteligr8:maven-private-deploy-tile:[1.0.0,2.0.0)
+
+
+
+
+
diff --git a/repo/settings.gradle b/repo/settings.gradle
deleted file mode 100644
index e7637e5..0000000
--- a/repo/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-rootProject.name = "parashift-mdpreview-repo"
diff --git a/repo/src/main/assembly/amp.xml b/repo/src/main/assembly/amp.xml
deleted file mode 100644
index 097775f..0000000
--- a/repo/src/main/assembly/amp.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
- build-amp-file
-
-
- amp
-
-
- false
-
-
-
-
- src/main/resources/alfresco/module/${project.artifactId}/module.properties
- true
-
-
-
- src/main/assembly/file-mapping.properties
- false
-
-
-
- src/main/resources/alfresco/module/${project.artifactId}/log4j.properties
- false
-
-
-
-
-
-
- src/main/assembly/web
- web
- true
-
- README.md
-
-
-
-
-
-
-
- lib
-
-
-
-
\ No newline at end of file
diff --git a/repo/src/main/assembly/file-mapping.properties b/repo/src/main/assembly/file-mapping.properties
deleted file mode 100644
index 501b3d6..0000000
--- a/repo/src/main/assembly/file-mapping.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-# Custom AMP to WAR location mappings
-
-#
-# The following property can be used to include the standard set of mappings.
-# The contents of this file will override any defaults. The default is
-# 'true', i.e. the default mappings will be augmented or modified by values in
-# this file.
-#
-# Default mappings are:
-#
-# /config=/WEB-INF/classes
-# /lib=/WEB-INF/lib
-# /licenses=/WEB-INF/licenses
-# /web/jsp=/jsp
-# /web/css=/css
-# /web/images=/images
-# /web/scripts=/scripts
-# /web/php=/php
-#
-include.default=true
-
-#
-# Custom mappings. If 'include.default' is false, then this is the complete set.
-# Map /web to / in AMP so we can override things like favicon.ico
-#
-/web=/
-
diff --git a/repo/src/main/assembly/web/README.md b/repo/src/main/assembly/web/README.md
deleted file mode 100644
index e3b1a7c..0000000
--- a/repo/src/main/assembly/web/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Web resources that should override out-of-the-box files
-
-Put here any web resources that should override out-of-the-box
-web resources, such as favicon.ico. They will then end up in the
-*/web* directory in the AMP, and applied to the WAR, and override
-any existing web resources in the Alfresco.WAR.
-
-**Note**. Module dependency needs to be set to amp for the web resources to be applied by MMT:
-
-`
-
- ${project.groupId}
- some-platform
- ${project.version}
- amp
-
-`
-
-**Important**. New web resources should not be located here, but instead
- in the usual place in the *src/main/resources/META-INF/resources* directory.
-
-
diff --git a/repo/src/main/resources/alfresco/templates/webscripts/mdpreview/path.get.desc.xml b/repo/src/main/extension/templates/webscripts/mdpreview/path.get.desc.xml
similarity index 100%
rename from repo/src/main/resources/alfresco/templates/webscripts/mdpreview/path.get.desc.xml
rename to repo/src/main/extension/templates/webscripts/mdpreview/path.get.desc.xml
diff --git a/repo/src/main/java/com/parashift/mdpreview/webscript/ContentGet.java b/repo/src/main/java/com/parashift/mdpreview/webscript/ContentGet.java
index 58e7ecd..ab0e230 100644
--- a/repo/src/main/java/com/parashift/mdpreview/webscript/ContentGet.java
+++ b/repo/src/main/java/com/parashift/mdpreview/webscript/ContentGet.java
@@ -19,7 +19,6 @@ import java.util.Map;
/**
* Created by cetra on 30/08/2016.
*/
-
@Component(value = "webscript.mdpreview.path.get")
public class ContentGet extends AbstractWebScript {
diff --git a/repo/src/main/resources/alfresco/module/alfmarkdown-platform/alfresco-global.properties b/repo/src/main/module/alfresco-global.properties
similarity index 100%
rename from repo/src/main/resources/alfresco/module/alfmarkdown-platform/alfresco-global.properties
rename to repo/src/main/module/alfresco-global.properties
diff --git a/repo/src/main/resources/alfresco/module/alfmarkdown-platform/log4j.properties b/repo/src/main/module/log4j.properties
similarity index 100%
rename from repo/src/main/resources/alfresco/module/alfmarkdown-platform/log4j.properties
rename to repo/src/main/module/log4j.properties
diff --git a/repo/src/main/resources/alfresco/module/alfmarkdown-platform/model/mta-model.xml b/repo/src/main/module/model/mta-model.xml
similarity index 100%
rename from repo/src/main/resources/alfresco/module/alfmarkdown-platform/model/mta-model.xml
rename to repo/src/main/module/model/mta-model.xml
diff --git a/repo/src/main/resources/alfresco/module/alfmarkdown-platform/module-context.xml b/repo/src/main/module/module-context.xml
similarity index 100%
rename from repo/src/main/resources/alfresco/module/alfmarkdown-platform/module-context.xml
rename to repo/src/main/module/module-context.xml
diff --git a/repo/src/main/resources/alfresco/module/alfmarkdown-platform/module.properties b/repo/src/main/module/module.properties
similarity index 100%
rename from repo/src/main/resources/alfresco/module/alfmarkdown-platform/module.properties
rename to repo/src/main/module/module.properties
diff --git a/run.bat b/run.bat
deleted file mode 100644
index c470dd3..0000000
--- a/run.bat
+++ /dev/null
@@ -1,141 +0,0 @@
-@ECHO OFF
-
-SET COMPOSE_FILE_PATH=%CD%\target\classes\docker\docker-compose.yml
-
-IF [%M2_HOME%]==[] (
- SET MVN_EXEC=mvn
-)
-
-IF NOT [%M2_HOME%]==[] (
- SET MVN_EXEC=%M2_HOME%\bin\mvn
-)
-
-IF [%1]==[] (
- echo "Usage: %0 {build_start|build_start_it_supported|start|stop|purge|tail|reload_tengine|reload_share|reload_acs|build_test|test}"
- GOTO END
-)
-
-IF %1==build_start (
- CALL :down
- CALL :build
- CALL :start
- CALL :tail
- GOTO END
-)
-IF %1==build_start_it_supported (
- CALL :down
- CALL :build
- CALL :prepare-test
- CALL :start
- CALL :tail
- GOTO END
-)
-IF %1==start (
- CALL :start
- CALL :tail
- GOTO END
-)
-IF %1==stop (
- CALL :down
- GOTO END
-)
-IF %1==purge (
- CALL:down
- CALL:purge
- GOTO END
-)
-IF %1==tail (
- CALL :tail
- GOTO END
-)
-IF %1==reload_share (
- CALL :build_share
- CALL :start_share
- CALL :tail
- GOTO END
-)
-IF %1==reload_acs (
- CALL :build_acs
- CALL :start_acs
- CALL :tail
- GOTO END
-)
-IF %1==reload_tengine (
- CALL :build_tengine
- CALL :start_tengine
- CALL :tail
- GOTO END
-)
-IF %1==build_test (
- CALL :down
- CALL :build
- CALL :prepare-test
- CALL :start
- CALL :test
- CALL :tail_all
- CALL :down
- GOTO END
-)
-IF %1==test (
- CALL :test
- GOTO END
-)
-echo "Usage: %0 {build_start|start|stop|purge|tail|reload_tengine|reload_share|reload_acs|build_test|test}"
-:END
-EXIT /B %ERRORLEVEL%
-
-:start
- docker volume create alfmarkdown-acs-volume
- docker volume create alfmarkdown-db-volume
- docker volume create alfmarkdown-ass-volume
- docker-compose -f "%COMPOSE_FILE_PATH%" up --build -d
-EXIT /B 0
-:start_share
- docker-compose -f "%COMPOSE_FILE_PATH%" up --build -d alfmarkdown-share
-EXIT /B 0
-:start_acs
- docker-compose -f "%COMPOSE_FILE_PATH%" up --build -d alfmarkdown-acs
-EXIT /B 0
-:start_tengine
- docker-compose -f "%COMPOSE_FILE_PATH%" up -d alfmarkdown-tengine
-EXIT /B 0
-:down
- if exist "%COMPOSE_FILE_PATH%" (
- docker-compose -f "%COMPOSE_FILE_PATH%" down
- )
-EXIT /B 0
-:build
- call %MVN_EXEC% -Pdocker clean package
-EXIT /B 0
-:build_share
- docker-compose -f "%COMPOSE_FILE_PATH%" kill alfmarkdown-share
- docker-compose -f "%COMPOSE_FILE_PATH%" rm -f alfmarkdown-share
- call %MVN_EXEC% clean package -pl share,share-docker
-EXIT /B 0
-:build_acs
- docker-compose -f "%COMPOSE_FILE_PATH%" kill alfmarkdown-acs
- docker-compose -f "%COMPOSE_FILE_PATH%" rm -f alfmarkdown-acs
- call %MVN_EXEC% clean package -pl integration-tests,repo,platform-docker
-EXIT /B 0
-:build_tengine
- docker-compose -f "%COMPOSE_FILE_PATH%" kill alfmarkdown-tengine
- docker-compose -f "%COMPOSE_FILE_PATH%" rm -f alfmarkdown-tengine
- call %MVN_EXEC% clean package -Pdocker -pl tengine
-EXIT /B 0
-:tail
- docker-compose -f "%COMPOSE_FILE_PATH%" logs -f
-EXIT /B 0
-:tail_all
- docker-compose -f "%COMPOSE_FILE_PATH%" logs --tail="all"
-EXIT /B 0
-:prepare-test
- call %MVN_EXEC% verify -DskipTests=true -pl repo,tengine,integration-tests,platform-docker
-EXIT /B 0
-:test
- call %MVN_EXEC% verify -pl repo,tengine,integration-tests
-EXIT /B 0
-:purge
- docker volume rm -f alfmarkdown-acs-volume
- docker volume rm -f alfmarkdown-db-volume
- docker volume rm -f alfmarkdown-ass-volume
-EXIT /B 0
diff --git a/run.sh b/run.sh
deleted file mode 100644
index 97b19f9..0000000
--- a/run.sh
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/bin/sh
-
-export COMPOSE_FILE_PATH="${PWD}/target/classes/docker/docker-compose.yml"
-
-if [ -z "${M2_HOME}" ]; then
- export MVN_EXEC="mvn"
-else
- export MVN_EXEC="${M2_HOME}/bin/mvn"
-fi
-
-start() {
- docker volume create alfmarkdown-acs-volume
- docker volume create alfmarkdown-db-volume
- docker volume create alfmarkdown-ass-volume
- docker-compose -f "$COMPOSE_FILE_PATH" up --build -d
-}
-
-start_share() {
- docker-compose -f "$COMPOSE_FILE_PATH" up --build -d alfmarkdown-share
-}
-
-start_acs() {
- docker-compose -f "$COMPOSE_FILE_PATH" up --build -d alfmarkdown-acs
-}
-
-start_tengine() {
- docker-compose -f "$COMPOSE_FILE_PATH" up -d alfmarkdown-tengine
-}
-
-start_adw() {
- docker-compose -f "$COMPOSE_FILE_PATH" up -d alfmarkdown-adw
-}
-
-down() {
- if [ -f "$COMPOSE_FILE_PATH" ]; then
- docker-compose -f "$COMPOSE_FILE_PATH" down
- fi
-}
-
-purge() {
- docker volume rm -f alfmarkdown-acs-volume
- docker volume rm -f alfmarkdown-db-volume
- docker volume rm -f alfmarkdown-ass-volume
-}
-
-build() {
- $MVN_EXEC -Pdocker clean package
-}
-
-build_share() {
- docker-compose -f "$COMPOSE_FILE_PATH" kill alfmarkdown-share
- yes | docker-compose -f "$COMPOSE_FILE_PATH" rm -f alfmarkdown-share
- $MVN_EXEC clean package -pl share,share-docker
-}
-
-build_acs() {
- docker-compose -f "$COMPOSE_FILE_PATH" kill alfmarkdown-acs
- yes | docker-compose -f "$COMPOSE_FILE_PATH" rm -f alfmarkdown-acs
- $MVN_EXEC clean package -pl integration-tests,repo,platform-docker
-}
-
-build_tengine() {
- docker-compose -f "$COMPOSE_FILE_PATH" kill alfmarkdown-tengine
- yes | docker-compose -f "$COMPOSE_FILE_PATH" rm -f alfmarkdown-tengine
- $MVN_EXEC clean package -Pdocker -pl tengine
-}
-
-tail() {
- docker-compose -f "$COMPOSE_FILE_PATH" logs -f
-}
-
-tail_all() {
- docker-compose -f "$COMPOSE_FILE_PATH" logs --tail="all"
-}
-
-prepare_test() {
- $MVN_EXEC verify -DskipTests=true -pl repo,tengine,integration-tests,platform-docker
-}
-
-test() {
- $MVN_EXEC verify -pl repo,tengine,integration-tests
-}
-
-case "$1" in
- build_start)
- down
- build
- start
- tail
- ;;
- build_start_it_supported)
- down
- build
- prepare_test
- start
- tail
- ;;
- start)
- start
- tail
- ;;
- stop)
- down
- ;;
- purge)
- down
- purge
- ;;
- tail)
- tail
- ;;
- reload_share)
- build_share
- start_share
- tail
- ;;
- reload_acs)
- build_acs
- start_acs
- tail
- ;;
- reload_tengine)
- build_tengine
- start_tengine
- tail
- ;;
- build_test)
- down
- build
- prepare_test
- start
- test
- tail_all
- down
- ;;
- test)
- test
- ;;
- *)
- echo "Usage: $0 {build_start|build_start_it_supported|start|stop|purge|tail|reload_tengine|reload_share|reload_acs|build_test|test}"
-esac
diff --git a/share-docker/pom.xml b/share-docker/pom.xml
deleted file mode 100644
index cfb7a62..0000000
--- a/share-docker/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
- 4.0.0
- alfmarkdown-share-docker
- Alfresco Share Docker Module
- Share Docker Module to generate the final Docker image
- jar
-
-
- com.inteligr8.alfresco.module
- alfmarkdown
- 1.0-SNAPSHOT
-
-
-
-
-
-
-
- com.inteligr8.alfresco.module
- alfmarkdown-share
- ${project.version}
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
-
- collect-extensions
- package
-
- copy-dependencies
-
-
- ${project.build.directory}/extensions
- runtime
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-resources-plugin
-
-
- copy-and-filter-docker-resources
- validate
-
- copy-resources
-
-
- ${project.build.directory}
-
-
- src/main/docker
- true
-
-
-
-
-
-
-
-
-
diff --git a/share-webapp/pom.xml b/share-webapp/pom.xml
new file mode 100644
index 0000000..35cb968
--- /dev/null
+++ b/share-webapp/pom.xml
@@ -0,0 +1,70 @@
+
+
+
+ 4.0.0
+ alfmarkdown-share-webapp
+ Alfmarkdown Share Web Application
+ pom
+
+
+ com.inteligr8.alfresco.module
+ alfmarkdown
+ 1.0-SNAPSHOT
+
+
+
+
+ brian.long
+ Brian Long
+ brian@inteligr8.com
+
+
+
+
+ 6.2.2
+
+ ${basedir}/../platform-webapp/target
+ ${project.sibling.build.directory}/war
+ ${project.sibling.build.warDirectory}/content-services-community-${alfresco.platform.version}.war
+
+
+
+
+ de.fmaul
+ javascript-console-share
+ 0.6.0
+ amp
+ test
+
+
+ ${project.groupId}
+ alfmarkdown-share
+ ${project.version}
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.19
+ true
+
+
+ com.inteligr8.alfresco:beedk-acs-platform-sibling-it-tile:1.0-SNAPSHOT
+ com.inteligr8.alfresco:beedk-acs-share-webapp-tile:1.0-SNAPSHOT
+
+
+
+
+
+
+
+
+ inteligr8-releases
+ http://repos.yateslong.us/nexus/repository/inteligr8-public
+
+
+
diff --git a/share-docker/src/main/docker/Dockerfile b/share-webapp/src/main/docker/Dockerfile
similarity index 80%
rename from share-docker/src/main/docker/Dockerfile
rename to share-webapp/src/main/docker/Dockerfile
index 6b43fb2..6f68be4 100644
--- a/share-docker/src/main/docker/Dockerfile
+++ b/share-webapp/src/main/docker/Dockerfile
@@ -12,5 +12,5 @@ RUN java -jar $TOMCAT_DIR/alfresco-mmt/alfresco-mmt*.jar install \
COPY share-config-custom.xml $TOMCAT_DIR/shared/classes/alfresco/web-extension
-COPY log4j.properties $TOMCAT_DIR/webapps/share/WEB-INF/classes
-COPY hotswap-agent.properties $TOMCAT_DIR/webapps/share/WEB-INF/classes
\ No newline at end of file
+COPY log4j.properties $TOMCAT_DIR/shared/classes
+COPY hotswap-agent.properties $TOMCAT_DIR/shared/classes
diff --git a/share-docker/src/main/docker/hotswap-agent.properties b/share-webapp/src/main/docker/hotswap-agent.properties
similarity index 90%
rename from share-docker/src/main/docker/hotswap-agent.properties
rename to share-webapp/src/main/docker/hotswap-agent.properties
index fbb03ad..1040460 100644
--- a/share-docker/src/main/docker/hotswap-agent.properties
+++ b/share-webapp/src/main/docker/hotswap-agent.properties
@@ -11,7 +11,7 @@ autoHotswap=true
# i.e. monitor /target/classes
# should work with extraClasspath=${project.build.outputDirectory}
# If not try
-extraClasspath=/usr/local/tomcat/hotswap-agent
+extraClasspath=/usr/local/tomcat/hotswap-agent/target/classes
# Comma separated list of disabled plugins
@@ -24,12 +24,12 @@ disabledPlugins=Hibernate,Spring
#
# Load web application resources (such as HTML, JSP, CSS, ...) from this directory prior to default processing.
# Use this setting to set to serve resources from source directory directly (e.g. src/main/webapp).
-extraWebappContext=/usr/local/tomcat/hotswap-agent/alfmarkdown-share/target/classes/META-INF/resources;
+extraWebappContext=/usr/local/tomcat/hotswap-agent/target/classes/META-INF;
# Load static web resources from different directory.
#
# This setting is dependent on application server plugin(Jetty, Tomcat, JBoss, ...)
-webappDir=/usr/local/tomcat/hotswap-agent/alfmarkdown-share/target/classes/META-INF/resources;
+webappDir=/usr/local/tomcat/hotswap-agent/target/classes/META-INF;
# Watch for changes in a directory (resources only).
#
diff --git a/share-docker/src/main/docker/log4j.properties b/share-webapp/src/main/docker/log4j.properties
similarity index 100%
rename from share-docker/src/main/docker/log4j.properties
rename to share-webapp/src/main/docker/log4j.properties
diff --git a/share-docker/src/main/docker/share-config-custom.xml b/share-webapp/src/main/docker/share-config-custom.xml
similarity index 100%
rename from share-docker/src/main/docker/share-config-custom.xml
rename to share-webapp/src/main/docker/share-config-custom.xml
diff --git a/share/pom.xml b/share/pom.xml
index b65b287..d0a8921 100644
--- a/share/pom.xml
+++ b/share/pom.xml
@@ -1,39 +1,51 @@
-
+
+
4.0.0
alfmarkdown-share
- Alfresco Share JAR Module
+ Alfmarkdown Share JAR Module
jar
- Sample Share JAR Module (to be included in the share.war) - part of AIO - SDK 4.0
com.inteligr8.alfresco.module
alfmarkdown
1.0-SNAPSHOT
-
+
+ ${basedir}/../repo/target
+ ${project.sibling.build.directory}/war
+ ${project.sibling.build.warDirectory}/content-services-community-${alfresco.platform.version}.war
-
-
+
- ${alfresco.groupId}
+ org.alfresco
share
+ ${alfresco.share.version}
classes
+ provided
-
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
-
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.19
+ true
+
+
+ com.inteligr8.alfresco:beedk-acs-platform-sibling-it-tile:1.0-SNAPSHOT
+ com.inteligr8.alfresco:beedk-acs-share-module-tile:1.0-SNAPSHOT
+ com.inteligr8:maven-private-deploy-tile:[1.0.0,2.0.0)
+
+
+
+
+
diff --git a/share/src/main/assembly/amp.xml b/share/src/main/assembly/amp.xml
deleted file mode 100644
index 9917d7b..0000000
--- a/share/src/main/assembly/amp.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
- build-amp-file
-
-
- amp
-
-
- false
-
-
-
-
- src/main/resources/alfresco/module/${project.artifactId}/module.properties
- true
-
-
-
- src/main/assembly/file-mapping.properties
- false
-
-
-
- src/main/resources/alfresco/module/${project.artifactId}/log4j.properties
- false
-
-
-
-
-
-
- src/main/assembly/web
- web
- true
-
- README.md
-
-
-
-
-
-
-
- lib
-
-
-
-
\ No newline at end of file
diff --git a/share/src/main/assembly/file-mapping.properties b/share/src/main/assembly/file-mapping.properties
deleted file mode 100644
index 501b3d6..0000000
--- a/share/src/main/assembly/file-mapping.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-# Custom AMP to WAR location mappings
-
-#
-# The following property can be used to include the standard set of mappings.
-# The contents of this file will override any defaults. The default is
-# 'true', i.e. the default mappings will be augmented or modified by values in
-# this file.
-#
-# Default mappings are:
-#
-# /config=/WEB-INF/classes
-# /lib=/WEB-INF/lib
-# /licenses=/WEB-INF/licenses
-# /web/jsp=/jsp
-# /web/css=/css
-# /web/images=/images
-# /web/scripts=/scripts
-# /web/php=/php
-#
-include.default=true
-
-#
-# Custom mappings. If 'include.default' is false, then this is the complete set.
-# Map /web to / in AMP so we can override things like favicon.ico
-#
-/web=/
-
diff --git a/share/src/main/assembly/web/README.md b/share/src/main/assembly/web/README.md
deleted file mode 100644
index 0901911..0000000
--- a/share/src/main/assembly/web/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Web resources that should override out-of-the-box files
-
-Put here any web resources that should override out-of-the-box
-web resources, such as favicon.ico. They will then end up in the
-*/web* directory in the AMP, and applied to the WAR, and override
-any existing web resources in the Share.WAR.
-
-**Note**. Module dependency needs to be set to amp for the web resources to be applied by MMT:
-
-`
-
- ${project.groupId}
- some-share
- ${project.version}
- amp
-
-`
-
-**Important**. New web resources should not be located here, but instead
- in the usual place in the *src/main/resources/META-INF/resources//* directory.
-
-
diff --git a/share/src/main/resources/alfresco/mdpreview-config.xml b/share/src/main/extension/mdpreview-config.xml
similarity index 100%
rename from share/src/main/resources/alfresco/mdpreview-config.xml
rename to share/src/main/extension/mdpreview-config.xml
diff --git a/share/src/main/resources/alfresco/web-extension/mdpreview-context.xml b/share/src/main/extension/mdpreview-context.xml
similarity index 89%
rename from share/src/main/resources/alfresco/web-extension/mdpreview-context.xml
rename to share/src/main/extension/mdpreview-context.xml
index 0c0c209..1c0dc70 100644
--- a/share/src/main/resources/alfresco/web-extension/mdpreview-context.xml
+++ b/share/src/main/extension/mdpreview-context.xml
@@ -15,7 +15,7 @@
- classpath:alfresco/mdpreview-config.xml
+ classpath:${alfresco.ext.path}/mdpreview-config.xml
@@ -23,7 +23,7 @@
- alfresco.messages.mdpreview
+ ${alfresco.ext.package}.messages.mdpreview
diff --git a/share/src/main/resources/alfresco/messages/mdpreview.properties b/share/src/main/extension/messages/mdpreview.properties
similarity index 100%
rename from share/src/main/resources/alfresco/messages/mdpreview.properties
rename to share/src/main/extension/messages/mdpreview.properties
diff --git a/share/src/main/resources/alfresco/site-data/extensions/markdown-preview-extension.xml b/share/src/main/extension/site-data/extensions/markdown-preview-extension.xml
similarity index 51%
rename from share/src/main/resources/alfresco/site-data/extensions/markdown-preview-extension.xml
rename to share/src/main/extension/site-data/extensions/markdown-preview-extension.xml
index 658d0fd..841dd8c 100644
--- a/share/src/main/resources/alfresco/site-data/extensions/markdown-preview-extension.xml
+++ b/share/src/main/extension/site-data/extensions/markdown-preview-extension.xml
@@ -1,7 +1,7 @@
- Parashift Markdown Preview
+ ${project.artifactId} Markdown Preview
${project.version}
true
@@ -9,7 +9,10 @@
org.alfresco.components.preview
com.parashift.markdown.preview-config
+ /res/lib/highlightjs/hightlight.pack.js
/res/components/preview/MarkDown.js
+ /res/lib/highlightjs/hightlight-init.js
+ /res/lib/highlightjs/default.css
/res/components/preview/MarkDown.css
@@ -17,24 +20,31 @@
org.alfresco.components.documentlibrary
com.parashift.markdown.preview-config
+ /res/lib/highlightjs/hightlight.pack.js
/res/components/preview/MarkDown.js
+ /res/lib/highlightjs/hightlight-init.js
+ /res/highlightjs/default.css
/res/components/preview/MarkDown.css
- Showdown Library Override
- ${project.version}
+ Markdown-It Library
+ 12.0.4
true
-
-
-
+
+
+
+
+
+
+
diff --git a/share/src/main/resources/alfresco/site-data/pages/markdown-edit.xml b/share/src/main/extension/site-data/pages/markdown-edit.xml
similarity index 100%
rename from share/src/main/resources/alfresco/site-data/pages/markdown-edit.xml
rename to share/src/main/extension/site-data/pages/markdown-edit.xml
diff --git a/share/src/main/resources/alfresco/site-data/template-instances/markdown-edit.xml b/share/src/main/extension/site-data/template-instances/markdown-edit.xml
similarity index 100%
rename from share/src/main/resources/alfresco/site-data/template-instances/markdown-edit.xml
rename to share/src/main/extension/site-data/template-instances/markdown-edit.xml
diff --git a/share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.desc.xml b/share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.desc.xml
similarity index 100%
rename from share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.desc.xml
rename to share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.desc.xml
diff --git a/share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.head.ftl b/share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.head.ftl
similarity index 100%
rename from share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.head.ftl
rename to share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.head.ftl
diff --git a/share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.html.ftl b/share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.html.ftl
similarity index 74%
rename from share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.html.ftl
rename to share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.html.ftl
index 16fca57..ea05f3e 100644
--- a/share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.html.ftl
+++ b/share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.html.ftl
@@ -2,11 +2,14 @@
<#-- CSS Dependencies -->
<@link href="${url.context}/res/components/preview/MarkDown.css" group="markdown"/>
<@link href="${url.context}/res/components/markdown-edit.css" group="markdown"/>
+ <@link href="${url.context}/res/lib/highlightjs/default.css" group="markdown"/>
@>
<@markup id="js">
<#-- JavaScript Dependencies -->
+ <@script src="${url.context}/res/lib/highlightjs/highlight.pack.js" group="markdown"/>
<@script src="${url.context}/res/components/markdown-edit.js" group="markdown"/>
+ <@script src="${url.context}/res/lib/highlightjs/highlight-init.js" group="markdown"/>
@>
@@ -20,8 +23,7 @@
diff --git a/share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.js b/share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.js
similarity index 100%
rename from share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.js
rename to share/src/main/extension/site-webscripts/com/parashift/markdown/edit/markdown-edit.get.js
diff --git a/share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/preview-config/web-preview.get.js b/share/src/main/extension/site-webscripts/com/parashift/markdown/preview-config/web-preview.get.js
similarity index 100%
rename from share/src/main/resources/alfresco/site-webscripts/com/parashift/markdown/preview-config/web-preview.get.js
rename to share/src/main/extension/site-webscripts/com/parashift/markdown/preview-config/web-preview.get.js
diff --git a/share/src/main/resources/alfresco/templates/com/parashift/markdown-edit.ftl b/share/src/main/extension/templates/com/parashift/markdown-edit.ftl
similarity index 100%
rename from share/src/main/resources/alfresco/templates/com/parashift/markdown-edit.ftl
rename to share/src/main/extension/templates/com/parashift/markdown-edit.ftl
diff --git a/share/src/main/resources/alfresco/module/alfmarkdown-share/log4j.properties b/share/src/main/module/log4j.properties
similarity index 100%
rename from share/src/main/resources/alfresco/module/alfmarkdown-share/log4j.properties
rename to share/src/main/module/log4j.properties
diff --git a/share/src/main/resources/alfresco/module/alfmarkdown-share/module.properties b/share/src/main/module/module.properties
similarity index 100%
rename from share/src/main/resources/alfresco/module/alfmarkdown-share/module.properties
rename to share/src/main/module/module.properties
diff --git a/share/src/main/resources/META-INF/components/documentlibrary/actions/document-markdown-edit-16.png b/share/src/main/web/components/documentlibrary/actions/document-markdown-edit-16.png
similarity index 100%
rename from share/src/main/resources/META-INF/components/documentlibrary/actions/document-markdown-edit-16.png
rename to share/src/main/web/components/documentlibrary/actions/document-markdown-edit-16.png
diff --git a/share/src/main/resources/META-INF/components/images/filetypes/markdown-file-16.png b/share/src/main/web/components/images/filetypes/markdown-file-16.png
similarity index 100%
rename from share/src/main/resources/META-INF/components/images/filetypes/markdown-file-16.png
rename to share/src/main/web/components/images/filetypes/markdown-file-16.png
diff --git a/share/src/main/resources/META-INF/components/markdown-edit.css b/share/src/main/web/components/markdown-edit.css
similarity index 100%
rename from share/src/main/resources/META-INF/components/markdown-edit.css
rename to share/src/main/web/components/markdown-edit.css
diff --git a/share/src/main/resources/META-INF/components/markdown-edit.js b/share/src/main/web/components/markdown-edit.js
similarity index 72%
rename from share/src/main/resources/META-INF/components/markdown-edit.js
rename to share/src/main/web/components/markdown-edit.js
index d3d0b45..b723bc9 100644
--- a/share/src/main/resources/META-INF/components/markdown-edit.js
+++ b/share/src/main/web/components/markdown-edit.js
@@ -1,4 +1,5 @@
-require(["dojo/dom", "dojo/query", "dojo/on", "dojo/request", "showdown", "showdown-github", "showdown-table", "dojo/domReady!"], function(dom, query, on, request, showdown, showdownGithub, showdownTable){
+require(["dojo/dom", "dojo/query", "dojo/on", "dojo/request", "markdown-it", "markdown-it-deflist", "markdown-it-emoji", "markdown-it-footnote", "markdown-it-ins", "markdown-it-sub", "markdown-it-sup", "dojo/domReady!"],
+ function(dom, query, on, request, MarkdownIt, MarkdownItDefList, MarkdownItEmoji, MarkdownItFootnote, MarkdownItIns, MarkdownItSub, MarkdownItSup){
function resizeFrame(elem) {
elem.style.height = (window.innerHeight - 280) + "px";
@@ -14,14 +15,30 @@ require(["dojo/dom", "dojo/query", "dojo/on", "dojo/request", "showdown", "showd
var locationPath = Alfresco.constants.PROXY_URI_RELATIVE + "markdown" + nodeData.item.location.repoPath + "/";
+
+ var mdOpts = {
+ html: true,
+ typographer: true,
+ highlight: function (str, lang) {
+ if (lang && hljs.getLanguage(lang)) {
+ try {
+ return hljs.highlight(lang, str).value;
+ } catch (__) {}
+ }
+
+ return ''; // use external default escaping
+ }
+ };
+
+ var md = new MarkdownIt(mdOpts)
+ .use(new MarkdownItIns())
+ .use(new MarkdownItSub())
+ .use(new MarkdownItSuper())
+ .use(new MarkdownItEmoji())
+ .use(new MarkdownItFootnote())
+ .use(new MarkdownItDefList());
- //Once we have the content, let's create a converter and add the html to the div element
- var converter = new showdown.Converter({
- extensions: [
- function() {
- return [{
- type: 'output',
- filter: function(source) {
+ var translateImageSrc = function(source) {
return source.replace(/
+
+*/
+
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ background: #F0F0F0;
+}
+
+
+/* Base color: saturation 0; */
+
+.hljs,
+.hljs-subst {
+ color: #444;
+}
+
+.hljs-comment {
+ color: #888888;
+}
+
+.hljs-keyword,
+.hljs-attribute,
+.hljs-selector-tag,
+.hljs-meta-keyword,
+.hljs-doctag,
+.hljs-name {
+ font-weight: bold;
+}
+
+
+/* User color: hue: 0 */
+
+.hljs-type,
+.hljs-string,
+.hljs-number,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-quote,
+.hljs-template-tag,
+.hljs-deletion {
+ color: #880000;
+}
+
+.hljs-title,
+.hljs-section {
+ color: #880000;
+ font-weight: bold;
+}
+
+.hljs-regexp,
+.hljs-symbol,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-link,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #BC6060;
+}
+
+
+/* Language color: hue: 90; */
+
+.hljs-literal {
+ color: #78A960;
+}
+
+.hljs-built_in,
+.hljs-bullet,
+.hljs-code,
+.hljs-addition {
+ color: #397300;
+}
+
+
+/* Meta color: hue: 200 */
+
+.hljs-meta {
+ color: #1f7199;
+}
+
+.hljs-meta-string {
+ color: #4d99bf;
+}
+
+
+/* Misc effects */
+
+.hljs-emphasis {
+ font-style: italic;
+}
+
+.hljs-strong {
+ font-weight: bold;
+}
diff --git a/share/src/main/web/lib/highlightjs/github.css b/share/src/main/web/lib/highlightjs/github.css
new file mode 100644
index 0000000..791932b
--- /dev/null
+++ b/share/src/main/web/lib/highlightjs/github.css
@@ -0,0 +1,99 @@
+/*
+
+github.com style (c) Vasily Polovnyov
+
+*/
+
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #333;
+ background: #f8f8f8;
+}
+
+.hljs-comment,
+.hljs-quote {
+ color: #998;
+ font-style: italic;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-subst {
+ color: #333;
+ font-weight: bold;
+}
+
+.hljs-number,
+.hljs-literal,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-tag .hljs-attr {
+ color: #008080;
+}
+
+.hljs-string,
+.hljs-doctag {
+ color: #d14;
+}
+
+.hljs-title,
+.hljs-section,
+.hljs-selector-id {
+ color: #900;
+ font-weight: bold;
+}
+
+.hljs-subst {
+ font-weight: normal;
+}
+
+.hljs-type,
+.hljs-class .hljs-title {
+ color: #458;
+ font-weight: bold;
+}
+
+.hljs-tag,
+.hljs-name,
+.hljs-attribute {
+ color: #000080;
+ font-weight: normal;
+}
+
+.hljs-regexp,
+.hljs-link {
+ color: #009926;
+}
+
+.hljs-symbol,
+.hljs-bullet {
+ color: #990073;
+}
+
+.hljs-built_in,
+.hljs-builtin-name {
+ color: #0086b3;
+}
+
+.hljs-meta {
+ color: #999;
+ font-weight: bold;
+}
+
+.hljs-deletion {
+ background: #fdd;
+}
+
+.hljs-addition {
+ background: #dfd;
+}
+
+.hljs-emphasis {
+ font-style: italic;
+}
+
+.hljs-strong {
+ font-weight: bold;
+}
diff --git a/share/src/main/web/lib/highlightjs/highlight-init.js b/share/src/main/web/lib/highlightjs/highlight-init.js
new file mode 100644
index 0000000..0cc359d
--- /dev/null
+++ b/share/src/main/web/lib/highlightjs/highlight-init.js
@@ -0,0 +1 @@
+hljs.initHighlightingOnLoad();
diff --git a/share/src/main/web/lib/highlightjs/highlight.pack.js b/share/src/main/web/lib/highlightjs/highlight.pack.js
new file mode 100644
index 0000000..c322a68
--- /dev/null
+++ b/share/src/main/web/lib/highlightjs/highlight.pack.js
@@ -0,0 +1,1372 @@
+/*
+ Highlight.js 10.5.0 (af20048d)
+ License: BSD-3-Clause
+ Copyright (c) 2006-2020, Ivan Sagalaev
+*/
+var hljs=function(){"use strict";function e(t){
+return t instanceof Map?t.clear=t.delete=t.set=()=>{
+throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{
+throw Error("set is read-only")
+}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{var s=t[n]
+;"object"!=typeof s||Object.isFrozen(s)||e(s)})),t}var t=e,n=e;t.default=n
+;class s{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}
+ignoreMatch(){this.ignore=!0}}function r(e){
+return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")
+}function a(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t]
+;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const i=e=>!!e.kind
+;class o{constructor(e,t){
+this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){
+this.buffer+=r(e)}openNode(e){if(!i(e))return;let t=e.kind
+;e.sublanguage||(t=`${this.classPrefix}${t}`),this.span(t)}closeNode(e){
+i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){
+this.buffer+=``}}class l{constructor(){this.rootNode={
+children:[]},this.stack=[this.rootNode]}get top(){
+return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){
+this.top.children.push(e)}openNode(e){const t={kind:e,children:[]}
+;this.add(t),this.stack.push(t)}closeNode(){
+if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){
+for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}
+walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){
+return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t),
+t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){
+"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{
+l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e}
+addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())}
+addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root
+;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){
+return new o(this,this.options).value()}finalize(){return!0}}function u(e){
+return e?"string"==typeof e?e:e.source:null}
+const g="[a-zA-Z]\\w*",d="[a-zA-Z_]\\w*",h="\\b\\d+(\\.\\d+)?",f="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",p="\\b(0b[01]+)",m={
+begin:"\\\\[\\s\\S]",relevance:0},b={className:"string",begin:"'",end:"'",
+illegal:"\\n",contains:[m]},x={className:"string",begin:'"',end:'"',
+illegal:"\\n",contains:[m]},E={
+begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
+},v=(e,t,n={})=>{const s=a({className:"comment",begin:e,end:t,contains:[]},n)
+;return s.contains.push(E),s.contains.push({className:"doctag",
+begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),s
+},N=v("//","$"),w=v("/\\*","\\*/"),R=v("#","$");var y=Object.freeze({
+__proto__:null,IDENT_RE:g,UNDERSCORE_IDENT_RE:d,NUMBER_RE:h,C_NUMBER_RE:f,
+BINARY_NUMBER_RE:p,
+RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",
+SHEBANG:(e={})=>{const t=/^#![ ]*\//
+;return e.binary&&(e.begin=((...e)=>e.map((e=>u(e))).join(""))(t,/.*\b/,e.binary,/\b.*/)),
+a({className:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{
+0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:m,APOS_STRING_MODE:b,
+QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:E,COMMENT:v,C_LINE_COMMENT_MODE:N,
+C_BLOCK_COMMENT_MODE:w,HASH_COMMENT_MODE:R,NUMBER_MODE:{className:"number",
+begin:h,relevance:0},C_NUMBER_MODE:{className:"number",begin:f,relevance:0},
+BINARY_NUMBER_MODE:{className:"number",begin:p,relevance:0},CSS_NUMBER_MODE:{
+className:"number",
+begin:h+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",
+relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",
+begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[m,{begin:/\[/,end:/\]/,
+relevance:0,contains:[m]}]}]},TITLE_MODE:{className:"title",begin:g,relevance:0
+},UNDERSCORE_TITLE_MODE:{className:"title",begin:d,relevance:0},METHOD_GUARD:{
+begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{
+"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{
+t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function _(e,t){
+"."===e.input[e.index-1]&&t.ignoreMatch()}function k(e,t){
+t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",
+e.__beforeBegin=_,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords)
+}function M(e,t){
+Array.isArray(e.illegal)&&(e.illegal=((...e)=>"("+e.map((e=>u(e))).join("|")+")")(...e.illegal))
+}function O(e,t){if(e.match){
+if(e.begin||e.end)throw Error("begin & end are not supported with match")
+;e.begin=e.match,delete e.match}}function A(e,t){
+void 0===e.relevance&&(e.relevance=1)}
+const L=["of","and","for","in","not","or","if","then","parent","list","value"]
+;function B(e,t){return t?Number(t):(e=>L.includes(e.toLowerCase()))(e)?0:1}
+function I(e,{plugins:t}){function n(t,n){
+return RegExp(u(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))}class s{
+constructor(){
+this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}
+addRule(e,t){
+t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),
+this.matchAt+=(e=>RegExp(e.toString()+"|").exec("").length-1)(e)+1}compile(){
+0===this.regexes.length&&(this.exec=()=>null)
+;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(((e,t="|")=>{
+const n=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;let s=0,r=""
+;for(let a=0;a0&&(r+=t),r+="(";o.length>0;){const e=n.exec(o);if(null==e){r+=o;break}
+r+=o.substring(0,e.index),
+o=o.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+i):(r+=e[0],
+"("===e[0]&&s++)}r+=")"}return r})(e),!0),this.lastIndex=0}exec(e){
+this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e)
+;if(!t)return null
+;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),s=this.matchIndexes[n]
+;return t.splice(0,n),Object.assign(t,s)}}class r{constructor(){
+this.rules=[],this.multiRegexes=[],
+this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){
+if(this.multiRegexes[e])return this.multiRegexes[e];const t=new s
+;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),
+t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){
+return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){
+this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){
+const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex
+;let n=t.exec(e)
+;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{
+const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}
+return n&&(this.regexIndex+=n.position+1,
+this.regexIndex===this.count&&this.considerAll()),n}}
+if(e.compilerExtensions||(e.compilerExtensions=[]),
+e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.")
+;return e.classNameAliases=a(e.classNameAliases||{}),function t(s,i){const o=s
+;if(s.compiled)return o
+;[O].forEach((e=>e(s,i))),e.compilerExtensions.forEach((e=>e(s,i))),
+s.__beforeBegin=null,[k,M,A].forEach((e=>e(s,i))),s.compiled=!0;let l=null
+;if("object"==typeof s.keywords&&(l=s.keywords.$pattern,
+delete s.keywords.$pattern),s.keywords&&(s.keywords=((e,t)=>{const n={}
+;return"string"==typeof e?s("keyword",e):Object.keys(e).forEach((t=>{s(t,e[t])
+})),n;function s(e,s){t&&(s=s.toLowerCase()),s.split(" ").forEach((t=>{
+const s=t.split("|");n[s[0]]=[e,B(s[0],s[1])]}))}
+})(s.keywords,e.case_insensitive)),
+s.lexemes&&l)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ")
+;return l=l||s.lexemes||/\w+/,
+o.keywordPatternRe=n(l,!0),i&&(s.begin||(s.begin=/\B|\b/),
+o.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),
+s.end||s.endsWithParent||(s.end=/\B|\b/),
+s.end&&(o.endRe=n(s.end)),o.terminatorEnd=u(s.end)||"",
+s.endsWithParent&&i.terminatorEnd&&(o.terminatorEnd+=(s.end?"|":"")+i.terminatorEnd)),
+s.illegal&&(o.illegalRe=n(s.illegal)),
+s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>a(e,{
+variants:null},t)))),e.cachedVariants?e.cachedVariants:T(e)?a(e,{
+starts:e.starts?a(e.starts):null
+}):Object.isFrozen(e)?a(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{t(e,o)
+})),s.starts&&t(s.starts,i),o.matcher=(e=>{const t=new r
+;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin"
+}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end"
+}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(o),o}(e)}function T(e){
+return!!e&&(e.endsWithParent||T(e.starts))}function j(e){const t={
+props:["language","code","autodetect"],data:()=>({detectedLanguage:"",
+unknownLanguage:!1}),computed:{className(){
+return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){
+if(!this.autoDetect&&!e.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),
+this.unknownLanguage=!0,r(this.code);let t={}
+;return this.autoDetect?(t=e.highlightAuto(this.code),
+this.detectedLanguage=t.language):(t=e.highlight(this.language,this.code,this.ignoreIllegals),
+this.detectedLanguage=this.language),t.value},autoDetect(){
+return!(this.language&&(e=this.autodetect,!e&&""!==e));var e},
+ignoreIllegals:()=>!0},render(e){return e("pre",{},[e("code",{
+class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{
+Component:t,VuePlugin:{install(e){e.component("highlightjs",t)}}}}const S={
+"after:highlightBlock":({block:e,result:t,text:n})=>{const s=D(e)
+;if(!s.length)return;const a=document.createElement("div")
+;a.innerHTML=t.value,t.value=((e,t,n)=>{let s=0,a="";const i=[];function o(){
+return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function c(e){
+a+=""+P(e)+">"}function u(e){("start"===e.event?l:c)(e.node)}
+for(;e.length||t.length;){let t=o()
+;if(a+=r(n.substring(s,t[0].offset)),s=t[0].offset,t===e){i.reverse().forEach(c)
+;do{u(t.splice(0,1)[0]),t=o()}while(t===e&&t.length&&t[0].offset===s)
+;i.reverse().forEach(l)
+}else"start"===t[0].event?i.push(t[0].node):i.pop(),u(t.splice(0,1)[0])}
+return a+r(n.substr(s))})(s,D(a),n)}};function P(e){
+return e.nodeName.toLowerCase()}function D(e){const t=[];return function e(n,s){
+for(let r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?s+=r.nodeValue.length:1===r.nodeType&&(t.push({
+event:"start",offset:s,node:r}),s=e(r,s),P(r).match(/br|hr|img|input/)||t.push({
+event:"stop",offset:s,node:r}));return s}(e,0),t}const C=e=>{console.error(e)
+},H=(e,...t)=>{console.log("WARN: "+e,...t)},$=(e,t)=>{
+console.log(`Deprecated as of ${e}. ${t}`)},U=r,z=a,K=Symbol("nomatch")
+;return(e=>{const n=Object.create(null),r=Object.create(null),a=[];let i=!0
+;const o=/(^(<[^>]+>|\t|)+|\n)/gm,l="Could not find the language '{}', did you forget to load/include a language module?",u={
+disableAutodetect:!0,name:"Plain text",contains:[]};let g={
+noHighlightRe:/^(no-?highlight)$/i,
+languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",
+tabReplace:null,useBR:!1,languages:null,__emitter:c};function d(e){
+return g.noHighlightRe.test(e)}function h(e,t,n,s){const r={code:t,language:e}
+;_("before:highlight",r);const a=r.result?r.result:f(r.language,r.code,n,s)
+;return a.code=r.code,_("after:highlight",a),a}function f(e,t,r,o){const c=t
+;function u(e,t){const n=w.case_insensitive?t[0].toLowerCase():t[0]
+;return Object.prototype.hasOwnProperty.call(e.keywords,n)&&e.keywords[n]}
+function d(){null!=_.subLanguage?(()=>{if(""===O)return;let e=null
+;if("string"==typeof _.subLanguage){
+if(!n[_.subLanguage])return void M.addText(O)
+;e=f(_.subLanguage,O,!0,k[_.subLanguage]),k[_.subLanguage]=e.top
+}else e=p(O,_.subLanguage.length?_.subLanguage:null)
+;_.relevance>0&&(A+=e.relevance),M.addSublanguage(e.emitter,e.language)
+})():(()=>{if(!_.keywords)return void M.addText(O);let e=0
+;_.keywordPatternRe.lastIndex=0;let t=_.keywordPatternRe.exec(O),n="";for(;t;){
+n+=O.substring(e,t.index);const s=u(_,t);if(s){const[e,r]=s
+;M.addText(n),n="",A+=r;const a=w.classNameAliases[e]||e;M.addKeyword(t[0],a)
+}else n+=t[0];e=_.keywordPatternRe.lastIndex,t=_.keywordPatternRe.exec(O)}
+n+=O.substr(e),M.addText(n)})(),O=""}function h(e){
+return e.className&&M.openNode(w.classNameAliases[e.className]||e.className),
+_=Object.create(e,{parent:{value:_}}),_}function m(e,t,n){let r=((e,t)=>{
+const n=e&&e.exec(t);return n&&0===n.index})(e.endRe,n);if(r){if(e["on:end"]){
+const n=new s(e);e["on:end"](t,n),n.ignore&&(r=!1)}if(r){
+for(;e.endsParent&&e.parent;)e=e.parent;return e}}
+if(e.endsWithParent)return m(e.parent,t,n)}function b(e){
+return 0===_.matcher.regexIndex?(O+=e[0],1):(T=!0,0)}function x(e){
+const t=e[0],n=c.substr(e.index),s=m(_,e,n);if(!s)return K;const r=_
+;r.skip?O+=t:(r.returnEnd||r.excludeEnd||(O+=t),d(),r.excludeEnd&&(O=t));do{
+_.className&&M.closeNode(),_.skip||_.subLanguage||(A+=_.relevance),_=_.parent
+}while(_!==s.parent)
+;return s.starts&&(s.endSameAsBegin&&(s.starts.endRe=s.endRe),
+h(s.starts)),r.returnEnd?0:t.length}let E={};function v(t,n){const a=n&&n[0]
+;if(O+=t,null==a)return d(),0
+;if("begin"===E.type&&"end"===n.type&&E.index===n.index&&""===a){
+if(O+=c.slice(n.index,n.index+1),!i){const t=Error("0 width match regex")
+;throw t.languageName=e,t.badRule=E.rule,t}return 1}
+if(E=n,"begin"===n.type)return function(e){
+const t=e[0],n=e.rule,r=new s(n),a=[n.__beforeBegin,n["on:begin"]]
+;for(const n of a)if(n&&(n(e,r),r.ignore))return b(t)
+;return n&&n.endSameAsBegin&&(n.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),
+n.skip?O+=t:(n.excludeBegin&&(O+=t),
+d(),n.returnBegin||n.excludeBegin||(O=t)),h(n),n.returnBegin?0:t.length}(n)
+;if("illegal"===n.type&&!r){
+const e=Error('Illegal lexeme "'+a+'" for mode "'+(_.className||"")+'"')
+;throw e.mode=_,e}if("end"===n.type){const e=x(n);if(e!==K)return e}
+if("illegal"===n.type&&""===a)return 1
+;if(B>1e5&&B>3*n.index)throw Error("potential infinite loop, way more iterations than matches")
+;return O+=a,a.length}const w=N(e)
+;if(!w)throw C(l.replace("{}",e)),Error('Unknown language: "'+e+'"')
+;const R=I(w,{plugins:a});let y="",_=o||R;const k={},M=new g.__emitter(g);(()=>{
+const e=[];for(let t=_;t!==w;t=t.parent)t.className&&e.unshift(t.className)
+;e.forEach((e=>M.openNode(e)))})();let O="",A=0,L=0,B=0,T=!1;try{
+for(_.matcher.considerAll();;){
+B++,T?T=!1:_.matcher.considerAll(),_.matcher.lastIndex=L
+;const e=_.matcher.exec(c);if(!e)break;const t=v(c.substring(L,e.index),e)
+;L=e.index+t}return v(c.substr(L)),M.closeAllNodes(),M.finalize(),y=M.toHTML(),{
+relevance:A,value:y,language:e,illegal:!1,emitter:M,top:_}}catch(t){
+if(t.message&&t.message.includes("Illegal"))return{illegal:!0,illegalBy:{
+msg:t.message,context:c.slice(L-100,L+100),mode:t.mode},sofar:y,relevance:0,
+value:U(c),emitter:M};if(i)return{illegal:!1,relevance:0,value:U(c),emitter:M,
+language:e,top:_,errorRaised:t};throw t}}function p(e,t){
+t=t||g.languages||Object.keys(n);const s=(e=>{const t={relevance:0,
+emitter:new g.__emitter(g),value:U(e),illegal:!1,top:u}
+;return t.emitter.addText(e),t})(e),r=t.filter(N).filter(R).map((t=>f(t,e,!1)))
+;r.unshift(s);const a=r.sort(((e,t)=>{
+if(e.relevance!==t.relevance)return t.relevance-e.relevance
+;if(e.language&&t.language){if(N(e.language).supersetOf===t.language)return 1
+;if(N(t.language).supersetOf===e.language)return-1}return 0})),[i,o]=a,l=i
+;return l.second_best=o,l}const m={"before:highlightBlock":({block:e})=>{
+g.useBR&&(e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/
/g,"\n"))
+},"after:highlightBlock":({result:e})=>{
+g.useBR&&(e.value=e.value.replace(/\n/g,"
"))}},b=/^(<[^>]+>|\t)+/gm,x={
+"after:highlightBlock":({result:e})=>{
+g.tabReplace&&(e.value=e.value.replace(b,(e=>e.replace(/\t/g,g.tabReplace))))}}
+;function E(e){let t=null;const n=(e=>{let t=e.className+" "
+;t+=e.parentNode?e.parentNode.className:"";const n=g.languageDetectRe.exec(t)
+;if(n){const t=N(n[1])
+;return t||(H(l.replace("{}",n[1])),H("Falling back to no-highlight mode for this block.",e)),
+t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>d(e)||N(e)))})(e)
+;if(d(n))return;_("before:highlightBlock",{block:e,language:n}),t=e
+;const s=t.textContent,a=n?h(n,s,!0):p(s);_("after:highlightBlock",{block:e,
+result:a,text:s}),e.innerHTML=a.value,((e,t,n)=>{const s=t?r[t]:n
+;e.classList.add("hljs"),s&&e.classList.add(s)})(e,n,a.language),e.result={
+language:a.language,re:a.relevance,relavance:a.relevance
+},a.second_best&&(e.second_best={language:a.second_best.language,
+re:a.second_best.relevance,relavance:a.second_best.relevance})}const v=()=>{
+v.called||(v.called=!0,document.querySelectorAll("pre code").forEach(E))}
+;function N(e){return e=(e||"").toLowerCase(),n[e]||n[r[e]]}
+function w(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{r[e]=t
+}))}function R(e){const t=N(e);return t&&!t.disableAutodetect}function _(e,t){
+const n=e;a.forEach((e=>{e[n]&&e[n](t)}))}Object.assign(e,{highlight:h,
+highlightAuto:p,fixMarkup:e=>{
+return $("10.2.0","fixMarkup will be removed entirely in v11.0"),
+$("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),
+t=e,
+g.tabReplace||g.useBR?t.replace(o,(e=>"\n"===e?g.useBR?"
":e:g.tabReplace?e.replace(/\t/g,g.tabReplace):e)):t
+;var t},highlightBlock:E,configure:e=>{
+e.useBR&&($("10.3.0","'useBR' will be removed entirely in v11.0"),
+$("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),
+g=z(g,e)},initHighlighting:v,initHighlightingOnLoad:()=>{
+window.addEventListener("DOMContentLoaded",v,!1)},registerLanguage:(t,s)=>{
+let r=null;try{r=s(e)}catch(e){
+if(C("Language definition for '{}' could not be registered.".replace("{}",t)),
+!i)throw e;C(e),r=u}
+r.name||(r.name=t),n[t]=r,r.rawDefinition=s.bind(null,e),r.aliases&&w(r.aliases,{
+languageName:t})},listLanguages:()=>Object.keys(n),getLanguage:N,
+registerAliases:w,requireLanguage:e=>{
+$("10.4.0","requireLanguage will be removed entirely in v11."),
+$("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844")
+;const t=N(e);if(t)return t
+;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},
+autoDetection:R,inherit:z,addPlugin:e=>{a.push(e)},vuePlugin:j(e).VuePlugin
+}),e.debugMode=()=>{i=!1},e.safeMode=()=>{i=!0},e.versionString="10.5.0"
+;for(const e in y)"object"==typeof y[e]&&t(y[e])
+;return Object.assign(e,y),e.addPlugin(m),e.addPlugin(S),e.addPlugin(x),e})({})
+}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){
+return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s
+})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{
+begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{
+begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={
+className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={
+begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/,
+end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/,
+contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/,
+end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n]
+},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10
+}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,
+contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{
+name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,
+keyword:"if then else elif fi for while in do done case esac function",
+literal:"true false",
+built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"
+},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/
+},{className:"string",begin:/'/,end:/'/},n]}}})());hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={
+className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/}
+;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,
+contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/,
+contains:[n,{className:"number",begin:/:\d{1,5}/
+},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",
+begin:/\w+/,relevance:0,keywords:{
+nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"
+},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},
+contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable",
+begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}]
+},n,{className:"number",begin:/\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}
+})());hljs.registerLanguage("ruby",(()=>{"use strict";function e(...e){
+return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n
+})).join("")}return n=>{
+var a,i="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",s={
+keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__",
+built_in:"proc lambda",literal:"true false nil"},r={className:"doctag",
+begin:"@[A-Za-z]+"},b={begin:"#<",end:">"},t=[n.COMMENT("#","$",{contains:[r]
+}),n.COMMENT("^=begin","^=end",{contains:[r],relevance:10
+}),n.COMMENT("^__END__","\\n$")],c={className:"subst",begin:/#\{/,end:/\}/,
+keywords:s},d={className:"string",contains:[n.BACKSLASH_ESCAPE,c],variants:[{
+begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,
+end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{
+begin:/%[qQwWx]?,end:/>/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,
+end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{
+begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{
+begin:/<<[-~]?'?(\w+)\n(?:[^\n]*\n)*?\s*\1\b/,returnBegin:!0,contains:[{
+begin:/<<[-~]?'?/},n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,
+contains:[n.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",l={className:"number",
+relevance:0,variants:[{
+begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{
+begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"
+},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{
+begin:"\\b0(_?[0-7])+r?i?\\b"}]},o={className:"params",begin:"\\(",end:"\\)",
+endsParent:!0,keywords:s},_=[d,{className:"class",beginKeywords:"class module",
+end:"$|;",illegal:/=/,contains:[n.inherit(n.TITLE_MODE,{
+begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{
+begin:"("+n.IDENT_RE+"::)?"+n.IDENT_RE}]}].concat(t)},{className:"function",
+begin:e(/def\s*/,(a=i+"\\s*(\\(|;|$)",e("(?=",a,")"))),keywords:"def",end:"$|;",
+contains:[n.inherit(n.TITLE_MODE,{begin:i}),o].concat(t)},{begin:n.IDENT_RE+"::"
+},{className:"symbol",begin:n.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{
+className:"symbol",begin:":(?!\\s)",contains:[d,{begin:i}],relevance:0},l,{
+className:"variable",
+begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{
+className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:s},{
+begin:"("+n.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{
+className:"regexp",contains:[n.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{
+begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",
+end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]
+}].concat(b,t),relevance:0}].concat(b,t);c.contains=_,o.contains=_;var E=[{
+begin:/^\s*=>/,starts:{end:"$",contains:_}},{className:"meta",
+begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])",
+starts:{end:"$",contains:_}}];return t.unshift(b),{name:"Ruby",
+aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/,
+contains:[n.SHEBANG({binary:"ruby"})].concat(E).concat(t).concat(_)}}})());hljs.registerLanguage("coffeescript",(()=>{"use strict"
+;const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"])
+;return r=>{const t={
+keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((i=["var","const","let","function","static"],
+e=>!i.includes(e))).join(" "),
+literal:n.concat(["yes","no","on","off"]).join(" "),
+built_in:a.concat(["npm","print"]).join(" ")};var i
+;const s="[A-Za-z$_][0-9A-Za-z$_]*",o={className:"subst",begin:/#\{/,end:/\}/,
+keywords:t},c=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{
+end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,
+end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,
+contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,
+contains:[r.BACKSLASH_ESCAPE,o]},{begin:/"/,end:/"/,
+contains:[r.BACKSLASH_ESCAPE,o]}]},{className:"regexp",variants:[{begin:"///",
+end:"///",contains:[o,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",
+relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+s
+},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{
+begin:"```",end:"```"},{begin:"`",end:"`"}]}];o.contains=c
+;const l=r.inherit(r.TITLE_MODE,{begin:s}),d="(\\(.*\\)\\s*)?\\B[-=]>",g={
+className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,
+end:/\)/,keywords:t,contains:["self"].concat(c)}]};return{name:"CoffeeScript",
+aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,
+contains:c.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{
+className:"function",begin:"^\\s*"+s+"\\s*=\\s*"+d,end:"[-=]>",returnBegin:!0,
+contains:[l,g]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",
+begin:d,end:"[-=]>",returnBegin:!0,contains:[g]}]},{className:"class",
+beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{
+beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[l]},l]
+},{begin:s+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}})());hljs.registerLanguage("kotlin",(()=>{"use strict"
+;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={
+className:"number",variants:[{
+begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`
+},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{
+begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{
+begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`
+},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{
+begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],
+relevance:0};return e=>{const n={
+keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",
+built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",
+literal:"true false null"},i={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"
+},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},t={
+className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string",
+variants:[{begin:'"""',end:'"""(?=[^"])',contains:[t,s]},{begin:"'",end:"'",
+illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,
+contains:[e.BACKSLASH_ESCAPE,t,s]}]};s.contains.push(r);const l={
+className:"meta",
+begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"
+},c={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,
+end:/\)/,contains:[e.inherit(r,{className:"meta-string"})]}]
+},o=a,b=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),E={
+variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,
+contains:[]}]},d=E;return d.variants[1].contains=[E],E.variants[1].contains=[d],
+{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{
+relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]
+}),e.C_LINE_COMMENT_MODE,b,{className:"keyword",
+begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",
+begin:/@\w+/}]}},i,l,c,{className:"function",beginKeywords:"fun",end:"[(]|$",
+returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{
+begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,
+contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/,end:/>/,
+keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,
+endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,
+endsWithParent:!0,contains:[E,e.C_LINE_COMMENT_MODE,b],relevance:0
+},e.C_LINE_COMMENT_MODE,b,l,c,r,e.C_NUMBER_MODE]},b]},{className:"class",
+beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,
+illegal:"extends implements",contains:[{
+beginKeywords:"public protected internal private constructor"
+},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/,end:/>/,excludeBegin:!0,
+excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,
+excludeBegin:!0,returnEnd:!0},l,c]},r,{className:"meta",begin:"^#!/usr/bin/env",
+end:"$",illegal:"\n"},o]}}})());hljs.registerLanguage("java",(()=>{"use strict"
+;var e="\\.([0-9](_*[0-9])*)",n="[0-9a-fA-F](_*[0-9a-fA-F])*",a={
+className:"number",variants:[{
+begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`
+},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{
+begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{
+begin:`\\b0[xX]((${n})\\.?|(${n})?\\.(${n}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b`
+},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${n})[lL]?\\b`},{
+begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],
+relevance:0};return e=>{
+var n="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s={
+className:"meta",begin:"@[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",
+contains:[{begin:/\(/,end:/\)/,contains:["self"]}]};const r=a;return{
+name:"Java",aliases:["jsp"],keywords:n,illegal:/<\/|#/,
+contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,
+relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{
+begin:/import java\.[a-z]+\./,keywords:"import",relevance:2
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{
+className:"class",beginKeywords:"class interface enum",end:/[{;=]/,
+excludeEnd:!0,keywords:"class interface enum",illegal:/[:"\[\]]/,contains:[{
+beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{
+beginKeywords:"new throw return else",relevance:0},{className:"class",
+begin:"record\\s+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,excludeEnd:!0,
+end:/[{;=]/,keywords:n,contains:[{beginKeywords:"record"},{
+begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,
+contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,
+keywords:n,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE]
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"function",
+begin:"([\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(<[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",
+returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:n,contains:[{
+begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,
+contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,
+keywords:n,relevance:0,
+contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE]
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},r,s]}}})());hljs.registerLanguage("r",(()=>{"use strict";function e(...e){return e.map((e=>{
+return(a=e)?"string"==typeof a?a:a.source:null;var a})).join("")}return a=>{
+const n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/;return{name:"R",
+illegal:/->/,keywords:{$pattern:n,
+keyword:"function if in break next repeat else for while",
+literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",
+built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"
+},compilerExtensions:[(a,n)=>{if(!a.beforeMatch)return
+;if(a.starts)throw Error("beforeMatch cannot be used with starts")
+;const i=Object.assign({},a);Object.keys(a).forEach((e=>{delete a[e]
+})),a.begin=e(i.beforeMatch,e("(?=",i.begin,")")),a.starts={relevance:0,
+contains:[Object.assign(i,{endsParent:!0})]},a.relevance=0,delete i.beforeMatch
+}],contains:[a.COMMENT(/#'/,/$/,{contains:[{className:"doctag",
+begin:"@examples",starts:{contains:[{begin:/\n/},{begin:/#'\s*(?=@[a-zA-Z]+)/,
+endsParent:!0},{begin:/#'/,end:/$/,excludeBegin:!0}]}},{className:"doctag",
+begin:"@param",end:/$/,contains:[{className:"variable",variants:[{begin:n},{
+begin:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{className:"doctag",
+begin:/@[a-zA-Z]+/},{className:"meta-keyword",begin:/\\[a-zA-Z]+/}]
+}),a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE],
+variants:[a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/
+}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/
+}),a.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/
+}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/
+}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/
+}),a.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',
+relevance:0},{begin:"'",end:"'",relevance:0}]},{className:"number",relevance:0,
+beforeMatch:/([^a-zA-Z0-9._])/,variants:[{
+match:/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/},{
+match:/0[xX][0-9a-fA-F]+([pP][+-]?\d+)?[Li]?/},{
+match:/(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?[Li]?/}]},{begin:"%",end:"%"},{
+begin:e(/[a-zA-Z][a-zA-Z_0-9]*/,"\\s+<-\\s+")},{begin:"`",end:"`",contains:[{
+begin:/\\./}]}]}}})());hljs.registerLanguage("perl",(()=>{"use strict";function e(...e){
+return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n
+})).join("")}return n=>{const t=/[dualxmsipn]{0,12}/,s={$pattern:/[\w.]+/,
+keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"
+},r={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},i={begin:/->\{/,
+end:/\}/},a={variants:[{begin:/\$\d/},{
+begin:e(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")
+},{begin:/[$%@][^\s\w{]/,relevance:0}]
+},o=[n.BACKSLASH_ESCAPE,r,a],c=[a,n.HASH_COMMENT_MODE,n.COMMENT(/^=\w/,/=cut/,{
+endsWithParent:!0}),i,{className:"string",contains:o,variants:[{
+begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",
+end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{
+begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",
+relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",
+contains:[n.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",
+contains:[n.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,contains:[],relevance:0},{
+begin:"-?\\w+\\s*=>",contains:[],relevance:0}]},{className:"number",
+begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",
+relevance:0},{
+begin:"(\\/\\/|"+n.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",
+keywords:"split return print reverse grep",relevance:0,
+contains:[n.HASH_COMMENT_MODE,{className:"regexp",
+begin:e(/(s|tr|y)/,/\//,/(\\.|[^\\\/])*/,/\//,/(\\.|[^\\\/])*/,/\//,t),
+relevance:10},{className:"regexp",begin:/(m|qr)?\//,end:e(/\//,t),
+contains:[n.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",
+beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,
+contains:[n.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",
+end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",
+className:"comment"}]}];return r.contains=c,i.contains=c,{name:"Perl",
+aliases:["pl","pm"],keywords:s,contains:c}}})());hljs.registerLanguage("typescript",(()=>{"use strict"
+;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"])
+;function t(e){return i("(?=",e,")")}function i(...e){return e.map((e=>{
+return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return r=>{
+const c={$pattern:e,
+keyword:n.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),
+literal:a.join(" "),
+built_in:s.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")
+},o={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},l=(e,n,a)=>{
+const s=e.contains.findIndex((e=>e.label===n))
+;if(-1===s)throw Error("can not find mode to replace");e.contains.splice(s,1,a)
+},b=(r=>{const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,
+end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{
+const a=e[0].length+e.index,s=e.input[a];"<"!==s?">"===s&&(((e,{after:n})=>{
+const a=""+e[0].slice(1);return-1!==e.input.indexOf(a,n)})(e,{after:a
+})||n.ignoreMatch()):n.ignoreMatch()}},l={$pattern:e,keyword:n.join(" "),
+literal:a.join(" "),built_in:s.join(" ")
+},b="\\.([0-9](_?[0-9])*)",d="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",g={
+className:"number",variants:[{
+begin:`(\\b(${d})((${b})|\\.)?|(${b}))[eE][+-]?([0-9](_?[0-9])*)\\b`},{
+begin:`\\b(${d})\\b((${b})\\b|\\.)?|(${b})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},u={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:l,contains:[]},E={begin:"html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,u],subLanguage:"xml"}},m={
+begin:"css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[r.BACKSLASH_ESCAPE,u],subLanguage:"css"}},_={className:"string",
+begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,u]},y={className:"comment",
+variants:[r.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",
+end:"\\}",relevance:0},{className:"variable",begin:c+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),r.C_BLOCK_COMMENT_MODE,r.C_LINE_COMMENT_MODE]
+},p=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,E,m,_,g,r.REGEXP_MODE]
+;u.contains=p.concat({begin:/\{/,end:/\}/,keywords:l,contains:["self"].concat(p)
+});const N=[].concat(y,u.contains),f=N.concat([{begin:/\(/,end:/\)/,keywords:l,
+contains:["self"].concat(N)}]),A={className:"params",begin:/\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f};return{name:"Javascript",
+aliases:["js","jsx","mjs","cjs"],keywords:l,exports:{PARAMS_CONTAINS:f},
+illegal:/#(?![$_A-z])/,contains:[r.SHEBANG({label:"shebang",binary:"node",
+relevance:5}),{label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,E,m,_,y,g,{
+begin:i(/[{,\n]\s*/,t(i(/(((\/\/.*$)|(\/\*(\*[^/]|[^*])*\*\/))\s*)*/,c+"\\s*:"))),
+relevance:0,contains:[{className:"attr",begin:c+t("\\s*:"),relevance:0}]},{
+begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",contains:[y,r.REGEXP_MODE,{className:"function",
+begin:"(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",
+returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{
+begin:r.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0
+},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:f}]}]
+},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{
+variants:[{begin:"<>",end:">"},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,
+end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0,
+contains:["self"]}]}],relevance:0},{className:"function",
+beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l,
+contains:["self",r.inherit(r.TITLE_MODE,{begin:c}),A],illegal:/%/},{
+beginKeywords:"while if switch catch for"},{className:"function",
+begin:r.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,contains:[A,r.inherit(r.TITLE_MODE,{begin:c})]},{variants:[{
+begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class",
+beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{
+beginKeywords:"extends"},r.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,
+end:/[{;]/,excludeEnd:!0,contains:[r.inherit(r.TITLE_MODE,{begin:c}),"self",A]
+},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set",
+contains:[r.inherit(r.TITLE_MODE,{begin:c}),{begin:/\(\)/},A]},{begin:/\$[(.]/}]
+}})(r)
+;return Object.assign(b.keywords,c),b.exports.PARAMS_CONTAINS.push(o),b.contains=b.contains.concat([o,{
+beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",
+end:/\{/,excludeEnd:!0,keywords:"interface extends"
+}]),l(b,"shebang",r.SHEBANG()),l(b,"use_strict",{className:"meta",relevance:10,
+begin:/^\s*['"]use strict['"]/
+}),b.contains.find((e=>"function"===e.className)).relevance=0,Object.assign(b,{
+name:"TypeScript",aliases:["ts"]}),b}})());hljs.registerLanguage("javascript",(()=>{"use strict"
+;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],s=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"])
+;function r(e){return i("(?=",e,")")}function i(...e){return e.map((e=>{
+return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return t=>{
+const c=e,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,
+isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,s=e.input[a]
+;"<"!==s?">"===s&&(((e,{after:n})=>{const a=""+e[0].slice(1)
+;return-1!==e.input.indexOf(a,n)})(e,{after:a
+})||n.ignoreMatch()):n.ignoreMatch()}},l={$pattern:e,keyword:n.join(" "),
+literal:a.join(" "),built_in:s.join(" ")
+},b="\\.([0-9](_?[0-9])*)",g="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",d={
+className:"number",variants:[{
+begin:`(\\b(${g})((${b})|\\.)?|(${b}))[eE][+-]?([0-9](_?[0-9])*)\\b`},{
+begin:`\\b(${g})\\b((${b})\\b|\\.)?|(${b})\\b`},{
+begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{
+begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{
+begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{
+begin:"\\b0[0-7]+n?\\b"}],relevance:0},E={className:"subst",begin:"\\$\\{",
+end:"\\}",keywords:l,contains:[]},u={begin:"html`",end:"",starts:{end:"`",
+returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},_={
+begin:"css`",end:"",starts:{end:"`",returnEnd:!1,
+contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},m={className:"string",
+begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]},N={className:"comment",
+variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{
+className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",
+end:"\\}",relevance:0},{className:"variable",begin:c+"(?=\\s*(-)|$)",
+endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]
+}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]
+},y=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,u,_,m,d,t.REGEXP_MODE]
+;E.contains=y.concat({begin:/\{/,end:/\}/,keywords:l,contains:["self"].concat(y)
+});const f=[].concat(N,E.contains),A=f.concat([{begin:/\(/,end:/\)/,keywords:l,
+contains:["self"].concat(f)}]),p={className:"params",begin:/\(/,end:/\)/,
+excludeBegin:!0,excludeEnd:!0,keywords:l,contains:A};return{name:"Javascript",
+aliases:["js","jsx","mjs","cjs"],keywords:l,exports:{PARAMS_CONTAINS:A},
+illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",
+relevance:5}),{label:"use_strict",className:"meta",relevance:10,
+begin:/^\s*['"]use (strict|asm)['"]/
+},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,u,_,m,N,d,{
+begin:i(/[{,\n]\s*/,r(i(/(((\/\/.*$)|(\/\*(\*[^/]|[^*])*\*\/))\s*)*/,c+"\\s*:"))),
+relevance:0,contains:[{className:"attr",begin:c+r("\\s*:"),relevance:0}]},{
+begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",
+keywords:"return throw case",contains:[N,t.REGEXP_MODE,{className:"function",
+begin:"(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",
+returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{
+begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0
+},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:A}]}]
+},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{
+variants:[{begin:"<>",end:">"},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,
+end:o.end}],subLanguage:"xml",contains:[{begin:o.begin,end:o.end,skip:!0,
+contains:["self"]}]}],relevance:0},{className:"function",
+beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:l,
+contains:["self",t.inherit(t.TITLE_MODE,{begin:c}),p],illegal:/%/},{
+beginKeywords:"while if switch catch for"},{className:"function",
+begin:t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",
+returnBegin:!0,contains:[p,t.inherit(t.TITLE_MODE,{begin:c})]},{variants:[{
+begin:"\\."+c},{begin:"\\$"+c}],relevance:0},{className:"class",
+beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{
+beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,
+end:/[{;]/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:c}),"self",p]
+},{begin:"(get|set)\\s+(?="+c+"\\()",end:/\{/,keywords:"get set",
+contains:[t.inherit(t.TITLE_MODE,{begin:c}),{begin:/\(\)/},p]},{begin:/\$[(.]/}]
+}}})());hljs.registerLanguage("python",(()=>{"use strict";return e=>{const n={
+keyword:"and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal|10 not or pass raise return try while with yield",
+built_in:"__import__ abs all any ascii bin bool breakpoint bytearray bytes callable chr classmethod compile complex delattr dict dir divmod enumerate eval exec filter float format frozenset getattr globals hasattr hash help hex id input int isinstance issubclass iter len list locals map max memoryview min next object oct open ord pow print property range repr reversed round set setattr slice sorted staticmethod str sum super tuple type vars zip",
+literal:"__debug__ Ellipsis False None NotImplemented True"},a={
+className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/,
+end:/\}/,keywords:n,illegal:/#/},i={begin:/\{\{/,relevance:0},r={
+className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{
+begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,
+contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{
+begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,
+contains:[e.BACKSLASH_ESCAPE,a,i,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,
+end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,i,s]},{begin:/([uU]|[rR])'/,end:/'/,
+relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{
+begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,
+end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,
+contains:[e.BACKSLASH_ESCAPE,i,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,
+contains:[e.BACKSLASH_ESCAPE,i,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]
+},t="[0-9](_?[0-9])*",l=`(\\b(${t}))?\\.(${t})|\\b(${t})\\.`,b={
+className:"number",relevance:0,variants:[{
+begin:`(\\b(${t})|(${l}))[eE][+-]?(${t})[jJ]?\\b`},{begin:`(${l})[jJ]?`},{
+begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{
+begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{
+begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${t})[jJ]\\b`}]},o={
+className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{
+begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,
+contains:["self",a,b,r,e.HASH_COMMENT_MODE]}]};return s.contains=[r,b,a],{
+name:"Python",aliases:["py","gyp","ipython"],keywords:n,
+illegal:/(<\/|->|\?)|=>/,contains:[a,b,{begin:/\bself\b/},{beginKeywords:"if",
+relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",
+beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,
+illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,o,{begin:/->/,
+endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,
+end:/(?=#)|$/,contains:[b,o,r]},{begin:/\b(print|exec)\(/}]}}})());hljs.registerLanguage("http",(()=>{"use strict";function e(...e){
+return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n
+})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s=[{className:"attribute",
+begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{
+className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}
+},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{
+name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})",
+end:/$/,contains:[{className:"meta",begin:a},{className:"number",
+begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:s}},{
+begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string",
+begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{
+className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:s}
+}]}}})());hljs.registerLanguage("dockerfile",(()=>{"use strict";return e=>({
+name:"Dockerfile",aliases:["docker"],case_insensitive:!0,
+keywords:"from maintainer expose env arg user onbuild stopsignal",
+contains:[e.HASH_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{
+beginKeywords:"run cmd entrypoint volume add copy workdir label healthcheck shell",
+starts:{end:/[^\\]$/,subLanguage:"bash"}}],illegal:""})})());hljs.registerLanguage("objectivec",(()=>{"use strict";return e=>{
+const n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,
+keyword:"@interface @class @protocol @implementation"};return{
+name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],
+keywords:{$pattern:n,
+keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",
+literal:"false true FALSE TRUE nil YES NO NULL",
+built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"
+},illegal:"",contains:[{className:"built_in",
+begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"
+},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{
+className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",
+contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,
+keywords:{
+"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"
+},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{
+className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,
+illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{
+className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:/(\{|$)/,
+excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{
+begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}})());hljs.registerLanguage("gradle",(()=>{"use strict";return e=>({name:"Gradle",
+case_insensitive:!0,keywords:{
+keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"
+},
+contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,e.REGEXP_MODE]
+})})());hljs.registerLanguage("xml",(()=>{"use strict";function e(e){
+return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")}
+function a(...n){return n.map((n=>e(n))).join("")}function s(...n){
+return"("+n.map((n=>e(n))).join("|")+")"}return e=>{
+const t=a(/[A-Z_]/,a("(",/[A-Z0-9_.-]+:/,")?"),/[A-Z0-9_.-]*/),i={
+className:"symbol",begin:/&[a-z]+;|[0-9]+;|[a-f0-9]+;/},r={begin:/\s/,
+contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]
+},c=e.inherit(r,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{
+className:"meta-string"}),g=e.inherit(e.QUOTE_STRING_MODE,{
+className:"meta-string"}),m={endsWithParent:!0,illegal:/,relevance:0,
+contains:[{className:"attr",begin:/[A-Za-z0-9._:-]+/,relevance:0},{begin:/=\s*/,
+relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,
+end:/"/,contains:[i]},{begin:/'/,end:/'/,contains:[i]},{begin:/[^\s"'=<>`]+/}]}]
+}]};return{name:"HTML, XML",
+aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],
+case_insensitive:!0,contains:[{className:"meta",begin://,
+relevance:10,contains:[r,g,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta",
+begin://,contains:[r,c,g,l]}]}]},e.COMMENT(//,{
+relevance:10}),{begin://,relevance:10},i,{
+className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",
+begin:/